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

◆ simd4_processChannel()

simd::simd_u32x4 fl::anonymous_namespace{chasing_spirals.cpp.hpp}::simd4_processChannel ( simd::simd_u32x4 base_vec,
simd::simd_u32x4 dist_vec,
i32 radial_offset,
i32 linear_offset,
const i32 * fade_lut,
const u8 * perm,
i32 cx_raw,
i32 cy_raw,
simd::simd_u32x4 rf_vec )

Definition at line 109 of file chasing_spirals.cpp.hpp.

113 {
114
115 constexpr i32 RAD_TO_A24 = 2670177;
116
117 // Angle conversion: Q16.16 → A24
118 auto offset_vec = simd::set1_u32_4(static_cast<u32>(radial_offset));
119 auto sum_vec = simd::add_i32_4(base_vec, offset_vec);
120 auto rad_const_vec = simd::set1_u32_4(static_cast<u32>(RAD_TO_A24));
121 auto angles_vec = simd::mulhi_su32_4(sum_vec, rad_const_vec);
122
123 SinCos32_simd sc = sincos32_simd(angles_vec);
124
125 // Perlin coordinates: nx = lin+cx - cos*dist, ny = cy - sin*dist
126 auto lin_cx = simd::set1_u32_4(static_cast<u32>(linear_offset + cx_raw));
127 auto cy_vec = simd::set1_u32_4(static_cast<u32>(cy_raw));
128 auto nx_vec = simd::sub_i32_4(lin_cx,
129 simd::sll_u32_4(simd::mulhi32_i32_4(sc.cos_vals, dist_vec), 1));
130 auto ny_vec = simd::sub_i32_4(cy_vec,
131 simd::sll_u32_4(simd::mulhi32_i32_4(sc.sin_vals, dist_vec), 1));
132
133 // Perlin noise (SIMD floor/frac/wrap, scalar fade/perm/grad/lerp per lane)
135 nx_vec, ny_vec, fade_lut, perm);
136
137 // Clamp [0, FP_ONE], scale ×255, apply radial filter, clamp [0, 255]
138 auto zero = simd::set1_u32_4(0u);
139 auto fp_one = simd::set1_u32_4(static_cast<u32>(static_cast<i32>(1) << FP::FRAC_BITS));
140 auto clamped = simd::min_i32_4(simd::max_i32_4(raw_vec, zero), fp_one);
141 auto noise_scaled = simd::sub_i32_4(simd::sll_u32_4(clamped, 8), clamped);
142
143 auto max255 = simd::set1_u32_4(255u);
144 auto result = simd::mulhi32_i32_4(noise_scaled, rf_vec);
145 return simd::min_i32_4(simd::max_i32_4(result, zero), max255);
146}
static constexpr int FRAC_BITS
Definition s16x16.h:24
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31
FASTLED_FORCE_INLINE SinCos32_simd sincos32_simd(simd::simd_u32x4 angles) FL_NO_EXCEPT
Process 4 angles simultaneously, returning vectorized sin/cos values SIMD-optimized: vectorized angle...
Definition sin32_simd.h:32
static fl::simd::simd_u32x4 pnoise2d_raw_simd4_vec(fl::simd::simd_u32x4 nx_vec, fl::simd::simd_u32x4 ny_vec, const fl::i32 *fade_lut, const fl::u8 *perm) FL_NO_EXCEPT

References fl::FL_NO_EXCEPT, fl::s16x16::FRAC_BITS, fl::perlin_s16x16_simd::pnoise2d_raw_simd4_vec(), simd4_processChannel(), and fl::sincos32_simd().

Referenced by simd4_processChannel().

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