FastLED 3.9.15
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 108 of file chasing_spirals.cpp.hpp.

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

References 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: