341 {
342
343 uint8_t X = (
x >> 16) & 0xFF;
344 uint8_t Y = (
y >> 16) & 0xFF;
345 uint8_t Z = (
z >> 16) & 0xFF;
346 uint8_t T = (
t >> 16) & 0xFF;
347
348
349 uint16_t u =
x & 0xFFFF;
350 uint16_t v =
y & 0xFFFF;
351 uint16_t w =
z & 0xFFFF;
352 uint16_t s =
t & 0xFFFF;
353
354
355 u = EASE16(u);
356 v = EASE16(v);
357 w = EASE16(w);
358 s = EASE16(s);
359
360 uint16_t N = 0x8000L;
361
362
363 int16_t xx = (u >> 1) & 0x7FFF;
364 int16_t yy = (v >> 1) & 0x7FFF;
365 int16_t zz = (w >> 1) & 0x7FFF;
366
367
370 uint8_t AB =
NOISE_P(A + 1) + Z;
371 uint8_t B =
NOISE_P(X + 1) + Y;
373 uint8_t BB =
NOISE_P(B + 1) + Z;
374
375
377 uint8_t AAB =
NOISE_P(AA + 1) + T;
379 uint8_t ABB =
NOISE_P(AB + 1) + T;
381 uint8_t BAB =
NOISE_P(BA + 1) + T;
383 uint8_t BBB =
NOISE_P(BB + 1) + T;
384
385 int16_t L1 = LERP(
grad16(AAA, xx, yy, zz),
grad16(BAA, xx - N, yy, zz), u);
386 int16_t L2 = LERP(
grad16(ABA, xx, yy - N, zz),
grad16(BBA, xx - N, yy - N, zz), u);
387 int16_t L3 = LERP(
grad16(AAB, xx, yy, zz - N),
grad16(BAB, xx - N, yy, zz - N), u);
388 int16_t L4 = LERP(
grad16(ABB, xx, yy - N, zz - N),
grad16(BBB, xx - N, yy - N, zz - N), u);
389
390 int16_t Y1 = LERP(L1, L2, v);
391 int16_t Y2 = LERP(L3, L4, v);
392 int16_t noise_lower = LERP(Y1, Y2, w);
393
394
395 uint8_t Tupper = T + 1;
396 uint8_t AAA_u =
NOISE_P(AA) + Tupper;
397 uint8_t AAB_u =
NOISE_P(AA + 1) + Tupper;
398 uint8_t ABA_u =
NOISE_P(AB) + Tupper;
399 uint8_t ABB_u =
NOISE_P(AB + 1) + Tupper;
400 uint8_t BAA_u =
NOISE_P(BA) + Tupper;
401 uint8_t BAB_u =
NOISE_P(BA + 1) + Tupper;
402 uint8_t BBA_u =
NOISE_P(BB) + Tupper;
403 uint8_t BBB_u =
NOISE_P(BB + 1) + Tupper;
404
405 int16_t U1 = LERP(
grad16(AAA_u, xx, yy, zz),
grad16(BAA_u, xx - N, yy, zz), u);
406 int16_t U2 = LERP(
grad16(ABA_u, xx, yy - N, zz),
grad16(BBA_u, xx - N, yy - N, zz), u);
407 int16_t U3 = LERP(
grad16(AAB_u, xx, yy, zz - N),
grad16(BAB_u, xx - N, yy, zz - N), u);
408 int16_t U4 = LERP(
grad16(ABB_u, xx, yy - N, zz - N),
grad16(BBB_u, xx - N, yy - N, zz - N), u);
409
410 int16_t V1 = LERP(U1, U2, v);
411 int16_t V2 = LERP(U3, U4, v);
412 int16_t noise_upper = LERP(V1, V2, w);
413
414
415 int16_t noise4d = LERP(noise_lower, noise_upper, s);
416
417 return noise4d;
418}
static int16_t grad16(uint8_t hash, int16_t x, int16_t y, int16_t z)
#define NOISE_P(x)
Reads a single byte from the p array.