324 {
325
326 const uint64_t F4 = 331804471;
327 const uint64_t G4 = 593549882;
328
329
330
331 uint32_t s = (((uint64_t)
x + (uint64_t)
y + (uint64_t)
z + (uint64_t)w) * F4) >> 32;
332 uint32_t i = ((
x>>2) + s) >> 10;
333 uint32_t j = ((
y>>2) + s) >> 10;
334 uint32_t k = ((
z>>2) + s) >> 10;
335 uint32_t l = ((w>>2) + s) >> 10;
336
337 uint64_t t = (((uint64_t)i + (uint64_t)j + (uint64_t)k + (uint64_t)l) * G4) >> 18;
338 uint64_t X0 = ((uint64_t)i<<14) - t;
339 uint64_t Y0 = ((uint64_t)j<<14) - t;
340 uint64_t Z0 = ((uint64_t)k<<14) - t;
341 uint64_t
W0 = ((uint64_t)l<<14) - t;
342 int32_t x0 = ((uint64_t)
x<<2) - X0;
343 int32_t y0 = ((uint64_t)
y<<2) - Y0;
344 int32_t z0 = ((uint64_t)
z<<2) - Z0;
345 int32_t w0 = ((uint64_t)w<<2) -
W0;
346
347
348
349
350
351
352
353
354
355 int c = 0;
356 if (x0 > y0) {
357 c += 32;
358 }
359 if (x0 > z0) {
360 c += 16;
361 }
362 if (y0 > z0) {
363 c += 8;
364 }
365 if (x0 > w0) {
366 c += 4;
367 }
368 if (y0 > w0) {
369 c += 2;
370 }
371 if (z0 > w0) {
372 c += 1;
373 }
374
375
376
377
378
379
380
381 uint32_t i1 =
simplex[c][0] >= 3 ? 1 : 0;
382 uint32_t j1 =
simplex[c][1] >= 3 ? 1 : 0;
383 uint32_t k1 =
simplex[c][2] >= 3 ? 1 : 0;
384 uint32_t l1 =
simplex[c][3] >= 3 ? 1 : 0;
385
386
387 uint32_t i2 =
simplex[c][0] >= 2 ? 1 : 0;
388 uint32_t j2 =
simplex[c][1] >= 2 ? 1 : 0;
389 uint32_t k2 =
simplex[c][2] >= 2 ? 1 : 0;
390 uint32_t l2 =
simplex[c][3] >= 2 ? 1 : 0;
391
392
393 uint32_t i3 =
simplex[c][0] >= 1 ? 1 : 0;
394 uint32_t j3 =
simplex[c][1] >= 1 ? 1 : 0;
395 uint32_t k3 =
simplex[c][2] >= 1 ? 1 : 0;
396 uint32_t l3 =
simplex[c][3] >= 1 ? 1 : 0;
397
398
399 int32_t x1 = x0 - ((int32_t)i1<<14) + (int32_t)(G4>>18);
400 int32_t y1 = y0 - ((int32_t)j1<<14) + (int32_t)(G4>>18);
401 int32_t z1 = z0 - ((int32_t)k1<<14) + (int32_t)(G4>>18);
402 int32_t w1 = w0 - ((int32_t)l1<<14) + (int32_t)(G4>>18);
403 int32_t x2 = x0 - ((int32_t)i2<<14) + (int32_t)(2*G4>>18);
404 int32_t y2 = y0 - ((int32_t)j2<<14) + (int32_t)(2*G4>>18);
405 int32_t z2 = z0 - ((int32_t)k2<<14) + (int32_t)(2*G4>>18);
406 int32_t w2 = w0 - ((int32_t)l2<<14) + (int32_t)(2*G4>>18);
407 int32_t x3 = x0 - ((int32_t)i3<<14) + (int32_t)(3*G4>>18);
408 int32_t y3 = y0 - ((int32_t)j3<<14) + (int32_t)(3*G4>>18);
409 int32_t z3 = z0 - ((int32_t)k3<<14) + (int32_t)(3*G4>>18);
410 int32_t w3 = w0 - ((int32_t)l3<<14) + (int32_t)(3*G4>>18);
411 int32_t x4 = x0 - (1 << 14) + (int32_t)(4*G4>>18);
412 int32_t y4 = y0 - (1 << 14) + (int32_t)(4*G4>>18);
413 int32_t z4 = z0 - (1 << 14) + (int32_t)(4*G4>>18);
414 int32_t w4 = w0 - (1 << 14) + (int32_t)(4*G4>>18);
415
416 int32_t n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0;
417 const int32_t fix0_6 = 161061274;
418
419
420 int32_t t0 = (fix0_6 - x0*x0 - y0*y0 - z0*z0 - w0*w0) >> 12;
421 if (t0 > 0) {
422 t0 = (t0 * t0) >> 16;
423 t0 = (t0 * t0) >> 16;
424
425 n0 = t0 *
grad(
P((i+(uint32_t)(
P((j+(uint32_t)(
P((k+(uint32_t)(
P(l&0xff)))&0xff)))&0xff)))&0xff), x0, y0, z0, w0);
426 }
427
428 int32_t t1 = (fix0_6 - x1*x1 - y1*y1 - z1*z1 - w1*w1) >> 12;
429 if (t1 > 0) {
430 t1 = (t1 * t1) >> 16;
431 t1 = (t1 * t1) >> 16;
432
433 n1 = t1 *
grad(
P((i+i1+(uint32_t)(
P((j+j1+(uint32_t)(
P((k+k1+(uint32_t)(
P((l+l1)&0xff)))&0xff)))&0xff)))&0xff), x1, y1, z1, w1);
434 }
435
436 int32_t t2 = (fix0_6 - x2*x2 - y2*y2 - z2*z2 - w2*w2) >> 12;
437 if (t2 > 0) {
438 t2 = (t2 * t2) >> 16;
439 t2 = (t2 * t2) >> 16;
440
441 n2 = t2 *
grad(
P((i+i2+(uint32_t)(
P((j+j2+(uint32_t)(
P((k+k2+(uint32_t)(
P((l+l2)&0xff)))&0xff)))&0xff)))&0xff), x2, y2, z2, w2);
442 }
443
444 int32_t t3 = (fix0_6 - x3*x3 - y3*y3 - z3*z3 - w3*w3) >> 12;
445 if (t3 > 0) {
446 t3 = (t3 * t3) >> 16;
447 t3 = (t3 * t3) >> 16;
448
449 n3 = t3 *
grad(
P((i+i3+(uint32_t)(
P((j+j3+(uint32_t)(
P((k+k3+(uint32_t)(
P((l+l3)&0xff)))&0xff)))&0xff)))&0xff), x3, y3, z3, w3);
450 }
451
452 int32_t t4 = (fix0_6 - x4*x4 - y4*y4 - z4*z4 - w4*w4) >> 12;
453 if (t4 > 0) {
454 t4 = (t4 * t4) >> 16;
455 t4 = (t4 * t4) >> 16;
456
457 n4 = t4 *
grad(
P((i+1+(uint32_t)(
P((j+1+(uint32_t)(
P((k+1+(uint32_t)(
P((l+1)&0xff)))&0xff)))&0xff)))&0xff), x4, y4, z4, w4);
458 }
459
460 int32_t n = n0 + n1 + n2 + n3 + n4;
461 n = ((n >> 8) * 13832) >> 16;
462 return uint16_t(n) + 0x8000;
463}
static int32_t grad(uint8_t hash, int32_t x)
static uint8_t const simplex[64][4]