FastLED 3.9.15
Loading...
Searching...
No Matches
noise_woryley.cpp
Go to the documentation of this file.
1#include "noise_woryley.h"
2
3namespace fl {
4namespace {
5
6constexpr int32_t Q15_ONE = 32768; // 1.0 in Q15
7// constexpr int32_t Q15_HALF = Q15_ONE / 2;
8
9// Helper: multiply two Q15 numbers (result in Q15)
10// int32_t q15_mul(int32_t a, int32_t b) {
11// return (int32_t)(((int64_t)a * b) >> 15);
12// }
13
14// Helper: absolute difference
15int32_t q15_abs(int32_t a) { return a < 0 ? -a : a; }
16
17// Pseudo-random hash based on grid coordinates
18uint16_t hash(int32_t x, int32_t y) {
19 uint32_t n = (uint32_t)(x * 374761393 + y * 668265263);
20 n = (n ^ (n >> 13)) * 1274126177;
21 return (uint16_t)((n ^ (n >> 16)) & 0xFFFF);
22}
23
24// Get fractional feature point inside a grid cell
25void feature_point(int32_t gx, int32_t gy, int32_t &fx, int32_t &fy) {
26 uint16_t h = hash(gx, gy);
27 fx = (h & 0xFF) * 128; // scale to Q15 (0–32767)
28 fy = ((h >> 8) & 0xFF) * 128;
29}
30} // namespace
31
32// Compute 2D Worley noise at (x, y) in Q15
33int32_t worley_noise_2d_q15(int32_t x, int32_t y) {
34 int32_t cell_x = x >> 15;
35 int32_t cell_y = y >> 15;
36
37 int32_t min_dist = INT32_MAX;
38
39 // Check surrounding 9 cells
40 for (int dy = -1; dy <= 1; ++dy) {
41 for (int dx = -1; dx <= 1; ++dx) {
42 int32_t gx = cell_x + dx;
43 int32_t gy = cell_y + dy;
44
45 int32_t fx, fy;
46 feature_point(gx, gy, fx, fy);
47
48 int32_t feature_x = (gx << 15) + fx;
49 int32_t feature_y = (gy << 15) + fy;
50
51 int32_t dx_q15 = x - feature_x;
52 int32_t dy_q15 = y - feature_y;
53
54 // Approximate distance using Manhattan (faster) or Euclidean
55 // (costlier)
56 int32_t dist =
57 q15_abs(dx_q15) + q15_abs(dy_q15); // Manhattan distance
58
59 if (dist < min_dist)
60 min_dist = dist;
61 }
62 }
63
64 // Normalize: maximum possible distance is roughly 2*Q15_ONE
65 return (min_dist << 15) / (2 * Q15_ONE);
66}
67
68} // namespace fl
uint32_t x[NUM_LAYERS]
Definition Fire2023.ino:82
uint32_t y[NUM_LAYERS]
Definition Fire2023.ino:83
uint16_t hash(int32_t x, int32_t y)
void feature_point(int32_t gx, int32_t gy, int32_t &fx, int32_t &fy)
int32_t worley_noise_2d_q15(int32_t x, int32_t y)
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
#define INT32_MAX