ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
TechSaneAnimation.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 "../../Morph/NukudeFace.h"
8#include "../../Morph/TechSane.h"
9#include "../../Morph/TechSaneM.h"
10#include "../../Render/Scene.h"
11#include "../../Signals/FunctionGenerator.h"
12#include "../../Menu/Menu.h"
13#include "../../Sensors/BoopSensor.h"
14
15#include "../../Materials/Animated/RainbowNoise.h"
16#include "../../Materials/Animated/RainbowSpiral.h"
17#include "../../Materials/Animated/FlowNoise.h"
18#include "../../Materials/Animated/SpectrumAnalyzer.h"
19#include "../../Materials/Animated/AudioReactiveGradient.h"
20#include "../../Materials/Animated/Oscilloscope.h"
21
22#include "../../Materials/MaterialAnimator.h"
23
24#include "../AnimationTracks/BlinkTrack.h"
25
26#include "../../Signals/FFTVoiceDetection.h"
27
28#include "../../Sensors/MicrophoneFourier_MAX9814.h"
29
30class TechSaneAnimation : public Animation<4> {
31private:
32 NukudeFace pM;
33 TechSane tS;
34 TechSaneM tSM;
35 Background background;
36 EasyEaseAnimator<25> eEA = EasyEaseAnimator<25>(EasyEaseInterpolation::Overshoot, 1.0f, 0.35f);
37
38 //Materials
49
50 RGBColor gradientSpectrum[2] = {RGBColor(255, 0, 0), RGBColor(0, 0, 255)};
52
55
56 SpectrumAnalyzer sA = SpectrumAnalyzer(Vector2D(200, 100), Vector2D(100, 50), true, true);
59
60 //Animation controllers
62
69
73
74 BoopSensor boop;
75
77
78 float offsetFaceSA = 0.0f;
79 float offsetFaceARG = 0.0f;
80 float offsetFaceOSC = 0.0f;
81 float techSaneLogo = 0.0f;
82 uint8_t offsetFaceIndSA = 50;
83 uint8_t offsetFaceIndARG = 51;
84 uint8_t offsetFaceIndOSC = 52;
85 uint8_t techSaneLogoInd = 53;
86 bool mirror = false;
87
88 float xOffset = 0.0f;
89 float yOffset = 0.0f;
90 float adjustTS = 0.0f;
91
93 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Anger), NukudeFace::Anger, 15, 0.0f, 1.0f);
94 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Sadness), NukudeFace::Sadness, 50, 0.0f, 1.0f);
95 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Surprised), NukudeFace::Surprised, 10, 0.0f, 1.0f);
96 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Doubt), NukudeFace::Doubt, 25, 0.0f, 1.0f);
97 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Frown), NukudeFace::Frown, 45, 0.0f, 1.0f);
98 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookUp), NukudeFace::LookUp, 30, 0.0f, 1.0f);
99 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookDown), NukudeFace::LookDown, 30, 0.0f, 1.0f);
100
101 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ee), NukudeFace::vrc_v_ee, 2, 0.0f, 1.0f);
102 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ih), NukudeFace::vrc_v_ih, 2, 0.0f, 1.0f);
103 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_dd), NukudeFace::vrc_v_dd, 2, 0.0f, 1.0f);
104 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_rr), NukudeFace::vrc_v_rr, 2, 0.0f, 1.0f);
105 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ch), NukudeFace::vrc_v_ch, 2, 0.0f, 1.0f);
106 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_aa), NukudeFace::vrc_v_aa, 2, 0.0f, 1.0f);
107 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_oh), NukudeFace::vrc_v_oh, 2, 0.0f, 1.0f);
108 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ss), NukudeFace::vrc_v_ss, 2, 0.0f, 1.0f);
109
110 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::HideBlush), NukudeFace::HideBlush, 30, 1.0f, 0.0f);
111 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::HideBlush), NukudeFace::HideBlush, 30, 1.0f, 0.0f);
112
113 eEA.AddParameter(&offsetFaceSA, offsetFaceIndSA, 40, 0.0f, 1.0f);
116 eEA.AddParameter(&techSaneLogo, techSaneLogoInd, 40, 2.0f, 0.0f);
117 }
118
120 blink.AddParameter(pM.GetMorphWeightReference(NukudeFace::Blink));
121 }
122
124 eEA.SetInterpolationMethod(NukudeFace::HideBlush, EasyEaseInterpolation::Cosine);
125 eEA.SetInterpolationMethod(NukudeFace::Sadness, EasyEaseInterpolation::Cosine);
126
127 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ee, EasyEaseInterpolation::Linear);
128 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ih, EasyEaseInterpolation::Linear);
129 eEA.SetInterpolationMethod(NukudeFace::vrc_v_dd, EasyEaseInterpolation::Linear);
130 eEA.SetInterpolationMethod(NukudeFace::vrc_v_rr, EasyEaseInterpolation::Linear);
131 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ch, EasyEaseInterpolation::Linear);
132 eEA.SetInterpolationMethod(NukudeFace::vrc_v_aa, EasyEaseInterpolation::Linear);
133 eEA.SetInterpolationMethod(NukudeFace::vrc_v_oh, EasyEaseInterpolation::Linear);
134 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ss, EasyEaseInterpolation::Linear);
135 }
136
154
156 blink.Update();
157 }
158
159 void Default(){}
160
161 void Angry(){
162 eEA.AddParameterFrame(NukudeFace::Anger, 1.0f);
164 }
165
166 void Sad(){
167 eEA.AddParameterFrame(NukudeFace::Sadness, 1.0f);
168 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
170 }
171
172 void Surprised(){
173 eEA.AddParameterFrame(NukudeFace::Surprised, 1.0f);
174 eEA.AddParameterFrame(NukudeFace::HideBlush, 0.0f);
176 }
177
178 void Doubt(){
179 eEA.AddParameterFrame(NukudeFace::Doubt, 1.0f);
180 }
181
182 void Frown(){
183 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
184 }
185
186 void LookUp(){
187 eEA.AddParameterFrame(NukudeFace::LookUp, 1.0f);
188 }
189
190 void LookDown(){
191 eEA.AddParameterFrame(NukudeFace::LookDown, 1.0f);
192 }
193
199
205
211
215
233
235 switch(Menu::GetFaceColor()){
236 case 1: materialAnimator.AddMaterialFrame(redMaterial, 0.8f); break;
238 case 3: materialAnimator.AddMaterialFrame(whiteMaterial, 0.8f); break;
239 case 4: materialAnimator.AddMaterialFrame(greenMaterial, 0.8f); break;
240 case 5: materialAnimator.AddMaterialFrame(blueMaterial, 0.8f); break;
243 case 8: materialAnimator.AddMaterialFrame(rainbowSpiral, 0.8f); break;
244 case 9: materialAnimator.AddMaterialFrame(rainbowNoise, 0.8f); break;
245 default: break;
246 }
247 }
248
249public:
251 scene.AddObject(pM.GetObject());
252 scene.AddObject(tS.GetObject());
253 scene.AddObject(tSM.GetObject());
254 scene.AddObject(background.GetObject());
255
256 LinkEasyEase();
258
260
262
263 pM.GetObject()->SetMaterial(&materialAnimator);
264 background.GetObject()->SetMaterial(&backgroundMaterial);
265 tS.GetObject()->SetMaterial(&flowNoise);
266 tSM.GetObject()->SetMaterial(&flowNoise);
267
268 boop.Initialize(5);
269
270 MicrophoneFourier::Initialize(A0, 8000, 50.0f, 120.0f);//8KHz sample rate, 50dB min, 120dB max
271 Menu::Initialize(10, 20, 500);//7 is number of faces
272 }
273
274 void FadeIn(float stepRatio) override {}
275 void FadeOut(float stepRatio) override {}
276
278 return pM.GetObject();
279 }
280
282 this->mirror = mirror;
283 }
284
285 void Update(float ratio) override {
286 if(!mirror){
287 gradientSpectrum[0].SetColor(253, 253, 251);
288 gradientSpectrum[1].SetColor(0, 80, 175);
290
291 pM.Reset();
292
295
296 Menu::Update();
297
299
300 bool isBooped = Menu::UseBoopSensor() ? boop.isBooped() : 0;
301 uint8_t mode = Menu::GetFaceState();//change by button press
302
304 sA.SetHueAngle(ratio * 360.0f * 4.0f);
307
308 aRG.SetRadius((xOffset + 2.0f) * 2.0f + 25.0f);
309 aRG.SetSize(Vector2D((xOffset + 2.0f) * 10.0f + 50.0f, (xOffset + 2.0f) * 10.0f + 50.0f));
310 aRG.SetHueAngle(ratio * 360.0f * 8.0f);
311 aRG.SetRotation(ratio * 360.0f * 2.0f);
312 aRG.SetPosition(Vector2D(80.0f + xOffset * 4.0f, 48.0f + yOffset * 4.0f));
313
314 oSC.SetSize(Vector2D(200.0f, 100.0f));
315 oSC.SetHueAngle(ratio * 360.0f * 8.0f);
316 oSC.SetPosition(Vector2D(100.0f, 50.0f));
317
319
320 if (isBooped && mode != 6){
321 Surprised();
322 }
323 else{
324 if (mode == 0) Default();
325 else if (mode == 1) Angry();
326 else if (mode == 2) Doubt();
327 else if (mode == 3) Frown();
328 else if (mode == 4) LookUp();
329 else if (mode == 5) Sad();
330 else if (mode == 6) TechSaneFace();
331 else if (mode == 7) {
334 }
335 else if (mode == 8){
338 }
339 else {
342 }
343 }
344
346
347 pM.SetMorphWeight(NukudeFace::BiggerNose, 1.0f);
348 pM.SetMorphWeight(NukudeFace::MoveEye, 1.0f);
349
350 eEA.Update();
351 pM.Update();
352 tS.Update();
353
354 rainbowNoise.Update(ratio);
355 flowNoise.Update(ratio);
356 rainbowSpiral.Update(ratio);
359
360 uint8_t faceSize = 0;//Menu::GetFaceSize();
361 float menuRatio = Menu::ShowMenu();
362 float scale = menuRatio * 0.6f + 0.4f;
363 float xShift = (1.0f - menuRatio) * 60.0f;
364 float yShift = (1.0f - menuRatio) * 20.0f + offsetFaceSA * -100.0f + offsetFaceARG * -100.0f + offsetFaceOSC * -100.0f + (2.0f - techSaneLogo) * -50.0f;
365 float adjustFacePos = float(4 - faceSize) * 5.0f;
366 float adjustFaceX = float(faceSize) * 0.05f;
367
368 pM.GetObject()->GetTransform()->SetRotation(Vector3D(0.0f, 0.0f, -7.5f));
369 pM.GetObject()->GetTransform()->SetPosition(Vector3D(102.5f + xOffset - xShift + adjustFacePos, -22.5f + yOffset + yShift, 600.0f));
370 pM.GetObject()->GetTransform()->SetScale(Vector3D(-1.05f + adjustFaceX, 0.585f, 0.8f).Multiply(scale));
371
372 pM.GetObject()->UpdateTransform();
373
374 adjustTS = 1.0f - (float(faceSize) * 0.15f);
375
376 tS.GetObject()->GetTransform()->SetPosition(Vector3D(xOffset / 2.0f, 5.0f + yOffset / 2.0f - techSaneLogo * 30.0f, 300.0f));
377 tS.GetObject()->GetTransform()->SetScale(Vector3D(1.0f * adjustTS + xOffset / 40.0f, 1.15f - techSaneLogo, 1.0f));
378
379 tS.GetObject()->UpdateTransform();
380
381 tS.GetObject()->Enable();
382 tSM.GetObject()->Disable();
383 }
384 else{
385 gradientSpectrum[0].SetColor(253, 253, 251);
386 gradientSpectrum[1].SetColor(175, 40, 120);
388
389 tSM.Update();
390
391 tSM.GetObject()->GetTransform()->SetPosition(Vector3D(xOffset / 2.0f, 5.0f + yOffset / 2.0f - techSaneLogo * 30.0f, 300.0f));
392 tSM.GetObject()->GetTransform()->SetScale(Vector3D(1.0f * adjustTS + xOffset / 40.0f, 1.15f - techSaneLogo, 1.0f));
393
394 tSM.GetObject()->UpdateTransform();
395
396 tS.GetObject()->Disable();
397 tSM.GetObject()->Enable();
398 }
399 }
400};
void AddParameter(float *parameter)
Adds a parameter to 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 Update(float *peaks, float maxFrequency)
Updates the viseme probabilities based on new FFT data.
A dynamic simplex noise gradient material for a flowing effect.
Definition FlowNoise.h:27
void Update(float ratio)
Updates the material's state based on the provided time ratio.
Definition FlowNoise.cpp:8
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 UpdateRGB()
Updates the RGB colors in 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 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 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 float GetCurrentMagnitude()
Retrieves the current signal magnitude.
static float GetSampleRate()
Retrieves the current sampling rate.
static float * GetSamples()
Retrieves the raw input samples.
static float * GetFourierFiltered()
Retrieves the filtered FFT output data.
static void Initialize(uint8_t pin, uint32_t sampleRate, float minDB, float maxDB)
Initializes the microphone and FFT system with basic parameters.
static void Update()
Updates the microphone system, processing new samples and performing FFT.
Represents a 3D object with geometry, material, and transformation data.
Definition Object3D.h:28
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.
Represents an RGB color and provides methods for manipulation.
Definition RGBColor.h:23
void SetColor(const uint8_t &R, const uint8_t &G, const uint8_t &B)
Sets the RGB values of the color.
Definition RGBColor.cpp: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.
FunctionGenerator fGenMatHue
SimpleMaterial greenMaterial
FunctionGenerator fGenMatYMove
SpectrumAnalyzer sA
SimpleMaterial redMaterial
RainbowSpiral rainbowSpiral
SimpleMaterial blueMaterial
FunctionGenerator fGenMatRMenu
SimpleMaterial yellowMaterial
EasyEaseAnimator< 25 > eEA
BlinkTrack< 1 > blink
GradientMaterial< 2 > gradientMat
FunctionGenerator fGenMatPos
FunctionGenerator fGenScale
FunctionGenerator fGenRotation
SimpleMaterial orangeMaterial
FunctionGenerator fGenMatXMenu
void SetCameraMirror(bool mirror)
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
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.