FastLED 3.9.15
Loading...
Searching...
No Matches
FlowField.ino
Go to the documentation of this file.
1// @filter: (memory is large)
2
19
20// UIDescription: Flow field visualization with noise-driven advection, creating
21// fluid-like patterns from color emitters.
22
23#include <FastLED.h>
24#include "fl/ui/ui.h"
25#include "fl/fx/2d/flowfield.h"
26
27// -- Matrix config --
28#define WIDTH 64
29#define HEIGHT 64
30#define NUM_LEDS (WIDTH * HEIGHT)
31#define DATA_PIN 2
32#define BRIGHTNESS 255
33#define SERPENTINE true
34
37
38// -- UI controls --
39fl::UITitle title("FlowFields");
41 "Flow field visualization with noise-driven advection, creating fluid-like patterns from color emitters. "
42 "Concept by Stefan Petrick, Initial C++ implementation by 4wheeljive. FastLED port adaptation + fixed point "
43 "optmization by Zach Vorhies."
44);
45
46fl::UISlider flowSpeedX("X Speed", 0.10f, -2.0f, 2.0f, 0.01f);
47fl::UISlider flowAmpX("X Amplitude", 1.0f, 0.0f, 2.0f, 0.01f);
48fl::UISlider flowFreqX("X Frequency", 0.33f, 0.05f, 4.0f, 0.01f);
50
51fl::UISlider flowSpeedY("Y Speed", 0.10f, -2.0f, 2.0f, 0.01f);
52fl::UISlider flowAmpY("Y Amplitude", 1.0f, 0.0f, 2.0f, 0.01f);
53fl::UISlider flowFreqY("Y Frequency", 0.32f, 0.05f, 4.0f, 0.01f);
55
56fl::UISlider endpointSpeed("Endpoint Speed", 0.80f, 0.05f, 2.0f, 0.01f);
57fl::UISlider colorShift("Color Shift", 0.04f, 0.0f, 0.5f, 0.01f);
58fl::UISlider persistence("Trail Half-Life (s)", 0.86f, 0.05f, 5.0f, 0.01f);
59fl::UISlider flowShift("Pixel Shift", 1.8f, 0.5f, 4.0f, 0.1f);
60fl::UISlider numDots("Dots", 3, 1, 5, 1);
61fl::UIDropdown emitterMode("Emitter Mode", {"Lissajous", "Dots", "Both"});
63
65
66fl::UIDropdown computeMode("Compute Mode", {"Float", "Fixed-Point (Fast)"});
67fl::UICheckbox showFlowVectors("Show Flow Vectors", false);
69
72
73void setup() {
74 Serial.begin(115200);
75 FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS)
76 .setScreenMap(xyMap);
77 FastLED.setBrightness(BRIGHTNESS);
78}
79
80void loop() {
81 fl::Fx::DrawContext ctx(millis(), leds);
82
83 // Use base class reference for uniform parameter setting + draw
84 fl::FlowField &fx = (computeMode.as_int() == 0)
85 ? static_cast<fl::FlowField &>(flowFieldFloat)
86 : static_cast<fl::FlowField &>(flowFieldFP);
87
98 fx.setDotCount(numDots.as<int>());
99 fx.setEmitterMode(emitterMode.as_int());
101
102 if (noisePunch.clicked()) {
103 // 50% X axis, 50% Y axis; random position; random sign
104 bool pickX = random8() < 128;
105 float sign = (random8() < 128) ? 1.0f : -1.0f;
106 if (pickX) {
107 float cx = random8(0, fx.getWidth());
108 float w = fx.getWidth() * 0.4f;
109 fx.noisePunchX(cx, w, sign);
110 } else {
111 float cy = random8(0, fx.getHeight());
112 float h = fx.getHeight() * 0.4f;
113 fx.noisePunchY(cy, h, sign);
114 }
115 }
116
117 fx.draw(ctx);
118 FastLED.show();
119}
fl::XYMap xyMap
#define NUM_LEDS
fl::UIDescription description("Demo of the Animatrix effects. @author of fx is StefanPetrick")
fl::CRGB leds[NUM_LEDS]
#define BRIGHTNESS
#define SERPENTINE
Definition Blur2d.ino:29
#define DATA_PIN
Definition ClientReal.h:82
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
fl::UISlider flowSpeedY("Y Speed", 0.10f, -2.0f, 2.0f, 0.01f)
fl::UIGroup appearanceGroup("Appearance", endpointSpeed, colorShift, persistence, flowShift, numDots, emitterMode)
fl::UIGroup flowXGroup("Flow X", flowSpeedX, flowAmpX, flowFreqX)
fl::UICheckbox showFlowVectors("Show Flow Vectors", false)
fl::UISlider flowAmpY("Y Amplitude", 1.0f, 0.0f, 2.0f, 0.01f)
fl::XYMap xyMap(WIDTH, HEIGHT, SERPENTINE)
fl::UIGroup debugGroup("Debug", computeMode, showFlowVectors)
fl::UISlider flowFreqX("X Frequency", 0.33f, 0.05f, 4.0f, 0.01f)
fl::UISlider flowAmpX("X Amplitude", 1.0f, 0.0f, 2.0f, 0.01f)
void setup()
Definition FlowField.ino:73
fl::UIButton noisePunch("NoisePunch")
fl::UIDropdown emitterMode("Emitter Mode", {"Lissajous", "Dots", "Both"})
fl::FlowFieldFloat flowFieldFloat(xyMap)
fl::UISlider numDots("Dots", 3, 1, 5, 1)
fl::UISlider flowFreqY("Y Frequency", 0.32f, 0.05f, 4.0f, 0.01f)
fl::UISlider endpointSpeed("Endpoint Speed", 0.80f, 0.05f, 2.0f, 0.01f)
fl::UISlider colorShift("Color Shift", 0.04f, 0.0f, 0.5f, 0.01f)
fl::UITitle title("FlowFields")
fl::UISlider flowShift("Pixel Shift", 1.8f, 0.5f, 4.0f, 0.1f)
fl::UIGroup flowYGroup("Flow Y", flowSpeedY, flowAmpY, flowFreqY)
fl::UISlider persistence("Trail Half-Life (s)", 0.86f, 0.05f, 5.0f, 0.01f)
fl::UIDropdown computeMode("Compute Mode", {"Float", "Fixed-Point (Fast)"})
fl::UISlider flowSpeedX("X Speed", 0.10f, -2.0f, 2.0f, 0.01f)
fl::FlowFieldFP flowFieldFP(xyMap)
void loop()
Definition FlowField.ino:80
#define WIDTH
#define HEIGHT
void setColorShift(float speed)
Definition flowfield.h:238
void noisePunchX(float center, float width, float amplitude=1.0f, BumpShape shape=BumpShape::HalfSine)
Trigger a noise punch on the X axis (columns).
void setFlowSpeedX(float speed)
Definition flowfield.h:242
void setFlowSpeedY(float speed)
Definition flowfield.h:243
void noisePunchY(float center, float width, float amplitude=1.0f, BumpShape shape=BumpShape::HalfSine)
Trigger a noise punch on the Y axis (rows).
void setNoiseFrequencyX(float freq)
Definition flowfield.h:244
void setEndpointSpeed(float speed)
Definition flowfield.h:252
void setDotCount(int count)
Definition flowfield.h:250
void setPersistence(float halfLife)
Definition flowfield.h:237
void setFlowAmplitudeX(float amp)
Definition flowfield.h:239
void draw(DrawContext context) override
Handles timing, then delegates to drawImpl().
void setFlowShift(float shift)
Definition flowfield.h:241
void setNoiseFrequencyY(float freq)
Definition flowfield.h:245
void setEmitterMode(int mode)
Definition flowfield.h:251
void setShowFlowVectors(bool show)
Definition flowfield.h:254
void setFlowAmplitudeY(float amp)
Definition flowfield.h:240
Pure fixed-point (s16x16) flow field implementation for maximum speed.
Definition flowfield.h:360
Float-precision flow field implementation.
Definition flowfield.h:295
Abstract base class for 2D flow field effects.
Definition flowfield.h:226
u16 getWidth() const
Definition fx2d.h:24
u16 getHeight() const
Definition fx2d.h:23
::fl::DrawContext DrawContext
Definition fx.h:21
constexpr EOrder GRB
Definition eorder.h:19
2D flow field visualization: emitters paint color, noise advects it
fl::CRGB CRGB
Definition crgb.h:25
LIB8STATIC fl::u8 random8() FL_NOEXCEPT
Generate an 8-bit random number.
Definition random8.h:53
#define Serial
Definition serial.h:304
Aggregator header for the fl/ui/ family of per-element UI types.