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

◆ draw()

void fl::Luminova::draw ( DrawContext context)
overridevirtual
Parameters
nowThe current time in milliseconds. Fx writers are encouraged to use this instead of millis() directly as this will more deterministic behavior.

Implements fl::Fx.

Definition at line 86 of file luminova.cpp.

86 {
87 // Fade + blur trails each frame
88 fadeToBlackBy(context.leds, getNumLeds(), mParams.fade_amount);
89 blur2d(context.leds, static_cast<fl::u8>(getWidth()), static_cast<fl::u8>(getHeight()),
90 mParams.blur_amount, mXyMap);
91
92 // Spawn/overwrite one particle per frame, round-robin across pool
93 if (!mParticles.empty()) {
94 size_t idx = static_cast<size_t>(mTick % static_cast<fl::u32>(mParticles.size()));
96 }
97
98 // Update and draw all particles
99 for (size_t i = 0; i < mParticles.size(); ++i) {
100 Particle &p = mParticles[i];
101 if (!p.alive) {
102 continue;
103 }
104
105 // s *= 0.997
106 p.s *= 0.997f;
107 if (p.s < 0.5f) {
108 p.alive = false;
109 continue;
110 }
111
112 // angle jitter using 2D noise: (t/99, g)
113 float tOver99 = static_cast<float>(mTick) / 99.0f;
114 uint8_t n2 = inoise8(static_cast<uint16_t>(tOver99 * 4096.0f), static_cast<uint16_t>(p.g * 37));
115 float n2c = (static_cast<int>(n2) - 128) / 255.0f; // ~ -0.5 .. +0.5
116 p.a += (n2c) / 9.0f;
117
118 float aa = p.a * static_cast<float>(p.f);
119 p.x += ::cosf(aa);
120 p.y += ::sinf(aa);
121
122 plotSoftDot(context.leds, p.x, p.y, p.s);
123 }
124
125 ++mTick;
126}
XYMap mXyMap
Definition fx2d.h:31
uint16_t getHeight() const
Definition fx2d.h:24
uint16_t getWidth() const
Definition fx2d.h:25
uint16_t getNumLeds() const
Definition fx.h:49
void resetParticle(Particle &p, fl::u32 tick)
Definition luminova.cpp:36
fl::u32 mTick
Definition luminova.h:64
Params mParams
Definition luminova.h:63
fl::vector< Particle > mParticles
Definition luminova.h:65
void plotSoftDot(CRGB *leds, float fx, float fy, float s) const
Definition luminova.cpp:63
void blur2d(CRGB *leds, fl::u8 width, fl::u8 height, fract8 blur_amount, const XYMap &xymap)
Two-dimensional blur filter.
Definition blur.cpp:72
uint8_t inoise8(uint16_t x, uint16_t y, uint16_t z)
8-Bit, fixed point implementation of Perlin's noise.
Definition noise.cpp:570
unsigned char u8
Definition int.h:17
void fadeToBlackBy(CRGB *leds, fl::u16 num_leds, fl::u8 fadeBy)

References fl::Luminova::Particle::a, fl::Luminova::Particle::alive, fl::blur2d(), fl::Luminova::Particle::f, fl::fadeToBlackBy(), fl::Luminova::Particle::g, fl::Fx2d::getHeight(), fl::Fx::getNumLeds(), fl::Fx2d::getWidth(), inoise8(), fl::_DrawContext::leds, mParams, mParticles, mTick, fl::Fx2d::mXyMap, plotSoftDot(), resetParticle(), fl::Luminova::Particle::s, fl::Luminova::Particle::x, and fl::Luminova::Particle::y.

+ Here is the call graph for this function: