ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
ElGatoAnimation.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 ElGatoAnimation : public Animation<2> {
24private:
25 NukudeFace pM;
26 Background background;
27 EasyEaseAnimator<25> eEA = EasyEaseAnimator<25>(EasyEaseInterpolation::Overshoot, 1.0f, 0.35f);
28
29 //Materials
37
38 //red angry
39 //green happy
40 //blue normal
41 //blush rainbow
42 //boop pink
43
44 RGBColor gradientSpectrum[4] = {RGBColor(0, 0, 255), RGBColor(0, 255, 0), RGBColor(255, 0, 0), RGBColor(255, 255, 0)};
46
48
49 SpectrumAnalyzer sA = SpectrumAnalyzer(22, Vector2D(250, 200), Vector2D(120, 100), true, true);
50
51 //Animation controllers
53
59
60 BoopSensor boop;
61 float rainbowFaceMix = 0.0f;
62 float redFaceMix = 0.0f;
63 float greenFaceMix = 0.0f;
64 float blueFaceMix = 0.0f;
65 float pinkFaceMix = 0.0f;
66 float customFaceMix = 0.0f;
67 uint8_t rainbowFaceIndex = 50;
68 uint8_t redFaceIndex = 51;
69 uint8_t greenFaceIndex = 52;
70 uint8_t blueFaceIndex = 53;
71 uint8_t pinkFaceIndex = 54;
72 uint8_t customFaceIndex = 55;
73
75
77 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Anger), NukudeFace::Anger, 60, 0.0f, 1.0f);
78 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Sadness), NukudeFace::Sadness, 60, 0.0f, 1.0f);
79 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Surprised), NukudeFace::Surprised, 60, 0.0f, 1.0f);
80 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Doubt), NukudeFace::Doubt, 60, 0.0f, 1.0f);
81 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Frown), NukudeFace::Frown, 60, 0.0f, 1.0f);
82 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookUp), NukudeFace::LookUp, 60, 0.0f, 1.0f);
83 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookDown), NukudeFace::LookDown, 60, 0.0f, 1.0f);
84
85 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ee), NukudeFace::vrc_v_ee, 2, 0.0f, 1.0f);
86 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ih), NukudeFace::vrc_v_ih, 2, 0.0f, 1.0f);
87 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_dd), NukudeFace::vrc_v_dd, 2, 0.0f, 1.0f);
88 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_rr), NukudeFace::vrc_v_rr, 2, 0.0f, 1.0f);
89 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ch), NukudeFace::vrc_v_ch, 2, 0.0f, 1.0f);
90 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_aa), NukudeFace::vrc_v_aa, 2, 0.0f, 1.0f);
91 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_oh), NukudeFace::vrc_v_oh, 2, 0.0f, 1.0f);
92 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ss), NukudeFace::vrc_v_ss, 2, 0.0f, 1.0f);
93
94 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::HideBlush), NukudeFace::HideBlush, 30, 1.0f, 0.0f);
95
97 eEA.AddParameter(&redFaceMix, redFaceIndex, 40, 0.0f, 1.0f);
99 eEA.AddParameter(&blueFaceMix, blueFaceIndex, 40, 0.0f, 1.0f);
100 eEA.AddParameter(&pinkFaceMix, pinkFaceIndex, 40, 0.0f, 1.0f);
102 }
103
105 blink.AddParameter(pM.GetMorphWeightReference(NukudeFace::Blink));
106 }
107
109 eEA.SetInterpolationMethod(NukudeFace::HideBlush, EasyEaseInterpolation::Cosine);
110 eEA.SetInterpolationMethod(NukudeFace::Sadness, EasyEaseInterpolation::Cosine);
111 eEA.SetInterpolationMethod(rainbowFaceIndex, EasyEaseInterpolation::Cosine);
112 eEA.SetInterpolationMethod(redFaceIndex, EasyEaseInterpolation::Cosine);
113 eEA.SetInterpolationMethod(greenFaceIndex, EasyEaseInterpolation::Cosine);
114 eEA.SetInterpolationMethod(blueFaceIndex, EasyEaseInterpolation::Cosine);
115 eEA.SetInterpolationMethod(pinkFaceIndex, EasyEaseInterpolation::Cosine);
116 eEA.SetInterpolationMethod(customFaceIndex, EasyEaseInterpolation::Cosine);
117
118 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ee, EasyEaseInterpolation::Linear);
119 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ih, EasyEaseInterpolation::Linear);
120 eEA.SetInterpolationMethod(NukudeFace::vrc_v_dd, EasyEaseInterpolation::Linear);
121 eEA.SetInterpolationMethod(NukudeFace::vrc_v_rr, EasyEaseInterpolation::Linear);
122 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ch, EasyEaseInterpolation::Linear);
123 eEA.SetInterpolationMethod(NukudeFace::vrc_v_aa, EasyEaseInterpolation::Linear);
124 eEA.SetInterpolationMethod(NukudeFace::vrc_v_oh, EasyEaseInterpolation::Linear);
125 eEA.SetInterpolationMethod(NukudeFace::vrc_v_ss, EasyEaseInterpolation::Linear);
126 }
127
138
139public:
141 scene.AddObject(pM.GetObject());
142 scene.AddObject(background.GetObject());
143
144 LinkEasyEase();
146
148
149 SetMaterials();
150
151 pM.GetObject()->SetMaterial(&faceMaterial);
152
153 MenuButtonHandler::Initialize(0, 7, 1000);//7 is number of faces
154 boop.Initialize(5);
155
156 background.GetObject()->SetMaterial(&sA);
157 }
158
160 blink.Update();
161 }
162
163 void Default(){
165 }
166
170
171 void Angry(){
172 eEA.AddParameterFrame(NukudeFace::Anger, 1.0f);
174 }
175
176 void Sad(){
177 eEA.AddParameterFrame(NukudeFace::Sadness, 1.0f);
178 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
180 }
181
182 void Surprised(){
183 eEA.AddParameterFrame(NukudeFace::Surprised, 1.0f);
184 eEA.AddParameterFrame(NukudeFace::HideBlush, 0.0f);
186 }
187
188 void Doubt(){
189 eEA.AddParameterFrame(NukudeFace::Doubt, 1.0f);
190 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
192 }
193
194 void LookUp(){
195 eEA.AddParameterFrame(NukudeFace::LookUp, 1.0f);
196 eEA.AddParameterFrame(NukudeFace::HideBlush, 0.0f);
198 }
199
200 void LookDown(){
201 eEA.AddParameterFrame(NukudeFace::LookDown, 1.0f);
202 }
203
205 pM.GetObject()->Disable();
206 background.GetObject()->Enable();
207 }
208
209 void FadeIn(float stepRatio) override {}
210 void FadeOut(float stepRatio) override {}
211
213 return pM.GetObject();
214 }
215
233
234 void Update(float ratio) override {
235 pM.Reset();
236 pM.GetObject()->Enable();
237 background.GetObject()->Disable();
238
239 bool isBooped = MenuButtonHandler::UseBoopSensor() ? boop.isBooped() : 0;
240 uint8_t mode = MenuButtonHandler::GetFaceState();//change by button press
241
244 sA.SetHueAngle(ratio * 360.0f * 4.0f);
245 sA.SetMirrorYState(MenuButtonHandler::MirrorSpectrumAnalyzer());
246 sA.SetFlipYState(!MenuButtonHandler::MirrorSpectrumAnalyzer());
247
249
250 if (isBooped && mode != 6){
251 LookUp();
252 }
253 else{
254 if (mode == 0) Default();
255 else if (mode == 1) Angry();
256 else if (mode == 2) Doubt();
257 else if (mode == 3) Default2();
258 else if (mode == 4) Surprised();
259 else if (mode == 5) Sad();
261 }
262
264
265 pM.SetMorphWeight(NukudeFace::BiggerNose, 1.0f);
266 pM.SetMorphWeight(NukudeFace::MoveEye, 1.0f);
267
268 eEA.Update();
269 pM.Update();
270
271 rainbowNoise.Update(ratio);
272 rainbowSpiral.Update(ratio);
273
274 faceMaterial.SetOpacity(1, rainbowFaceMix);//set face to spiral
275 faceMaterial.SetOpacity(2, redFaceMix);//set face to angry
276 faceMaterial.SetOpacity(3, greenFaceMix);//set face to angry
277 faceMaterial.SetOpacity(4, blueFaceMix);//set face to angry
278 faceMaterial.SetOpacity(5, pinkFaceMix);//set face to angry
279 faceMaterial.SetOpacity(6, customFaceMix);//set face to angry
280
281 pM.GetObject()->GetTransform()->SetPosition(Vector3D(130.0f + fGenMatXMove.Update(), -15.0f + fGenMatYMove.Update(), 600.0f));
282 pM.GetObject()->GetTransform()->SetScale(Vector3D(-1.0f, 0.625f, 0.7f));
283
284 pM.GetObject()->UpdateTransform();
285 }
286};
void AddParameter(float *parameter)
Adds a parameter to the animation track.
float Update()
Updates the animation track and returns the current parameter value.
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.
SimpleMaterial greenMaterial
FunctionGenerator fGenMatYMove
SpectrumAnalyzer sA
SimpleMaterial pinkMaterial
SimpleMaterial redMaterial
RainbowSpiral rainbowSpiral
SimpleMaterial blueMaterial
SimpleMaterial yellowMaterial
EasyEaseAnimator< 25 > eEA
BlinkTrack< 1 > blink
void ChangeInterpolationMethods()
FunctionGenerator fGenMatPos
FunctionGenerator fGenScale
Background background
FunctionGenerator fGenRotation
void FadeIn(float stepRatio) override
void FadeOut(float stepRatio) override
RainbowNoise rainbowNoise
FunctionGenerator fGenMatXMove
void Update(float ratio) override
RGBColor gradientSpectrum[4]
FFTVoiceDetection< 128 > voiceDetection
CombineMaterial< 8 > faceMaterial
Object3D * GetObject()
GradientMaterial< 4 > gradientMat
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.
@ 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.