FastLED 3.10.8
Loading...
Searching...
No Matches

◆ inoise16_raw() [4/4]

fl::i16 inoise16_raw ( fl::u32 x,
fl::u32 y,
fl::u32 z,
fl::u32 w )
extern

Definition at line 384 of file noise.cpp.hpp.

384 {
385 // 1. Extract the integer (grid) parts.
386 fl::u8 X = (x >> 16) & 0xFF;
387 fl::u8 Y = (y >> 16) & 0xFF;
388 fl::u8 Z = (z >> 16) & 0xFF;
389 fl::u8 T = (t >> 16) & 0xFF;
390
391 // 2. Extract the fractional parts.
392 fl::u16 u = x & 0xFFFF;
393 fl::u16 v = y & 0xFFFF;
394 fl::u16 w = z & 0xFFFF;
395 fl::u16 s = t & 0xFFFF;
396
397 // 3. Easing of the fractional parts.
398 u = EASE16(u);
399 v = EASE16(v);
400 w = EASE16(w);
401 s = EASE16(s);
402
403 fl::u16 N = 0x8000L; // fixed-point half-scale
404
405 // 4. Precompute fixed-point versions for the gradient evaluations.
406 fl::i16 xx = (u >> 1) & 0x7FFF;
407 fl::i16 yy = (v >> 1) & 0x7FFF;
408 fl::i16 zz = (w >> 1) & 0x7FFF;
409
410 // 5. Hash the 3D cube corners (the “base” for both t slices).
411 fl::u8 A = NOISE_P(X) + Y;
412 fl::u8 AA = NOISE_P(A) + Z;
413 fl::u8 AB = NOISE_P(A + 1) + Z;
414 fl::u8 B = NOISE_P(X + 1) + Y;
415 fl::u8 BA = NOISE_P(B) + Z;
416 fl::u8 BB = NOISE_P(B + 1) + Z;
417
418 // 6. --- Lower t Slice (using T) ---
419 fl::u8 AAA = NOISE_P(AA) + T;
420 fl::u8 AAB = NOISE_P(AA + 1) + T;
421 fl::u8 ABA = NOISE_P(AB) + T;
422 fl::u8 ABB = NOISE_P(AB + 1) + T;
423 fl::u8 BAA = NOISE_P(BA) + T;
424 fl::u8 BAB = NOISE_P(BA + 1) + T;
425 fl::u8 BBA = NOISE_P(BB) + T;
426 fl::u8 BBB = NOISE_P(BB + 1) + T;
427
428 fl::i16 L1 = LERP(grad16(AAA, xx, yy, zz), grad16(BAA, xx - N, yy, zz), u);
429 fl::i16 L2 = LERP(grad16(ABA, xx, yy - N, zz), grad16(BBA, xx - N, yy - N, zz), u);
430 fl::i16 L3 = LERP(grad16(AAB, xx, yy, zz - N), grad16(BAB, xx - N, yy, zz - N), u);
431 fl::i16 L4 = LERP(grad16(ABB, xx, yy - N, zz - N), grad16(BBB, xx - N, yy - N, zz - N), u);
432
433 fl::i16 Y1 = LERP(L1, L2, v);
434 fl::i16 Y2 = LERP(L3, L4, v);
435 fl::i16 noise_lower = LERP(Y1, Y2, w);
436
437 // 7. --- Upper t Slice (using T+1) ---
438 fl::u8 Tupper = T + 1;
439 fl::u8 AAA_u = NOISE_P(AA) + Tupper;
440 fl::u8 AAB_u = NOISE_P(AA + 1) + Tupper;
441 fl::u8 ABA_u = NOISE_P(AB) + Tupper;
442 fl::u8 ABB_u = NOISE_P(AB + 1) + Tupper;
443 fl::u8 BAA_u = NOISE_P(BA) + Tupper;
444 fl::u8 BAB_u = NOISE_P(BA + 1) + Tupper;
445 fl::u8 BBA_u = NOISE_P(BB) + Tupper;
446 fl::u8 BBB_u = NOISE_P(BB + 1) + Tupper;
447
448 fl::i16 U1 = LERP(grad16(AAA_u, xx, yy, zz), grad16(BAA_u, xx - N, yy, zz), u);
449 fl::i16 U2 = LERP(grad16(ABA_u, xx, yy - N, zz), grad16(BBA_u, xx - N, yy - N, zz), u);
450 fl::i16 U3 = LERP(grad16(AAB_u, xx, yy, zz - N), grad16(BAB_u, xx - N, yy, zz - N), u);
451 fl::i16 U4 = LERP(grad16(ABB_u, xx, yy - N, zz - N), grad16(BBB_u, xx - N, yy - N, zz - N), u);
452
453 fl::i16 V1 = LERP(U1, U2, v);
454 fl::i16 V2 = LERP(U3, U4, v);
455 fl::i16 noise_upper = LERP(V1, V2, w);
456
457 // 8. Final interpolation in the t dimension.
458 fl::i16 noise4d = LERP(noise_lower, noise_upper, s);
459
460 return noise4d;
461}
int y
Definition simple.h:93
int x
Definition simple.h:92
uint32_t z[NUM_LAYERS]
Definition Fire2023.h:93
static uint32_t t
Definition Luminova.h:55
unsigned char u8
Definition stdint.h:131
static fl::i16 grad16(fl::u8 hash, fl::i16 x, fl::i16 y, fl::i16 z) FL_NO_EXCEPT
#define NOISE_P(x)
Reads a single byte from the p array.
Definition noise.cpp.hpp:33

References FL_NO_EXCEPT, grad16(), NOISE_P, t, x, y, and z.

+ Here is the call graph for this function: