ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
WaffleDaProtoAnimation.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 "../../Render/Scene.h"
9#include "../../Signals/FunctionGenerator.h"
10#include "../../Sensors/MenuButtonHandler.h"
11#include "../../Sensors/BoopSensor.h"
12
13#include "../../Materials/Animated/SpectrumAnalyzer.h"
14#include "../../Materials/Animated/RainbowNoise.h"
15#include "../../Materials/Animated/RainbowSpiral.h"
16
17#include "../../Materials/CombineMaterial.h"
18
19#include "../AnimationTracks/BlinkTrack.h"
20
21#include "../../Signals/FFTVoiceDetection.h"
22
23class WaffleDaProtoAnimation : public Animation<2> {
24private:
25 NukudeFace pM;
26 Background background;
27 EasyEaseAnimator<20> eEA = EasyEaseAnimator<20>(EasyEaseInterpolation::Overshoot, 1.0f, 0.35f);
28
29 //Materials
33
34 RGBColor gradientSpectrum[2] = {RGBColor(221, 15, 125), RGBColor(214, 35, 168)};
36
38
39 SpectrumAnalyzer sA = SpectrumAnalyzer(22, Vector2D(250, 200), Vector2D(120, 100), true, true);
40
41 //Animation controllers
43
49
50 BoopSensor boop;
51 float rainbowFaceMix = 0.0f;
52 float angryFaceMix = 0.0f;
53 uint8_t rainbowFaceIndex = 50;
54 uint8_t angryFaceIndex = 51;
55
57
59 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Anger), NukudeFace::Anger, 60, 0.0f, 1.0f);
60 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Sadness), NukudeFace::Sadness, 60, 0.0f, 1.0f);
61 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Surprised), NukudeFace::Surprised, 60, 0.0f, 1.0f);
62 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Doubt), NukudeFace::Doubt, 60, 0.0f, 1.0f);
63 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Frown), NukudeFace::Frown, 60, 0.0f, 1.0f);
64 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookUp), NukudeFace::LookUp, 60, 0.0f, 1.0f);
65 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookDown), NukudeFace::LookDown, 60, 0.0f, 1.0f);
66
67 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ee), NukudeFace::vrc_v_ee, 2, 0.0f, 1.0f);
68 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ih), NukudeFace::vrc_v_ih, 2, 0.0f, 1.0f);
69 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_dd), NukudeFace::vrc_v_dd, 2, 0.0f, 1.0f);
70 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_rr), NukudeFace::vrc_v_rr, 2, 0.0f, 1.0f);
71 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ch), NukudeFace::vrc_v_ch, 2, 0.0f, 1.0f);
72 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_aa), NukudeFace::vrc_v_aa, 2, 0.0f, 1.0f);
73 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_oh), NukudeFace::vrc_v_oh, 2, 0.0f, 1.0f);
74 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ss), NukudeFace::vrc_v_ss, 2, 0.0f, 1.0f);
75
76 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::HideBlush), NukudeFace::HideBlush, 30, 1.0f, 0.0f);
77
80 }
81
83 blink.AddParameter(pM.GetMorphWeightReference(NukudeFace::Blink));
84 }
85
87 eEA.SetInterpolationMethod(NukudeFace::HideBlush, EasyEaseInterpolation::Cosine);
88 eEA.SetInterpolationMethod(NukudeFace::Sadness, EasyEaseInterpolation::Cosine);
89 eEA.SetInterpolationMethod(rainbowFaceIndex, EasyEaseInterpolation::Cosine);
90 eEA.SetInterpolationMethod(angryFaceIndex, EasyEaseInterpolation::Cosine);
91
92 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ee, EasyEaseInterpolation::Linear);
93 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ih, EasyEaseInterpolation::Linear);
94 eEA.SetInterpolationMethod(NukudeFace::vrc_v_dd, EasyEaseInterpolation::Linear);
95 eEA.SetInterpolationMethod(NukudeFace::vrc_v_rr, EasyEaseInterpolation::Linear);
96 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ch, EasyEaseInterpolation::Linear);
97 eEA.SetInterpolationMethod(NukudeFace::vrc_v_aa, EasyEaseInterpolation::Linear);
98 eEA.SetInterpolationMethod(NukudeFace::vrc_v_oh, EasyEaseInterpolation::Linear);
99 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ss, EasyEaseInterpolation::Linear);
100 }
101
108
109public:
111 scene.AddObject(pM.GetObject());
112 scene.AddObject(background.GetObject());
113
114 LinkEasyEase();
116
118
119 SetMaterials();
120
121 pM.GetObject()->SetMaterial(&faceMaterial);
122
123 MenuButtonHandler::Initialize(0, 7, 1000);//7 is number of faces
124 boop.Initialize(5);
125
126 background.GetObject()->SetMaterial(&sA);
127 }
128
130 blink.Update();
131 }
132
133 void Default(){}
134
135 void Angry(){
136 eEA.AddParameterFrame(NukudeFace::Anger, 1.0f);
138 }
139
140 void Sad(){
141 eEA.AddParameterFrame(NukudeFace::Sadness, 1.0f);
142 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
143 }
144
145 void Surprised(){
146 eEA.AddParameterFrame(NukudeFace::Surprised, 1.0f);
147 eEA.AddParameterFrame(NukudeFace::HideBlush, 0.0f);
149 }
150
151 void Doubt(){
152 eEA.AddParameterFrame(NukudeFace::Doubt, 1.0f);
153 }
154
155 void Frown(){
156 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
157 }
158
159 void LookUp(){
160 eEA.AddParameterFrame(NukudeFace::LookUp, 1.0f);
161 }
162
163 void LookDown(){
164 eEA.AddParameterFrame(NukudeFace::LookDown, 1.0f);
165 }
166
168 pM.GetObject()->Disable();
169 background.GetObject()->Enable();
170 }
171
172 void FadeIn(float stepRatio) override {}
173 void FadeOut(float stepRatio) override {}
174
176 return pM.GetObject();
177 }
178
196
197 void Update(float ratio) override {
198 pM.Reset();
199 pM.GetObject()->Enable();
200 background.GetObject()->Disable();
201
202 bool isBooped = MenuButtonHandler::UseBoopSensor() ? boop.isBooped() : 0;
203 uint8_t mode = MenuButtonHandler::GetFaceState();//change by button press
204
207 sA.SetHueAngle(ratio * 360.0f * 4.0f);
208 sA.SetMirrorYState(MenuButtonHandler::MirrorSpectrumAnalyzer());
209 sA.SetFlipYState(!MenuButtonHandler::MirrorSpectrumAnalyzer());
210
212
213 if (isBooped && mode != 6){
214 Surprised();
215 }
216 else{
217 if (mode == 0) Default();
218 else if (mode == 1) Angry();
219 else if (mode == 2) Doubt();
220 else if (mode == 3) Frown();
221 else if (mode == 4) LookUp();
222 else if (mode == 5) Sad();
224 }
225
227
228 pM.SetMorphWeight(NukudeFace::BiggerNose, 1.0f);
229 pM.SetMorphWeight(NukudeFace::MoveEye, 1.0f);
230
231 eEA.Update();
232 pM.Update();
233
234 rainbowNoise.Update(ratio);
235 rainbowSpiral.Update(ratio);
236
237 faceMaterial.SetOpacity(2, rainbowFaceMix);//set face to spiral
238 faceMaterial.SetOpacity(3, angryFaceMix);//set face to angry
239
240 pM.GetObject()->GetTransform()->SetPosition(Vector3D(130.0f + fGenMatXMove.Update(), -15.0f + fGenMatYMove.Update(), 600.0f));
241 pM.GetObject()->GetTransform()->SetScale(Vector3D(-1.0f, 0.625f, 0.7f));
242
243 pM.GetObject()->UpdateTransform();
244 }
245};
A template class for animating eye blinking using keyframes.
Definition BlinkTrack.h:27
Combines multiple materials with specified blending methods and opacities.
void SetOpacity(uint8_t index, float opacity)
Sets the opacity for a specific material.
void AddMaterial(Method method, Material *material, float opacity)
Adds a new material to the combination.
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 class to generate various waveform functions with customizable parameters.
@ Sine
Sine waveform.
float Update()
Updates and calculates the next value of the waveform.
Creates a customizable gradient material for rendering.
void AddParameter(float *parameter)
Adds a parameter to the track.
float Update()
Updates the animation track and computes the new parameter value.
@ 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 float GetCurrentMagnitude()
Retrieves the current signal magnitude.
static float GetSampleRate()
Retrieves the current sampling rate.
static float * GetFourierFiltered()
Retrieves the filtered FFT output data.
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
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.
EasyEaseAnimator< 20 > eEA
CombineMaterial< 4 > faceMaterial
void FadeIn(float stepRatio) override
void FadeOut(float stepRatio) override
void Update(float ratio) override
FFTVoiceDetection< 128 > voiceDetection