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

◆ render_value_fp()

FASTLED_FORCE_INLINE fl::i32 fl::render_value_fp ( const render_parameters_fp & p,
const fl::i32 * fade_lut,
const fl::u8 * perm )

Definition at line 53 of file render_value_fp.h.

56 {
57
58 using FP = fl::s16x16;
59 constexpr fl::i32 FP_ONE = static_cast<fl::i32>(1) << FP::FRAC_BITS;
60
61 // sincos32 for angle
62 fl::u32 a24 = radiansToA24_fp(p.angle_raw);
63 SinCos32 sc = sincos32(a24);
64
65 // sincos32 output is in [-2147418112, 2147418112] (Q0.31 range).
66 // To multiply with s16x16 dist, we use:
67 // result_s16x16 = (sc_val * dist_raw) >> 31
68 // This gives us the product in s16x16 format.
69 fl::i32 cos_dist = static_cast<fl::i32>(
70 (static_cast<fl::i64>(sc.cos_val) * p.dist_raw) >> 31);
71 fl::i32 sin_dist = static_cast<fl::i32>(
72 (static_cast<fl::i64>(sc.sin_val) * p.dist_raw) >> 31);
73
74 // newx = (offset_x + center_x - cos*dist) * scale_x
75 // newy = (offset_y + center_y - sin*dist) * scale_y
76 fl::i32 pre_x = p.offset_x_raw + p.center_x_raw - cos_dist;
77 fl::i32 pre_y = p.offset_y_raw + p.center_y_raw - sin_dist;
78
79 fl::i32 nx = static_cast<fl::i32>(
80 (static_cast<fl::i64>(pre_x) * p.scale_x_raw) >> FP::FRAC_BITS);
81 fl::i32 ny = static_cast<fl::i32>(
82 (static_cast<fl::i64>(pre_y) * p.scale_y_raw) >> FP::FRAC_BITS);
83
84 // Compute z coordinate: newz = (offset_z + z) * scale_z
85 fl::i32 nz = static_cast<fl::i32>(
86 (static_cast<fl::i64>(p.offset_z_raw + p.z_raw) * p.scale_z_raw) >> FP::FRAC_BITS);
87
88 // Perlin noise: 2D when z==0, 3D otherwise
89 fl::i32 raw_noise;
90 if (nz == 0) {
91 raw_noise = perlin_s16x16::pnoise2d_raw(nx, ny, fade_lut, perm);
92 } else {
93 raw_noise = perlin_s16x16::pnoise3d_raw(nx, ny, nz, fade_lut, perm);
94 }
95
96 // Clamp to [low_limit, high_limit]
97 if (raw_noise < p.low_limit_raw) raw_noise = p.low_limit_raw;
98 if (raw_noise > p.high_limit_raw) raw_noise = p.high_limit_raw;
99
100 // Map from [low_limit, high_limit] to [0, 255]
101 // map_float(x, low, high, 0, 255) = (x - low) * 255 / (high - low)
102 fl::i32 range = p.high_limit_raw - p.low_limit_raw;
103 fl::i32 shifted = raw_noise - p.low_limit_raw;
104
105 // shifted is in [0, range], we want (shifted * 255) / range
106 // For the common case where low=0, high=1: range = FP_ONE
107 // result = (shifted * 255) >> FRAC_BITS (since shifted is in [0, FP_ONE])
108 // For low=-1, high=1: range = 2*FP_ONE
109 // result = (shifted * 255) / (2*FP_ONE)
110 fl::i32 result;
111 if (range == FP_ONE) {
112 // Optimized path: low_limit=0, high_limit=1
113 result = static_cast<fl::i32>(
114 (static_cast<fl::i64>(shifted) * 255) >> FP::FRAC_BITS);
115 } else if (range == 2 * FP_ONE) {
116 // Optimized path: low_limit=-1, high_limit=1
117 result = static_cast<fl::i32>(
118 (static_cast<fl::i64>(shifted) * 255) >> (FP::FRAC_BITS + 1));
119 } else {
120 // General path
121 result = static_cast<fl::i32>(
122 (static_cast<fl::i64>(shifted) * 255) / range);
123 }
124
125 // Final clamp to [0, 255]
126 if (result < 0) result = 0;
127 if (result > 255) result = 255;
128
129 return result;
130}
FASTLED_FORCE_INLINE fl::u32 radiansToA24_fp(fl::i32 angle_s16x16_raw)
static constexpr i32 FP_ONE
fl::i64 i64
Definition s16x16x4.h:222
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31
FASTLED_FORCE_INLINE SinCos32 sincos32(u32 angle) FL_NOEXCEPT
Definition sin32.h:88
i32 sin_val
Definition sin32.h:25
i32 cos_val
Definition sin32.h:26
static fl::i32 pnoise2d_raw(fl::i32 fx_raw, fl::i32 fy_raw, const fl::i32 *fade_lut, const fl::u8 *perm)
static fl::i32 pnoise3d_raw(fl::i32 fx_raw, fl::i32 fy_raw, fl::i32 fz_raw, const fl::i32 *fade_lut, const fl::u8 *perm)

References fl::render_parameters_fp::angle_raw, fl::render_parameters_fp::center_x_raw, fl::render_parameters_fp::center_y_raw, fl::SinCos32::cos_val, fl::render_parameters_fp::dist_raw, FASTLED_FORCE_INLINE, FP_ONE, fl::render_parameters_fp::high_limit_raw, fl::render_parameters_fp::low_limit_raw, fl::render_parameters_fp::offset_x_raw, fl::render_parameters_fp::offset_y_raw, fl::render_parameters_fp::offset_z_raw, fl::perlin_s16x16::pnoise2d_raw(), fl::perlin_s16x16::pnoise3d_raw(), radiansToA24_fp(), fl::render_parameters_fp::scale_x_raw, fl::render_parameters_fp::scale_y_raw, fl::render_parameters_fp::scale_z_raw, fl::SinCos32::sin_val, sincos32(), and fl::render_parameters_fp::z_raw.

Referenced by fl::Center_Field_FP::draw(), fl::Complex_Kaleido_5_FP::draw(), fl::Module_Experiment10_FP::draw(), fl::Module_Experiment2_FP::draw(), fl::Module_Experiment3_FP::draw(), fl::Scaledemo1_FP::draw(), fl::SpiralMatrix4_FP::draw(), and render_value_fp_from_float().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: