ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
DatBlueHuskyAnimation.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 "../../Morph/NukudeFace.h"
7#include "../../Render/Scene.h"
8#include "../../Materials/GradientMaterial.h"
9#include "../../Materials/SimplexNoise.h"
10#include "../../Signals/FunctionGenerator.h"
11#include "../../Sensors/MicrophoneSimple_MAX9814.h"
12#include "../../Sensors/ButtonHandler.h"
13#include "../../Sensors/BoopSensor.h"
14#include "../../Materials/NormalMaterial.h"
15#include "../../Materials/SpiralMaterial.h"
16
17#include "../../Materials/CombineMaterial.h"
18
19
20class WaffleDaProtoAnimation : public Animation{
21private:
22 float colorMix;
23
24 NukudeFace pM;
25 EasyEaseAnimator<20> eEA = EasyEaseAnimator<20>(EasyEaseInterpolation::Overshoot);
26
27 RGBColor noiseSpectrum[4] = {RGBColor(0, 255, 0), RGBColor(255, 0, 0), RGBColor(0, 255, 0), RGBColor(0, 0, 255)};
30
31 RGBColor gradientSpectrum[2] = {RGBColor(0, 0, 255), RGBColor(0, 128, 255)};
33
35
36 //Spiral Material
38 RGBColor rainbowSpectrum[6] = {RGBColor(255, 0, 0), RGBColor(255, 255, 0), RGBColor(0, 255, 0), RGBColor(0, 255, 255), RGBColor(0, 0, 255), RGBColor(255, 0, 255)};
40
41 //default face material with gradient + simplex noise
44
45 //for combining angry face with default material
48
51
57
59 BoopSensor boop;
60 bool talk = true;
61
63 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Anger), NukudeFace::Anger, 30, 0.0f, 1.0f);
64 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Sadness), NukudeFace::Sadness, 30, 0.0f, 1.0f);
65 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Surprised), NukudeFace::Surprised, 30, 0.0f, 1.0f);
66 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Doubt), NukudeFace::Doubt, 30, 0.0f, 1.0f);
67 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::Frown), NukudeFace::Frown, 30, 0.0f, 1.0f);
68 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookUp), NukudeFace::LookUp, 30, 0.0f, 1.0f);
69 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::LookDown), NukudeFace::LookDown, 30, 0.0f, 1.0f);
70
71 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ou), NukudeFace::vrc_v_ou, 30, 0.0f, 1.0f);
72 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ee), NukudeFace::vrc_v_ee, 30, 0.0f, 1.0f);
73 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ff), NukudeFace::vrc_v_ff, 30, 0.0f, 1.0f);
74 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_aa), NukudeFace::vrc_v_aa, 30, 0.0f, 1.0f);
75 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_nn), NukudeFace::vrc_v_nn, 30, 0.0f, 1.0f);
76 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_dd), NukudeFace::vrc_v_dd, 30, 0.0f, 1.0f);
77 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_ih), NukudeFace::vrc_v_ih, 30, 0.0f, 1.0f);
78 eEA.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_pp), NukudeFace::vrc_v_pp, 30, 0.0f, 1.0f);
79
80 eEA.AddParameter(&colorMix, 99, 360, 0.0f, 1.0f);
81 }
82
84 blink.AddParameter(pM.GetMorphWeightReference(NukudeFace::Blink));
85 mouth.AddParameter(pM.GetMorphWeightReference(NukudeFace::vrc_v_aa));
86 }
87
89 blink.AddKeyFrame(0.0f, 0.0f);
90 blink.AddKeyFrame(2.75f, 0.0f);
91 blink.AddKeyFrame(3.0f, 1.0f);
92 blink.AddKeyFrame(3.25f, 0.0f);
93 blink.AddKeyFrame(9.75f, 0.0f);
94 blink.AddKeyFrame(10.0f, 1.0f);
95 blink.AddKeyFrame(10.25f, 0.0f);
96 blink.AddKeyFrame(10.75f, 0.0f);
97 blink.AddKeyFrame(11.0f, 1.0f);
98 blink.AddKeyFrame(11.25f, 0.0f);
99 blink.AddKeyFrame(15.0f, 0.0f);
100 }
101
103 mouth.AddKeyFrame(0.0f, 0.0f);
104 mouth.AddKeyFrame(1.5f, 1.0f);
105 mouth.AddKeyFrame(4.0f, 0.0f);
106 }
107
109 eEA.SetInterpolationMethod(NukudeFace::Sadness, EasyEaseInterpolation::Cosine);
110 eEA.SetInterpolationMethod(99, EasyEaseInterpolation::Cosine);
111 }
112
113public:
114 WaffleDaProtoAnimation() : Animation(1) {
115 scene->AddObject(pM.GetObject());
116
117 LinkEasyEase();
119
122
124
125 pM.GetObject()->SetMaterial(&faceMaterial);
126 noiseMaterial.SetFirstLayerOpacity(0.4f);
127
128 ButtonHandler::Initialize(0, 5);//8 is number of faces
129 boop.Initialize(5);
130 }
131
133 blink.Update();
134 mouth.Update();
135 }
136
137 void Default(){
138 pM.Reset();
139 blink.Play();
140 mouth.Play();
141
142 eEA.AddParameterFrame(99, 0.0f);
143
144 talk = true;
145 }
146
147 void Angry(){
148 pM.Reset();
149 blink.Play();
150 mouth.Play();
151
152 eEA.AddParameterFrame(NukudeFace::Anger, 1.0f);
153 eEA.AddParameterFrame(NukudeFace::vrc_v_ee, 1.0f);
154
155 talk = true;
156 }
157
158 void Sad(){
159 pM.Reset();
160 blink.Play();
161 mouth.Play();
162
163 eEA.AddParameterFrame(NukudeFace::Sadness, 1.0f);
164 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
165
166 talk = true;
167 }
168
169 void Surprised(){
170 pM.Reset();
171 blink.Play();
172 mouth.Play();
173
174 eEA.AddParameterFrame(NukudeFace::Surprised, 1.0f);
175 eEA.AddParameterFrame(NukudeFace::vrc_v_aa, 1.0f);
176 eEA.AddParameterFrame(99, 1.0f);
177
178 talk = true;
179 }
180
181 void Doubt(){
182 pM.Reset();
183 blink.Play();
184 mouth.Play();
185
186 eEA.AddParameterFrame(NukudeFace::Doubt, 1.0f);
187 eEA.AddParameterFrame(NukudeFace::vrc_v_nn, 1.0f);
188
189 talk = true;
190 }
191
192 void Frown(){
193 pM.Reset();
194 blink.Play();
195 mouth.Play();
196
197 eEA.AddParameterFrame(NukudeFace::Frown, 1.0f);
198 eEA.AddParameterFrame(NukudeFace::vrc_v_dd, 1.0f);
199
200 talk = true;
201 }
202
203 void LookUp(){
204 pM.Reset();
205 blink.Play();
206 mouth.Play();
207
208 eEA.AddParameterFrame(NukudeFace::LookUp, 1.0f);
209 eEA.AddParameterFrame(NukudeFace::vrc_v_ih, 1.0f);
210
211 talk = true;
212 }
213
214 void LookDown(){
215 pM.Reset();
216 blink.Play();
217 mouth.Play();
218
219 eEA.AddParameterFrame(NukudeFace::LookDown, 1.0f);
220 eEA.AddParameterFrame(NukudeFace::vrc_v_pp, 1.0f);
221
222 talk = true;
223 }
224
225 void FadeIn(float stepRatio) override {}
226 void FadeOut(float stepRatio) override {}
227
229 return pM.GetObject();
230 }
231
232 float offset = 0.0f;
233
234 void Update(float ratio) override {
235 bool isBooped = boop.isBooped();
236 float mouthMove = mic.Update();
237 //uint8_t mode = (uint8_t)(ratio * 8.0f);//change sequentially
238 uint8_t mode = ButtonHandler::GetValue();//change by button press
239
240 if (isBooped){
241 Surprised();
242 }
243 else{
244 if (mode == 0) Default();
245 else if (mode == 1) Angry();
246 else if (mode == 2) Doubt();
247 else if (mode == 3) Frown();
248 else if (mode == 4) LookUp();
249 else Sad();
250 }
251
252 pM.SetMorphWeight(NukudeFace::BiggerNose, 1.0f);
253 pM.SetMorphWeight(NukudeFace::MoveEye, 1.0f);
254
256
257 if(talk) eEA.AddParameterFrame(NukudeFace::vrc_v_ou, mouthMove);
258 eEA.Update();
259 pM.Update();
260
261 float x = fGenMatXMove.Update();
262 float y = fGenMatYMove.Update();
263
264 float linSweep = ratio > 0.5f ? 1.0f - ratio : ratio;
265 float sShift = linSweep * 0.002f + 0.005f;
266
267 gNoiseMat.SetGradientPeriod(0.5f + linSweep * 6.0f);
268 gNoiseMat.HueShift(ratio * 360 * 2);
269 sNoise.SetScale(Vector3D(sShift, sShift, sShift));
270 sNoise.SetZPosition(x * 4.0f);
271
273 spiralMaterial.SetRotationAngle((1.0f - ratio) * 360.0f);
275
276 faceMaterial.SetFirstLayerOpacity(colorMix);
277
278 pM.GetObject()->GetTransform()->SetRotation(Vector3D(0.0f, 0.0f, 0.0f));
279 pM.GetObject()->GetTransform()->SetPosition(Vector3D(170.0f + x, 10.0f + y, 600.0f));
280 pM.GetObject()->GetTransform()->SetScale(Vector3D(-1.0f, 0.625f, 0.7f));
281
282 pM.GetObject()->UpdateTransform();
283 }
284};
static void Initialize(uint8_t pin, uint8_t maxValue, uint16_t holdingToggle)
Initializes the ButtonHandler with specified parameters.
static uint8_t GetValue()
Retrieves the current value of the button.
Combines multiple materials with specified blending methods and opacities.
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.
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 HueShift(float hueDeg)
Shifts the hue of the gradient by a specified degree.
void SetGradientPeriod(float gradientPeriod)
Sets the gradient's period of repetition.
@ Cosine
Smooth cosine interpolation.
A template class for managing animations with multiple parameters and keyframes.
void AddParameter(float *parameter)
Adds a parameter to the track.
void Play()
Resumes the animation.
void AddKeyFrame(float time, float value)
Adds a keyframe to the track.
float Update()
Updates the animation track and computes the new parameter value.
Abstract base class for rendering materials.
Definition Material.h:27
@ Lighten
Chooses the lighter color.
Definition Material.h:40
@ Replace
Replaces the base color.
Definition Material.h:44
A simple class for processing microphone signals.
float Update()
Updates the microphone reading and processes the signal.
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 material that applies a single, solid RGB color to surfaces.
A material class for rendering Simplex Noise.
void SetScale(Vector3D noiseScale)
Sets the scale for noise generation.
void SetZPosition(float zPosition)
Sets the Z-position for 3D noise generation.
Generates a spiral pattern with configurable properties.
void SetPositionOffset(Vector2D positionOffset)
Sets the position offset for the spiral.
void SetRotationAngle(float rotationAngle)
Sets the rotation angle for the spiral.
void SetBend(float bend)
Sets the bending factor of the spiral arms.
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
EasyEaseAnimator< 20 > eEA
void FadeIn(float stepRatio) override
void FadeOut(float stepRatio) override
void Update(float ratio) override