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

◆ draw()

void fl::Chasing_Spirals_Q31::draw ( Context & ctx)
overridevirtual

Implements fl::IAnimartrix2Viz.

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

363 {
365 const int total_pixels = setup.total_pixels;
366 const i32 *fade_lut = setup.fade_lut;
367 const u8 *perm = setup.perm;
368 const i32 cx_raw = setup.cx_raw;
369 const i32 cy_raw = setup.cy_raw;
370 const i32 lin0_raw = setup.lin0_raw;
371 const i32 lin1_raw = setup.lin1_raw;
372 const i32 lin2_raw = setup.lin2_raw;
373 const i32 rad0_raw = setup.rad0_raw;
374 const i32 rad1_raw = setup.rad1_raw;
375 const i32 rad2_raw = setup.rad2_raw;
376 fl::span<CRGB> leds = setup.leds;
377
378 // Compute one noise channel from a batched SinCos32_simd result.
379 auto noise_channel = [&](const SinCos32_simd &sc, int lane,
380 i32 lin_raw, i32 dist_raw) -> i32 {
381 i32 cos_v = static_cast<i32>(simd::extract_u32_4(sc.cos_vals, lane));
382 i32 sin_v = static_cast<i32>(simd::extract_u32_4(sc.sin_vals, lane));
383 i32 nx = perlinCoord(cos_v, dist_raw, lin_raw + cx_raw);
384 i32 ny = perlinCoord(sin_v, dist_raw, cy_raw);
385 return clampAndScale255(Perlin::pnoise2d_raw(nx, ny, fade_lut, perm));
386 };
387
388 for (int i = 0; i < total_pixels; i++) {
389 const i32 base_raw = setup.base_angle[i];
390 const i32 dist_raw = setup.dist_scaled[i];
391
392 // Batch all 3 channel sincos into one SIMD call (4th lane unused)
393 simd::simd_u32x4 angles = simd::set_u32_4(
394 radiansToA24(base_raw, rad0_raw),
395 radiansToA24(base_raw, rad1_raw),
396 radiansToA24(base_raw, rad2_raw), 0);
397 SinCos32_simd sc = sincos32_simd(angles);
398
399 i32 s0 = noise_channel(sc, 0, lin0_raw, dist_raw);
400 i32 s1 = noise_channel(sc, 1, lin1_raw, dist_raw);
401 i32 s2 = noise_channel(sc, 2, lin2_raw, dist_raw);
402
403 i32 r = applyRadialFilter(s0, setup.rf3[i]);
404 i32 g = applyRadialFilter(s1, setup.rf_half[i]);
405 i32 b = applyRadialFilter(s2, setup.rf_quarter[i]);
406
407 leds[setup.pixel_idx[i]] = CRGB(static_cast<u8>(r),
408 static_cast<u8>(g),
409 static_cast<u8>(b));
410 }
411}
CRGB leds[1]
void setup()
ChasingSpiralState mState
FASTLED_FORCE_INLINE u32 radiansToA24(i32 base_s16x16, i32 offset_s16x16) FL_NO_EXCEPT
FrameSetup setupChasingSpiralFrame(Context &ctx, ChasingSpiralState &state) FL_NO_EXCEPT
FASTLED_FORCE_INLINE i32 applyRadialFilter(i32 noise_255, i32 rf_raw) FL_NO_EXCEPT
FASTLED_FORCE_INLINE i32 perlinCoord(i32 sc_val, i32 dist_raw, i32 offset) FL_NO_EXCEPT
FASTLED_FORCE_INLINE i32 clampAndScale255(i32 raw_s16x16) FL_NO_EXCEPT
platforms::simd_u32x4 simd_u32x4
Definition types.h:26
unsigned char u8
Definition stdint.h:131
fl::CRGB CRGB
Definition video.h:18
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
InputGamut g
Definition rgbw.h:125

References fl::FL_NO_EXCEPT, fl::g, leds, mState, setup(), and fl::sincos32_simd().

Referenced by fl::q16::Chasing_Spirals_Q16_Batch4_ColorGrouped().

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