FastLED 3.9.15
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 346 of file noise.cpp.hpp.

346 {
347 // 1. Extract the integer (grid) parts.
348 fl::u8 X = (x >> 16) & 0xFF;
349 fl::u8 Y = (y >> 16) & 0xFF;
350 fl::u8 Z = (z >> 16) & 0xFF;
351 fl::u8 T = (t >> 16) & 0xFF;
352
353 // 2. Extract the fractional parts.
354 fl::u16 u = x & 0xFFFF;
355 fl::u16 v = y & 0xFFFF;
356 fl::u16 w = z & 0xFFFF;
357 fl::u16 s = t & 0xFFFF;
358
359 // 3. Easing of the fractional parts.
360 u = EASE16(u);
361 v = EASE16(v);
362 w = EASE16(w);
363 s = EASE16(s);
364
365 fl::u16 N = 0x8000L; // fixed-point half-scale
366
367 // 4. Precompute fixed-point versions for the gradient evaluations.
368 fl::i16 xx = (u >> 1) & 0x7FFF;
369 fl::i16 yy = (v >> 1) & 0x7FFF;
370 fl::i16 zz = (w >> 1) & 0x7FFF;
371
372 // 5. Hash the 3D cube corners (the “base” for both t slices).
373 fl::u8 A = NOISE_P(X) + Y;
374 fl::u8 AA = NOISE_P(A) + Z;
375 fl::u8 AB = NOISE_P(A + 1) + Z;
376 fl::u8 B = NOISE_P(X + 1) + Y;
377 fl::u8 BA = NOISE_P(B) + Z;
378 fl::u8 BB = NOISE_P(B + 1) + Z;
379
380 // 6. --- Lower t Slice (using T) ---
381 fl::u8 AAA = NOISE_P(AA) + T;
382 fl::u8 AAB = NOISE_P(AA + 1) + T;
383 fl::u8 ABA = NOISE_P(AB) + T;
384 fl::u8 ABB = NOISE_P(AB + 1) + T;
385 fl::u8 BAA = NOISE_P(BA) + T;
386 fl::u8 BAB = NOISE_P(BA + 1) + T;
387 fl::u8 BBA = NOISE_P(BB) + T;
388 fl::u8 BBB = NOISE_P(BB + 1) + T;
389
390 fl::i16 L1 = LERP(grad16(AAA, xx, yy, zz), grad16(BAA, xx - N, yy, zz), u);
391 fl::i16 L2 = LERP(grad16(ABA, xx, yy - N, zz), grad16(BBA, xx - N, yy - N, zz), u);
392 fl::i16 L3 = LERP(grad16(AAB, xx, yy, zz - N), grad16(BAB, xx - N, yy, zz - N), u);
393 fl::i16 L4 = LERP(grad16(ABB, xx, yy - N, zz - N), grad16(BBB, xx - N, yy - N, zz - N), u);
394
395 fl::i16 Y1 = LERP(L1, L2, v);
396 fl::i16 Y2 = LERP(L3, L4, v);
397 fl::i16 noise_lower = LERP(Y1, Y2, w);
398
399 // 7. --- Upper t Slice (using T+1) ---
400 fl::u8 Tupper = T + 1;
401 fl::u8 AAA_u = NOISE_P(AA) + Tupper;
402 fl::u8 AAB_u = NOISE_P(AA + 1) + Tupper;
403 fl::u8 ABA_u = NOISE_P(AB) + Tupper;
404 fl::u8 ABB_u = NOISE_P(AB + 1) + Tupper;
405 fl::u8 BAA_u = NOISE_P(BA) + Tupper;
406 fl::u8 BAB_u = NOISE_P(BA + 1) + Tupper;
407 fl::u8 BBA_u = NOISE_P(BB) + Tupper;
408 fl::u8 BBB_u = NOISE_P(BB + 1) + Tupper;
409
410 fl::i16 U1 = LERP(grad16(AAA_u, xx, yy, zz), grad16(BAA_u, xx - N, yy, zz), u);
411 fl::i16 U2 = LERP(grad16(ABA_u, xx, yy - N, zz), grad16(BBA_u, xx - N, yy - N, zz), u);
412 fl::i16 U3 = LERP(grad16(AAB_u, xx, yy, zz - N), grad16(BAB_u, xx - N, yy, zz - N), u);
413 fl::i16 U4 = LERP(grad16(ABB_u, xx, yy - N, zz - N), grad16(BBB_u, xx - N, yy - N, zz - N), u);
414
415 fl::i16 V1 = LERP(U1, U2, v);
416 fl::i16 V2 = LERP(U3, U4, v);
417 fl::i16 noise_upper = LERP(V1, V2, w);
418
419 // 8. Final interpolation in the t dimension.
420 fl::i16 noise4d = LERP(noise_lower, noise_upper, s);
421
422 return noise4d;
423}
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
FL_DISABLE_WARNING_PUSH unsigned char * B
static fl::i16 grad16(fl::u8 hash, fl::i16 x, fl::i16 y, fl::i16 z)
#define NOISE_P(x)
Reads a single byte from the p array.
Definition noise.cpp.hpp:32

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

+ Here is the call graph for this function: