FastLED 3.10.6
Loading...
Searching...
No Matches

◆ render()

void mood_ring::FlowLayer::render ( const RoomSense & s,
const MoodPalette & pal,
float dtSec,
RingCanvas & c )

Definition at line 126 of file layers.cpp.

127 {
128 const float dtMs = dtSec * 1000.0f;
129
130 // Mids set travel speed; a rising room speeds up, a settling one slows.
131 const float speed = kFlowBaseTurnsPerSec +
132 kFlowMidTurnsPerSec * s.mid * (1.0f + 0.5f * s.trend);
133 mPosA = advance(mPosA, speed, dtSec);
134 mPosB = advance(mPosB, -speed * 0.8f, dtSec);
135 mHueWalk = wrapTurns(mHueWalk + kFlowHueWalkPerSec * s.mid * dtSec);
136
137 // Bass sets lobe size; trend widens on the way up and tightens on the
138 // way down so a build feels like it is opening. Slewed so a bass drop
139 // grows the lobe instead of snapping it.
140 float sigmaTarget = kFlowSigmaMin + (kFlowSigmaMax - kFlowSigmaMin) * s.low;
141 sigmaTarget *= 1.0f + 0.35f * s.trend;
142 sigmaTarget =
143 clampf(sigmaTarget, kFlowSigmaMin * 0.7f, kFlowSigmaMax * 1.4f);
144 const float sigma =
145 mSigma.update(sigmaTarget, dtMs, kFlowSigmaSlewMs, kFlowSigmaSlewMs);
146
147 // Punch adds a brief brightness kick so a hit is visible without a beat.
148 const float bodyTarget = 0.45f + 0.45f * s.energy + 0.4f * s.punch;
149 const float body =
150 mBody.update(bodyTarget, dtMs, kFlowBodyAttackMs, kFlowBodyReleaseMs);
151
152 c.lobe(mPosA, sigma, paletteColor(pal, mHueWalk), body);
153 c.lobe(mPosB, sigma * 0.8f, paletteColor(pal, wrapTurns(mHueWalk + 0.5f)),
154 body * 0.8f);
155
156 // A dim bed so the ring is never black between lobes.
157 c.fill(paletteColor(pal, 0.5f), 0.06f + 0.10f * s.energy);
158
159 spawnGrains(s, dtSec, c.size());
160 drawGrains(pal, dtSec, c);
161}
uint16_t speed
Definition Noise.ino:72
Follower mSigma
Definition layers.h:60
void drawGrains(const MoodPalette &pal, float dtSec, RingCanvas &c)
Definition layers.cpp:105
void spawnGrains(const RoomSense &s, float dtSec, int ringSize)
Definition layers.cpp:82
float advance(float pos, float turnsPerSec, float dtSec)
Definition layers.cpp:43
float clampf(float v, float lo, float hi)
Definition ring_canvas.h:19
RGBf paletteColor(const MoodPalette &p, float t)
Colour at position t in [0, 1] along the family, at value v.
float wrapTurns(float t)
Wrap into [0, 1).

References mood_ring::clampf(), drawGrains(), mood_ring::RoomSense::energy, mood_ring::RingCanvas::fill(), mood_ring::RingCanvas::lobe(), mood_ring::RoomSense::low, mBody, mHueWalk, mood_ring::RoomSense::mid, mPosA, mPosB, mSigma, mood_ring::paletteColor(), mood_ring::RoomSense::punch, mood_ring::RingCanvas::size(), spawnGrains(), speed, mood_ring::RoomSense::trend, and mood_ring::wrapTurns().

+ Here is the call graph for this function: