FastLED 3.9.15
Loading...
Searching...
No Matches

◆ inoise16_raw() [4/4]

int16_t inoise16_raw ( uint32_t x,
uint32_t y,
uint32_t z,
uint32_t w )
extern

Definition at line 341 of file noise.cpp.

341 {
342 // 1. Extract the integer (grid) parts.
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 // 2. Extract the fractional parts.
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 // 3. Easing of the fractional parts.
355 u = EASE16(u);
356 v = EASE16(v);
357 w = EASE16(w);
358 s = EASE16(s);
359
360 uint16_t N = 0x8000L; // fixed-point half-scale
361
362 // 4. Precompute fixed-point versions for the gradient evaluations.
363 int16_t xx = (u >> 1) & 0x7FFF;
364 int16_t yy = (v >> 1) & 0x7FFF;
365 int16_t zz = (w >> 1) & 0x7FFF;
366
367 // 5. Hash the 3D cube corners (the “base” for both t slices).
368 uint8_t A = NOISE_P(X) + Y;
369 uint8_t AA = NOISE_P(A) + Z;
370 uint8_t AB = NOISE_P(A + 1) + Z;
371 uint8_t B = NOISE_P(X + 1) + Y;
372 uint8_t BA = NOISE_P(B) + Z;
373 uint8_t BB = NOISE_P(B + 1) + Z;
374
375 // 6. --- Lower t Slice (using T) ---
376 uint8_t AAA = NOISE_P(AA) + T;
377 uint8_t AAB = NOISE_P(AA + 1) + T;
378 uint8_t ABA = NOISE_P(AB) + T;
379 uint8_t ABB = NOISE_P(AB + 1) + T;
380 uint8_t BAA = NOISE_P(BA) + T;
381 uint8_t BAB = NOISE_P(BA + 1) + T;
382 uint8_t BBA = NOISE_P(BB) + 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 // 7. --- Upper t Slice (using T+1) ---
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 // 8. Final interpolation in the t dimension.
415 int16_t noise4d = LERP(noise_lower, noise_upper, s);
416
417 return noise4d;
418}
int y
Definition simple.h:93
int x
Definition simple.h:92
uint32_t z[NUM_LAYERS]
Definition Fire2023.h:94
static uint32_t t
Definition Luminova.h:54
static int16_t grad16(uint8_t hash, int16_t x, int16_t y, int16_t z)
Definition noise.cpp:111
#define NOISE_P(x)
Reads a single byte from the p array.
Definition noise.cpp:26

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

+ Here is the call graph for this function: