ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
BroookAnimation.h
Go to the documentation of this file.
1#pragma once
2
3#include "../Animation.h"
4#include "../KeyFrameTrack.h"
5#include "../EasyEaseAnimator.h"
6#include "../../Objects/Background.h"
7#include "../../Objects/LEDStripBackground.h"
8#include "../../Morph/Commissions/BroookFace.h"
9#include "../../Morph/Commissions/BroookExtras.h"
10#include "../../Render/Scene.h"
11#include "../../Signals/FunctionGenerator.h"
12#include "../../Menu/SingleButtonMenu.h"
13#include "../../Sensors/APDS9960.h"
14
15#include "../../Materials/Animated/RainbowNoise.h"
16#include "../../Materials/Animated/RainbowSpiral.h"
17#include "../../Materials/Animated/SpectrumAnalyzer.h"
18#include "../../Materials/Animated/AudioReactiveGradient.h"
19#include "../../Materials/Animated/Oscilloscope.h"
20
21#include "../../Materials/MaterialAnimator.h"
22
23#include "../AnimationTracks/BlinkTrack.h"
24
25#include "../../Signals/FFTVoiceDetection.h"
26
27#include "../../Sensors/MicrophoneFourier_MAX9814.h"
28
29#include "../../Render/ObjectAlign.h"
30
31#include "Flash/ImageSequences/BadApple.h"
32
33class BroookAnimation : public Animation<4> {
34private:
35 BroookFace pM;
36 BroookExtras pME;
37 Background background;
38 LEDStripBackground ledStripBackground;
39 EasyEaseAnimator<25> eEA = EasyEaseAnimator<25>(EasyEaseInterpolation::Overshoot, 1.0f, 0.35f);
40
41 bool boopExists = false;
42
43 //Materials
53
54 RGBColor gradientSpectrum[2] = {RGBColor(222, 217, 141), RGBColor(100, 120, 211)};
56
59
60 SpectrumAnalyzer sA = SpectrumAnalyzer(Vector2D(200, 100), Vector2D(100, 50), true, true);
63 BadAppleSequence gif = BadAppleSequence(Vector2D(200, 145), Vector2D(100, 70), 18);
64
65 //Animation controllers
67
74
78
80
82
83 ObjectAlign objA = ObjectAlign(Vector2D(0.0f, 0.0f), Vector2D(189.0f, 93.0f), Quaternion());
84
85 float offsetFace = 0.0f;
86 float offsetFaceSA = 0.0f;
87 float offsetFaceARG = 0.0f;
88 float offsetFaceOSC = 0.0f;
89 float offsetFaceBad = 0.0f;
90 uint8_t offsetFaceInd = 50;
91 uint8_t offsetFaceIndSA = 51;
92 uint8_t offsetFaceIndARG = 52;
93 uint8_t offsetFaceIndOSC = 53;
94 uint8_t offsetFaceIndBad = 54;
95
97 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Determined2), BroookFace::Determined2, 15, 0.0f, 1.0f);
98 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Upset3), BroookFace::Upset3, 15, 0.0f, 1.0f);
99 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Sleepy4), BroookFace::Sleepy4, 50, 0.0f, 1.0f);
100 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Sad5), BroookFace::Sad5, 50, 0.0f, 1.0f);
101 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Happy6), BroookFace::Happy6, 15, 0.0f, 1.0f);
102 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Flustered7), BroookFace::Flustered7, 45, 0.0f, 1.0f);
103 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Dot8), BroookFace::Dot8, 30, 0.0f, 1.0f);
104 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Heart9), BroookFace::Heart9, 30, 0.0f, 1.0f);
105 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Dead10), BroookFace::Dead10, 30, 0.0f, 1.0f);
106 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::Question11), BroookFace::Question11, 30, 0.0f, 1.0f);
107
108 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::vrc_v_ee), BroookFace::vrc_v_ee, 2, 0.0f, 1.0f);
109 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::vrc_v_aa), BroookFace::vrc_v_aa, 2, 0.0f, 1.0f);
110 eEA.AddParameter(pM.GetMorphWeightReference(BroookFace::vrc_v_oh), BroookFace::vrc_v_oh, 2, 0.0f, 1.0f);
111
112 eEA.AddParameter(pME.GetMorphWeightReference(BroookExtras::Heart), BroookExtras::Heart + 100, 30, 0.0f, 1.0f);
113 eEA.AddParameter(pME.GetMorphWeightReference(BroookExtras::Dead), BroookExtras::Dead + 100, 30, 0.0f, 1.0f);
114 eEA.AddParameter(pME.GetMorphWeightReference(BroookExtras::Sleepy), BroookExtras::Sleepy + 100, 50, 0.0f, 1.0f);
115 eEA.AddParameter(pME.GetMorphWeightReference(BroookExtras::Happy), BroookExtras::Happy + 100, 15, 0.0f, 1.0f);
116 eEA.AddParameter(pME.GetMorphWeightReference(BroookExtras::Sad), BroookExtras::Sad + 100, 50, 0.0f, 1.0f);
117 eEA.AddParameter(pME.GetMorphWeightReference(BroookExtras::None), BroookExtras::None + 100, 30, 0.0f, 1.0f);
118
119 eEA.AddParameter(&offsetFace, offsetFaceInd, 40, 0.0f, 1.0f);
120 eEA.AddParameter(&offsetFaceSA, offsetFaceIndSA, 40, 0.0f, 1.0f);
124 }
125
127 blink.AddParameter(pM.GetMorphWeightReference(BroookFace::Blink));
128 }
129
131 eEA.SetInterpolationMethod(BroookFace::vrc_v_ee, EasyEaseInterpolation::Linear);
132 eEA.SetInterpolationMethod(BroookFace::vrc_v_aa, EasyEaseInterpolation::Linear);
133 eEA.SetInterpolationMethod(BroookFace::vrc_v_oh, EasyEaseInterpolation::Linear);
134
135 //eEA.SetInterpolationMethod(BroookFace::Determined2, EasyEaseInterpolation::Cosine);
136 eEA.SetInterpolationMethod(BroookFace::Upset3, EasyEaseInterpolation::Cosine);
137 eEA.SetInterpolationMethod(BroookFace::Sleepy4, EasyEaseInterpolation::Cosine);
138 eEA.SetInterpolationMethod(BroookFace::Sad5, EasyEaseInterpolation::Cosine);
139 eEA.SetInterpolationMethod(BroookFace::Happy6, EasyEaseInterpolation::Cosine);
140 //eEA.SetInterpolationMethod(BroookFace::Flustered7, EasyEaseInterpolation::Cosine);
141 eEA.SetInterpolationMethod(BroookFace::Dot8, EasyEaseInterpolation::Cosine);
142 eEA.SetInterpolationMethod(BroookFace::Heart9, EasyEaseInterpolation::Cosine);
143 //eEA.SetInterpolationMethod(BroookFace::Dead10, EasyEaseInterpolation::Cosine);
144 eEA.SetInterpolationMethod(BroookFace::Question11, EasyEaseInterpolation::Cosine);
145
146 eEA.SetInterpolationMethod(BroookExtras::Heart + 100, EasyEaseInterpolation::Cosine);
147 //eEA.SetInterpolationMethod(BroookExtras::Dead, EasyEaseInterpolation::Cosine);
148 eEA.SetInterpolationMethod(BroookExtras::Sleepy + 100, EasyEaseInterpolation::Cosine);
149 eEA.SetInterpolationMethod(BroookExtras::Happy + 100, EasyEaseInterpolation::Cosine);
150 eEA.SetInterpolationMethod(BroookExtras::Sad + 100, EasyEaseInterpolation::Cosine);
151 eEA.SetInterpolationMethod(BroookExtras::None + 100, EasyEaseInterpolation::Cosine);
152 }
153
172
174 blink.Update();
175 }
176
177 void Default(){
178 eEA.AddParameterFrame(BroookExtras::None + 100, 1.0f);
179 blink.Play();
180 }
181
183 eEA.AddParameterFrame(BroookFace::Determined2, 1.0f);
184 eEA.AddParameterFrame(BroookExtras::None + 100, 1.0f);
185 blink.Play();
186 }
187
188 void Upset(){
189 eEA.AddParameterFrame(BroookFace::Upset3, 1.0f);
190 eEA.AddParameterFrame(BroookExtras::None + 100, 1.0f);
191 blink.Play();
193 }
194
195 void Sleepy(){
196 eEA.AddParameterFrame(BroookFace::Sleepy4, 1.0f);
197 eEA.AddParameterFrame(BroookExtras::Sleepy + 100, 1.0f);
198 blink.Pause();
199 }
200
201 void Sad(){
202 eEA.AddParameterFrame(BroookFace::Sad5, 1.0f);
203 eEA.AddParameterFrame(BroookExtras::Sad + 100, 1.0f);
204 blink.Play();
206 }
207
208 void Happy(){
209 eEA.AddParameterFrame(BroookFace::Happy6, 0.8f);
210 eEA.AddParameterFrame(BroookExtras::Happy + 100, 0.8f);
211 blink.Pause();
213 }
214
215 void Flustered(){
216 eEA.AddParameterFrame(BroookFace::Flustered7, 1.0f);
217 eEA.AddParameterFrame(BroookExtras::None + 100, 1.0f);
218 blink.Pause();
219
220
221 eEA.AddParameterFrame(BroookFace::Dead10, 0.0f);
222 eEA.AddParameterFrame(BroookExtras::Dead + 100, 0.0f);
223 }
224
225 void Dot(){
226 eEA.AddParameterFrame(BroookFace::Dot8, 0.95f);
227 eEA.AddParameterFrame(BroookExtras::None + 100, 0.95f);
228 blink.Play();
229 }
230
231 void Heart(){
232 eEA.AddParameterFrame(BroookFace::Heart9, 1.0f);
233 eEA.AddParameterFrame(BroookExtras::Heart + 100, 1.0f);
234 blink.Pause();
236 }
237
238 void Dead(){
239 eEA.AddParameterFrame(BroookFace::Dead10, 1.0f);
240 eEA.AddParameterFrame(BroookExtras::Dead + 100, 1.0f);
241 blink.Pause();
243 }
244
245 void Question(){
246 eEA.AddParameterFrame(BroookFace::Question11, 1.0f);
247 blink.Pause();
248 //Default Extra face
249 }
250
257
264
271
278
281 eEA.AddParameterFrame(BroookFace::vrc_v_aa, MicrophoneFourierIT::GetCurrentMagnitude() / 2.0f);
282
283 if(MicrophoneFourierIT::GetCurrentMagnitude() > 0.05f){
284 voiceDetection.Update(MicrophoneFourierIT::GetFourierFiltered(), MicrophoneFourierIT::GetSampleRate());
285
293 }
294 }
295 }
296
298 switch(Menu::GetFaceColor()){
299 case 1: materialAnimator.AddMaterialFrame(redMaterial, 0.8f); break;
301 case 3: materialAnimator.AddMaterialFrame(whiteMaterial, 0.8f); break;
302 case 4: materialAnimator.AddMaterialFrame(greenMaterial, 0.8f); break;
303 case 5: materialAnimator.AddMaterialFrame(blueMaterial, 0.8f); break;
306 case 8: materialAnimator.AddMaterialFrame(rainbowSpiral, 0.8f); break;
307 case 9: materialAnimator.AddMaterialFrame(rainbowNoise, 0.8f); break;
308 default: break;
309 }
310 }
311
312public:
314 scene.AddObject(pM.GetObject());
315 scene.AddObject(pME.GetObject());
316 scene.AddObject(background.GetObject());
317 scene.AddObject(ledStripBackground.GetObject());
318
319 LinkEasyEase();
321
323
325
326 pM.GetObject()->SetMaterial(&materialAnimator);
327 pME.GetObject()->SetMaterial(&materialAnimator);
328 background.GetObject()->SetMaterial(&backgroundMaterial);
329 ledStripBackground.GetObject()->SetMaterial(&materialAnimator);
330
332
334 objA.SetMirrorX(true);
335 objA.SetMirrorY(true);
336 }
337
338 void Initialize() override {
339 this->boopExists = boop.Initialize(5);
340
341 MicrophoneFourierIT::Initialize(A0, 8000, 50.0f, 120.0f);//8KHz sample rate, 50dB min, 120dB max
342 Menu::Initialize(14, 20, 500);//13 is number of faces
343 }
344
347 };
348
349 uint8_t GetBrightness(){
350 return Menu::GetBrightness();
351 };
352
353 void FadeIn(float stepRatio) override {}
354 void FadeOut(float stepRatio) override {}
355
357 return pM.GetObject();
358 }
359
360 void Update(float ratio) override {
361 pM.Reset();
362 pME.Reset();
363
364 float xOffset = fGenMatXMove.Update();
365 float yOffset = fGenMatYMove.Update();
366
367 Menu::Update(ratio);
368
370
371 bool isBooped = Menu::UseBoopSensor() ? boop.isBooped() : 0;
372 uint8_t mode = Menu::GetFaceState();//change by button press
373
374 MicrophoneFourierIT::Update();
375 sA.SetHueAngle(ratio * 360.0f * 4.0f);
378
379 aRG.SetRadius((xOffset + 2.0f) * 2.0f + 25.0f);
380 aRG.SetSize(Vector2D((xOffset + 2.0f) * 10.0f + 50.0f, (xOffset + 2.0f) * 10.0f + 50.0f));
381 aRG.SetHueAngle(ratio * 360.0f * 8.0f);
382 aRG.SetRotation(ratio * 360.0f * 2.0f);
383 aRG.SetPosition(Vector2D(80.0f + xOffset * 4.0f, 48.0f + yOffset * 4.0f));
384
385 oSC.SetSize(Vector2D(200.0f, 100.0f));
386 oSC.SetHueAngle(ratio * 360.0f * 8.0f);
387 oSC.SetPosition(Vector2D(100.0f, 50.0f));
388
389 gif.SetPosition(Vector2D(96.0f, 48.0f));
390 gif.SetSize(Vector2D(191.0f, 95.0f));
391 //gif.SetRotation(15.0f);
392 gif.Update();
393
394 voiceDetection.SetThreshold(map(Menu::GetMicLevel(), 0, 10, 1000, 50));
395
397
398 if (isBooped){
399 Happy();
400 }
401 else{
402 if (mode == 0) Default();
403 else if (mode == 1) Determined();
404 else if (mode == 2) Upset();
405 else if (mode == 3) Sleepy();
406 else if (mode == 4) Sad();
407 else if (mode == 5) Flustered();
408 else if (mode == 6) Dot();
409 else if (mode == 7) Heart();
410 else if (mode == 8) Dead();
411 else if (mode == 9) Question();
412 else if (mode == 10) {
413 aRG.Update(MicrophoneFourierIT::GetFourierFiltered());
415 }
416 else if (mode == 11){
417 oSC.Update(MicrophoneFourierIT::GetSamples());
419 }
420 else if (mode == 12){
421 sA.Update(MicrophoneFourierIT::GetFourierFiltered());
423 }
424 else{
425 BadAppleFace();
426 }
427 }
428
430
431 eEA.Update();
432 pM.Update();
433 pME.Update();
434
435 float menuRatio = Menu::ShowMenu();
436
437 rainbowNoise.Update(ratio);
438 rainbowSpiral.Update(ratio);
441
442 uint8_t faceSize = Menu::GetFaceSize();
443
444 float scale = menuRatio * 0.6f + 0.4f;
445 float faceSizeOffset = faceSize * 8.0f;
446
448 objA.SetEdgeMargin(2.0f);
449 objA.SetCameraMax(Vector2D(110.0f + faceSizeOffset, 93.0f).Multiply(scale));
450
451 objA.AlignObjects(scene.GetObjects(), 2);
452
453 pM.GetObject()->GetTransform()->SetPosition(Vector3D(xOffset, yOffset - 93.0f * offsetFace, 0.0f));
454 pM.GetObject()->UpdateTransform();
455 pME.GetObject()->GetTransform()->SetPosition(Vector3D(xOffset, yOffset - 93.0f * offsetFace, 0.0f));
456 pME.GetObject()->UpdateTransform();
457 }
458};
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
FunctionGenerator fGenMatHue
SimpleMaterial greenMaterial
FunctionGenerator fGenMatYMove
SpectrumAnalyzer sA
MaterialAnimator< 5 > backgroundMaterial
Oscilloscope oSC
void Initialize() override
SimpleMaterial redMaterial
BadAppleSequence gif
RainbowSpiral rainbowSpiral
SimpleMaterial blueMaterial
FunctionGenerator fGenMatRMenu
void AudioReactiveGradientFace()
SimpleMaterial yellowMaterial
EasyEaseAnimator< 25 > eEA
BlinkTrack< 1 > blink
LEDStripBackground ledStripBackground
void ChangeInterpolationMethods()
GradientMaterial< 2 > gradientMat
FunctionGenerator fGenMatPos
FunctionGenerator fGenScale
Background background
FunctionGenerator fGenRotation
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]
uint8_t GetBrightness()
uint8_t GetAccentBrightness()
Object3D * GetObject()
SimpleMaterial whiteMaterial
BroookExtras pME
AudioReactiveGradient aRG
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.
void SetMirrorY(bool mirrorY)
Enables or disables mirroring along the Y-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.