ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
WarzoneAnimationV2.h
Go to the documentation of this file.
1#pragma once
2
3#include "../Animation.h"
4#include "../AnimationTracks/BlinkTrack.h"
5#include "../KeyFrameTrack.h"
6#include "../EasyEaseAnimator.h"
7#include "../../Objects/Background.h"
8#include "../../Objects/LEDStripBackground.h"
9#include "../../Morph/WarzoneFace.h"
10#include "../../Morph/WarzoneExtras.h"
11#include "../../Render/Scene.h"
12#include "../../Menu/Menu.h"
13#include "../../Signals/FunctionGenerator.h"
14#include "../../Signals/FFTVoiceDetection.h"
15#include "../../Sensors/APDS9960.h"
16#include "../../Sensors/MicrophoneFourier_MAX9814.h"
17#include "../../Render/ObjectAlign.h"
18
19#include "../../Materials/Animated/RainbowNoise.h"
20#include "../../Materials/Animated/RainbowSpiral.h"
21#include "../../Materials/Animated/SpectrumAnalyzer.h"
22#include "../../Materials/Animated/AudioReactiveGradient.h"
23#include "../../Materials/Animated/Oscilloscope.h"
24#include "../../Materials/MaterialAnimator.h"
25
26class Warzone2Animation : public Animation<4> {
27private:
28 WarzoneFace pM;
29 WarzoneExtras pME;
30 Background background;
31 LEDStripBackground ledStripBackground;
32 EasyEaseAnimator<30> eEA = EasyEaseAnimator<30>(EasyEaseInterpolation::Overshoot, 1.0f, 0.35f);
33
34 //Materials
44
45 RGBColor gradientSpectrum[2] = {RGBColor(246, 176, 194), RGBColor(207, 148, 163)};
47
50
51 SpectrumAnalyzer sA = SpectrumAnalyzer(Vector2D(200, 100), Vector2D(100, 50), true, true);
54
55 //Animation controllers
57
64
68
72
74
76
77 ObjectAlign objA = ObjectAlign(Vector2D(0.0f, 0.0f), Vector2D(189.0f, 93.0f), Quaternion());
78
79 float offsetFace = 0.0f;
80 float offsetFaceSA = 0.0f;
81 float offsetFaceARG = 0.0f;
82 float offsetFaceOSC = 0.0f;
83 float offsetFaceZZZ = 0.0f;
84 uint8_t offsetFaceInd = 50;
85 uint8_t offsetFaceIndSA = 51;
86 uint8_t offsetFaceIndARG = 52;
87 uint8_t offsetFaceIndOSC = 53;
88 uint8_t offsetFaceIndZZZ = 54;
89
91 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::BasisMouth), WarzoneFace::BasisMouth, 30, 0.0f, 1.0f);
92 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::UwUEyes), WarzoneFace::UwUEyes, 30, 0.0f, 1.0f);
93 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::UwUMouth), WarzoneFace::UwUMouth, 30, 0.0f, 1.0f);
94 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::SpiralEyes), WarzoneFace::SpiralEyes, 20, 0.0f, 1.0f);
95 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::SpiralMouth), WarzoneFace::SpiralMouth, 20, 0.0f, 1.0f);
96 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::HappyEyes), WarzoneFace::HappyEyes, 45, 0.0f, 1.0f);
97 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::HappyMouth), WarzoneFace::HappyMouth, 45, 0.0f, 1.0f);
98 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::CircleEyes), WarzoneFace::CircleEyes, 20, 0.0f, 1.0f);
99 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::CircleMouth), WarzoneFace::CircleMouth, 20, 0.0f, 1.0f);
100 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::DeadEyes), WarzoneFace::DeadEyes, 15, 0.0f, 1.0f);
101 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::DeadMouth), WarzoneFace::DeadMouth, 15, 0.0f, 1.0f);
102 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::HappyClosed), WarzoneFace::HappyClosed, 30, 0.0f, 1.0f);
103 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::SempaiEyes), WarzoneFace::SempaiEyes, 40, 0.0f, 1.0f);
104 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::SempaiMouth), WarzoneFace::SempaiMouth, 40, 0.0f, 1.0f);
105 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::UpsetEyes), WarzoneFace::UpsetEyes, 40, 0.0f, 1.0f);
106 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::UpsetMouth), WarzoneFace::UpsetMouth, 40, 0.0f, 1.0f);
107 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::Hide), WarzoneFace::Hide, 30, 0.0f, 1.0f);
108
109 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::vrc_v_aa), WarzoneFace::vrc_v_aa, 2, 0.0f, 1.0f);
110 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::vrc_v_ee), WarzoneFace::vrc_v_ee, 2, 0.0f, 1.0f);
111 eEA.AddParameter(pM.GetMorphWeightReference(WarzoneFace::vrc_v_oo), WarzoneFace::vrc_v_oo, 2, 0.0f, 1.0f);
112
113 eEA.AddParameter(pME.GetMorphWeightReference(WarzoneExtras::HideBlush), WarzoneExtras::HideBlush + 100, 30, 1.0f, 0.0f);
114 eEA.AddParameter(pME.GetMorphWeightReference(WarzoneExtras::HideZZZ), WarzoneExtras::HideZZZ + 100, 30, 1.0f, 0.0f);
115
116 eEA.AddParameter(&offsetFace, offsetFaceInd, 40, 0.0f, 1.0f);
117 eEA.AddParameter(&offsetFaceSA, offsetFaceIndSA, 40, 0.0f, 1.0f);
121 }
122
124 blink.AddParameter(pM.GetMorphWeightReference(WarzoneFace::Blink));
125 }
126
128 eEA.SetInterpolationMethod(WarzoneFace::vrc_v_aa, EasyEaseInterpolation::Linear);
129 eEA.SetInterpolationMethod(WarzoneFace::vrc_v_ee, EasyEaseInterpolation::Linear);
130 eEA.SetInterpolationMethod(WarzoneFace::vrc_v_oo, EasyEaseInterpolation::Linear);
131
132 eEA.SetInterpolationMethod(WarzoneFace::DeadEyes, EasyEaseInterpolation::Cosine);
133 eEA.SetInterpolationMethod(WarzoneFace::DeadMouth, EasyEaseInterpolation::Cosine);
134 eEA.SetInterpolationMethod(WarzoneFace::HappyClosed, EasyEaseInterpolation::Cosine);
135 eEA.SetInterpolationMethod(WarzoneFace::BasisMouth, EasyEaseInterpolation::Cosine);
136 eEA.SetInterpolationMethod(WarzoneFace::SempaiEyes, EasyEaseInterpolation::Cosine);
137 eEA.SetInterpolationMethod(WarzoneFace::SempaiMouth, EasyEaseInterpolation::Cosine);
138 eEA.SetInterpolationMethod(WarzoneFace::UpsetEyes, EasyEaseInterpolation::Cosine);
139 eEA.SetInterpolationMethod(WarzoneFace::UpsetMouth, EasyEaseInterpolation::Cosine);
140 eEA.SetInterpolationMethod(WarzoneFace::Hide, EasyEaseInterpolation::Cosine);
141
142 eEA.SetInterpolationMethod(WarzoneExtras::HideBlush + 100, EasyEaseInterpolation::Cosine);
143 eEA.SetInterpolationMethod(WarzoneExtras::HideZZZ + 100, EasyEaseInterpolation::Cosine);
144 }
145
163
165 blink.Update();
166 }
167
168 void Default(){//Default mouth
169 eEA.AddParameterFrame(WarzoneFace::BasisMouth, 1.0f);
170 blink.Play();
171 }
172
173 void UwU(){
174 eEA.AddParameterFrame(WarzoneFace::UwUEyes, 1.0f);
175 eEA.AddParameterFrame(WarzoneFace::UwUMouth, 1.0f);
176 blink.Pause();
177 }
178
179 void Spiral(){
180 eEA.AddParameterFrame(WarzoneFace::SpiralEyes, 1.0f);
181 eEA.AddParameterFrame(WarzoneFace::SpiralMouth, 1.0f);
182 blink.Pause();
184 }
185
186 void Happy(){
187 eEA.AddParameterFrame(WarzoneFace::HappyEyes, 1.0f);
188 eEA.AddParameterFrame(WarzoneFace::HappyMouth, 1.0f);
189 eEA.AddParameterFrame(WarzoneExtras::HideBlush + 100, 0.0f);
190 blink.Play();
191 }
192
193 void Dead(){
194 eEA.AddParameterFrame(WarzoneFace::DeadEyes, 1.0f);
195 eEA.AddParameterFrame(WarzoneFace::DeadMouth, 1.0f);
196 blink.Pause();
198 }
199
201 eEA.AddParameterFrame(WarzoneFace::HappyClosed, 1.0f);
202 blink.Play();
203 }
204
205 void Sleep(){
207
208 eEA.AddParameterFrame(WarzoneFace::Hide, 1.0f);
209 eEA.AddParameterFrame(WarzoneExtras::HideZZZ + 100, 0.0f);
210 blink.Pause();
211
212 pME.SetMorphWeight(WarzoneExtras::MoveZZZ, fGenMatM1Sleep.Update());
213 pME.SetMorphWeight(WarzoneExtras::Move2ZZZ, fGenMatM2Sleep.Update());
214 pME.SetMorphWeight(WarzoneExtras::ScaleZZZ, fGenMatS1Sleep.Update());
215 }
216
217 void Circle(){
218 eEA.AddParameterFrame(WarzoneFace::CircleEyes, 1.0f);
219 eEA.AddParameterFrame(WarzoneFace::CircleMouth, 1.0f);
220 blink.Pause();
221 }
222
223 void Blush(){
224 eEA.AddParameterFrame(WarzoneFace::SempaiEyes, 1.0f);
225 eEA.AddParameterFrame(WarzoneFace::SempaiMouth, 1.0f);
226 eEA.AddParameterFrame(WarzoneExtras::HideBlush + 100, 0.0f);
227 blink.Pause();
229 }
230
231 void Upset(){
232 eEA.AddParameterFrame(WarzoneFace::UpsetEyes, 1.0f);
233 eEA.AddParameterFrame(WarzoneFace::UpsetMouth, 1.0f);
234 blink.Pause();
236 }
237
244
251
258
261 eEA.AddParameterFrame(WarzoneFace::vrc_v_aa, MicrophoneFourierIT::GetCurrentMagnitude() / 2.0f);
262
263 if(MicrophoneFourierIT::GetCurrentMagnitude() > 0.05f){
264 voiceDetection.Update(MicrophoneFourierIT::GetFourierFiltered(), MicrophoneFourierIT::GetSampleRate());
265
273 }
274 }
275 }
276
278 switch(Menu::GetFaceColor()){
279 case 1: materialAnimator.AddMaterialFrame(redMaterial, 0.8f); break;
281 case 3: materialAnimator.AddMaterialFrame(whiteMaterial, 0.8f); break;
282 case 4: materialAnimator.AddMaterialFrame(greenMaterial, 0.8f); break;
283 case 5: materialAnimator.AddMaterialFrame(blueMaterial, 0.8f); break;
286 case 8: materialAnimator.AddMaterialFrame(rainbowSpiral, 0.8f); break;
287 case 9: materialAnimator.AddMaterialFrame(rainbowNoise, 0.8f); break;
288 default: break;
289 }
290 }
291
292public:
294 scene.AddObject(pM.GetObject());
295 scene.AddObject(pME.GetObject());
296 scene.AddObject(background.GetObject());
297 scene.AddObject(ledStripBackground.GetObject());
298
299 LinkEasyEase();
301
303
305
306 pM.GetObject()->SetMaterial(&materialAnimator);
307 pME.GetObject()->SetMaterial(&materialAnimator);
308 background.GetObject()->SetMaterial(&backgroundMaterial);
309 ledStripBackground.GetObject()->SetMaterial(&materialAnimator);
310
311
312
314
316 objA.SetMirrorX(true);
317 //objA.SetMirrorY(true);
318 }
319
320 void Initialize() override {
321 boop.Initialize(5);
322
323 MicrophoneFourierIT::Initialize(22, 8000, 50.0f, 120.0f);//8KHz sample rate, 50dB min, 120dB max
324 //Menu::Initialize(9);//NeoTrellis
325 Menu::Initialize(12, 0, 500);//7 is number of faces
326 }
327
328 void FadeIn(float stepRatio) override {}
329 void FadeOut(float stepRatio) override {}
330
332 return pM.GetObject();
333 }
334
337 }
338
339 uint8_t GetBrightness(){
340 return Menu::GetBrightness();
341 }
342
343 void Update(float ratio) override {
344 pM.Reset();
345 pME.Reset();
346
347 float xOffset = fGenMatXMove.Update();
348 float yOffset = fGenMatYMove.Update();
349
350 Menu::Update(ratio);
351
353
354 bool isBooped = Menu::UseBoopSensor() ? boop.isBooped() : 0;
355 uint8_t mode = Menu::GetFaceState();//change by button press
356
357 MicrophoneFourierIT::Update();
358 sA.SetHueAngle(ratio * 360.0f * 4.0f);
361
362 aRG.SetRadius((xOffset + 2.0f) * 2.0f + 25.0f);
363 aRG.SetSize(Vector2D((xOffset + 2.0f) * 10.0f + 50.0f, (xOffset + 2.0f) * 10.0f + 50.0f));
364 aRG.SetHueAngle(ratio * 360.0f * 8.0f);
365 aRG.SetRotation(ratio * 360.0f * 2.0f);
366 aRG.SetPosition(Vector2D(80.0f + xOffset * 4.0f, 48.0f + yOffset * 4.0f));
367
368 oSC.SetSize(Vector2D(200.0f, 100.0f));
369 oSC.SetHueAngle(ratio * 360.0f * 8.0f);
370 oSC.SetPosition(Vector2D(100.0f, 50.0f));
371
372 voiceDetection.SetThreshold(map(Menu::GetMicLevel(), 0, 10, 1000, 50));
373
375
376 if (isBooped){
377 Blush();
378 }
379 else{
380 if (mode == 0) Default();
381 else if (mode == 1) UwU();
382 else if (mode == 2) Spiral();
383 else if (mode == 3) Happy();
384 else if (mode == 4) Dead();
385 else if (mode == 5) HappyClosed();
386 else if (mode == 6) Sleep();
387 else if (mode == 7) Circle();
388 else if (mode == 8) Upset();
389 else if (mode == 9) {
390 aRG.Update(MicrophoneFourierIT::GetFourierFiltered());
392 }
393 else if (mode == 10){
394 oSC.Update(MicrophoneFourierIT::GetSamples());
396 }
397 else {
398 sA.Update(MicrophoneFourierIT::GetFourierFiltered());
400 }
401 }
402
404
405 eEA.Update();
406 pM.Update();
407 pME.Update();
408
409 rainbowNoise.Update(ratio);
410 rainbowSpiral.Update(ratio);
413
414 uint8_t faceSize = Menu::GetFaceSize();
415 float scale = Menu::ShowMenu() * 0.6f + 0.4f;
416 float faceSizeOffset = faceSize * 8.0f;
417
419 objA.SetEdgeMargin(4.0f);
420 objA.SetCameraMax(Vector2D(110.0f + faceSizeOffset, 115.0f - 115.0f * offsetFace).Multiply(scale));
421
422 objA.AlignObjects(scene.GetObjects(), 2);
423
424 pM.GetObject()->GetTransform()->SetPosition(Vector3D(xOffset, yOffset, 0.0f));
425 pM.GetObject()->UpdateTransform();
426 pME.GetObject()->GetTransform()->SetPosition(Vector3D(xOffset, yOffset, 0.0f));
427 pME.GetObject()->UpdateTransform();
428 }
429};
A class for managing the Adafruit APDS9960 sensor.
Definition APDS9960.h:27
static bool Initialize(uint8_t threshold)
Initializes the APDS9960 sensor.
Definition APDS9960.cpp:14
static bool isBooped()
Checks if the sensor is "booped" (close proximity detected).
Definition APDS9960.cpp:43
void AddParameter(float *parameter)
Adds a parameter to the animation track.
void Play()
Starts or resumes playback of the animation track.
void Pause()
Pauses playback of the animation track.
float Update()
Updates the animation track and returns the current parameter value.
A material class for creating an audio-reactive gradient effect.
void SetRadius(float radius)
Sets the radius for circular gradient patterns.
void SetPosition(Vector2D offset)
Sets the position of the gradient.
void Update(float *readData)
Updates the gradient based on new audio data.
void SetSize(Vector2D size)
Sets the size of the gradient.
void SetRotation(float angle)
Sets the rotation angle of the gradient.
void SetHueAngle(float hueAngle)
Sets the hue angle for color adjustments.
A template class for animating eye blinking using keyframes.
Definition BlinkTrack.h:27
A template class for implementing advanced animation easing.
void AddParameterFrame(uint16_t dictionaryValue, float value) override
Adds a single frame value for a parameter.
void Update() override
Updates the animator, advancing all animations.
void SetInterpolationMethod(uint16_t dictionaryValue, InterpolationMethod interpMethod) override
Sets the interpolation method for a specific parameter.
void AddParameter(float *parameter, uint16_t dictionaryValue, uint16_t frames, float basis, float goal) override
Adds a parameter to the animator.
Detects visemes based on FFT voice analysis.
float GetViseme(MouthShape viseme)
Retrieves the probability of a specific viseme.
void SetThreshold(float threshold)
Sets the threshold for formant calculations.
void Update(float *peaks, float maxFrequency)
Updates the viseme probabilities based on new FFT data.
A class to generate various waveform functions with customizable parameters.
@ Sine
Sine waveform.
@ Triangle
Triangle waveform.
float Update()
Updates and calculates the next value of the waveform.
Creates a customizable gradient material for rendering.
void SetRotationAngle(float rotationAngle)
Sets the rotation angle for the gradient.
Animates transitions and blends between multiple materials.
void AddMaterial(Material::Method method, Material *material, uint16_t frames, float minOpacity, float maxOpacity)
Adds a material to the animation with specified properties.
void SetBaseMaterial(Material::Method method, Material *material)
Sets the base material for the animation.
void AddMaterialFrame(Material &material, float opacity)
Adds a specific frame for a material in the animation.
void Update()
Updates the animator, advancing the transitions.
@ Lighten
Chooses the lighter color.
Definition Material.h:40
@ Add
Adds colors together.
Definition Material.h:35
@ Replace
Replaces the base color.
Definition Material.h:44
static uint8_t GetFaceState()
Retrieves the current face state. In hardware mode, it is read from the MenuHandler.
Definition Menu.cpp:381
static uint8_t GetFaceColor()
Gets the current face color index.
Definition Menu.cpp:453
static uint8_t GetMicLevel()
Gets the current microphone level.
Definition Menu.cpp:417
static float ShowMenu()
Returns how much of the menu is shown, typically normalized (0.0 to 1.0).
Definition Menu.cpp:494
static Material * GetMaterial()
Provides a pointer to the material used for rendering the menu text.
Definition Menu.cpp:155
static uint8_t MirrorSpectrumAnalyzer()
Checks if the spectrum analyzer mirroring is toggled on or off.
Definition Menu.cpp:435
static uint8_t GetFaceSize()
Gets the current face size.
Definition Menu.cpp:444
static void Initialize(uint8_t faceCount, uint8_t pin, uint16_t holdingTime, Vector2D size=Vector2D(240, 50))
Initializes the Menu using a face count, input pin, holding time, and size.
Definition Menu.cpp:102
static uint8_t UseMicrophone()
Checks if the microphone usage is toggled on or off.
Definition Menu.cpp:408
static uint8_t UseBoopSensor()
Checks if the boop sensor usage is toggled on or off.
Definition Menu.cpp:426
static void Update(float ratio)
Updates the menu each frame, handling transitions, wiggle effects, and text generation.
Definition Menu.cpp:208
static uint8_t GetBrightness()
Gets the current brightness level. In hardware mode, it is read from the MenuHandler.
Definition Menu.cpp:390
static uint8_t GetAccentBrightness()
Gets the current accent brightness level.
Definition Menu.cpp:399
Represents a 3D object with geometry, material, and transformation data.
Definition Object3D.h:28
Handles aligning and transforming 3D objects to fit within specified 2D camera bounds.
Definition ObjectAlign.h:24
void SetEdgeMargin(float edgeMargin)
Sets the margin to keep from the edges when aligning objects.
@ Stretch
Attempt to scale the object(s) to fill the entire area.
Definition ObjectAlign.h:43
void SetJustification(Justification jst)
Sets the justification mode for alignment.
void SetPlaneOffsetAngle(float offsetPlaneAngle)
Sets the additional rotation offset (plane offset angle), in degrees or radians, that will be applied...
void SetCameraMax(Vector2D camMax)
Updates the maximum bounds for the 2D camera region.
void AlignObjects(Object3D **objs, uint8_t numObjects)
Aligns multiple objects within the camera bounds, including scale factors.
void SetMirrorX(bool mirrorX)
Enables or disables mirroring along the X-axis for the aligned objects.
A dynamic oscilloscope material for visualizing audio signals.
void SetPosition(Vector2D offset)
Sets the position of the oscilloscope visualization.
void SetSize(Vector2D size)
Sets the size of the oscilloscope visualization.
void Update(float *data)
Updates the oscilloscope visualization based on new audio data.
void SetHueAngle(float hueAngle)
Sets the hue angle for color adjustments.
A mathematical construct representing a rotation in 3D space.
Definition Quaternion.h:30
Represents an RGB color and provides methods for manipulation.
Definition RGBColor.h:23
A dynamic material that creates a rainbow effect using simplex noise.
void Update(float ratio)
Updates the material animation based on the time ratio.
A dynamic material creating a colorful rainbow spiral animation.
void Update(float ratio)
Updates the material animation based on the time ratio.
A material that applies a single, solid RGB color to surfaces.
A material that visualizes audio data as a spectrum.
void SetMirrorYState(bool state)
Sets the mirroring state for the visualization.
void Update(float *readData)
Updates the spectrum visualization with new audio data.
void SetFlipYState(bool state)
Sets the flipping state for the visualization.
void SetHueAngle(float hueAngle)
Sets the hue adjustment angle for the spectrum colors.
Represents a 2D vector (X, Y) and provides methods for vector arithmetic.
Definition Vector2D.h:27
Represents a 3D vector (X, Y, Z) and provides methods for vector arithmetic.
Definition Vector3D.h:26
@ ER
Mouth shape corresponding to the "ER" sound.
@ OO
Mouth shape corresponding to the "OO" sound.
@ AH
Mouth shape corresponding to the "AH" sound.
@ UH
Mouth shape corresponding to the "UH" sound.
@ AR
Mouth shape corresponding to the "AR" sound.
@ EE
Mouth shape corresponding to the "EE" sound.
FunctionGenerator fGenMatHue
SimpleMaterial greenMaterial
FunctionGenerator fGenMatYMove
SpectrumAnalyzer sA
void Initialize() override
SimpleMaterial redMaterial
FunctionGenerator fGenMatS1Sleep
RainbowSpiral rainbowSpiral
SimpleMaterial blueMaterial
FunctionGenerator fGenMatRMenu
SimpleMaterial yellowMaterial
BlinkTrack< 1 > blink
FunctionGenerator fGenMatM2Sleep
LEDStripBackground ledStripBackground
GradientMaterial< 2 > gradientMat
FunctionGenerator fGenMatPos
FunctionGenerator fGenScale
FunctionGenerator fGenMatM1Sleep
FunctionGenerator fGenRotation
EasyEaseAnimator< 30 > eEA
SimpleMaterial orangeMaterial
FunctionGenerator fGenMatXMenu
void FadeIn(float stepRatio) override
void FadeOut(float stepRatio) override
RainbowNoise rainbowNoise
FunctionGenerator fGenMatYMenu
FunctionGenerator fGenMatXMove
MaterialAnimator< 10 > materialAnimator
SimpleMaterial purpleMaterial
void Update(float ratio) override
FFTVoiceDetection< 128 > voiceDetection
RGBColor gradientSpectrum[2]
MaterialAnimator< 4 > backgroundMaterial
SimpleMaterial whiteMaterial
AudioReactiveGradient aRG