ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
EasyEaseAnimator.tpp
Go to the documentation of this file.
1#pragma once
2
3template<size_t maxParameters>
4EasyEaseAnimator<maxParameters>::EasyEaseAnimator(InterpolationMethod interpMethod, float springConstant, float dampingConstant) {
5 this->interpMethod = interpMethod;
6
7 for (uint8_t i = 0; i < maxParameters; i++){
8 interpolationMethods[i] = interpMethod;
9
10 dampedSpring[i].SetConstants(springConstant, dampingConstant);
11 }
12}
13
14template<size_t maxParameters>
15void EasyEaseAnimator<maxParameters>::SetConstants(uint16_t dictionaryValue, float springConstant, float damping){
16 for(uint16_t i = 0; i < currentParameters; i++){
17 if(dictionary[i] == dictionaryValue){
18 dampedSpring[i].SetConstants(springConstant, damping);
19 break;
20 }
21 }
22}
23
24template<size_t maxParameters>
25float EasyEaseAnimator<maxParameters>::GetValue(uint16_t dictionaryValue){
26 for(uint16_t i = 0; i < currentParameters; i++){
27 if(dictionary[i] == dictionaryValue){
28 return *parameters[i];
29 }
30 }
31
32 return 0.0f;
33}
34
35template<size_t maxParameters>
36float EasyEaseAnimator<maxParameters>::GetTarget(uint16_t dictionaryValue){
37 for(uint16_t i = 0; i < currentParameters; i++){
38 if(dictionary[i] == dictionaryValue){
39 return goal[i];
40 }
41 }
42
43 return 0.0f;
44}
45
46template<size_t maxParameters>
47void EasyEaseAnimator<maxParameters>::AddParameter(float* parameter, uint16_t dictionaryValue, uint16_t frames, float basis, float goal){
48 if(currentParameters < maxParameters){
49 bool addValue = true;
50 for(uint16_t i = 0; i < currentParameters; i++){
51 if(dictionary[i] == dictionaryValue){
52 addValue = false;
53 break;
54 }
55 }
56
57 if(addValue){
58 this->basis[currentParameters] = basis;
59 this->goal[currentParameters] = goal;
60 parameters[currentParameters] = parameter;
61 parameterFrame[currentParameters] = 0.0f;
62 previousSet[currentParameters] = 0.0f;
63 dictionary[currentParameters] = dictionaryValue;
64 rampFilter[currentParameters].SetFrames(frames);
65 currentParameters++;
66 }
67 }
68}
69
70template<size_t maxParameters>
71void EasyEaseAnimator<maxParameters>::AddParameterFrame(uint16_t dictionaryValue, float value){
72 for(uint16_t i = 0; i < currentParameters; i++){
73 if(dictionary[i] == dictionaryValue){
74 parameterFrame[i] = value;
75 break;
76 }
77 }
78}
79
80template<size_t maxParameters>
81void EasyEaseAnimator<maxParameters>::SetInterpolationMethod(uint16_t dictionaryValue, InterpolationMethod interpMethod){
82 for(uint16_t i = 0; i < currentParameters; i++){
83 if(dictionary[i] == dictionaryValue){
84 interpolationMethods[i] = interpMethod;
85
86 break;
87 }
88 }
89}
90
91template<size_t maxParameters>
92void EasyEaseAnimator<maxParameters>::Reset(){
93 for(uint16_t i = 0; i < currentParameters; i++){
94 *(this->parameters[i]) = basis[i];
95 }
96}
97
98template<size_t maxParameters>
99void EasyEaseAnimator<maxParameters>::SetParameters(){//Used to set parameters but not update interpolation
100 for(uint16_t i = 0; i < currentParameters; i++){
101 float set = previousSet[i];
102 float fullRange = Mathematics::Map(set, basis[i], goal[i], 0.0f, 1.0f);
103
104 switch(interpolationMethods[i]){
105 case Cosine:
106 *parameters[i] = Mathematics::CosineInterpolation(basis[i], goal[i], fullRange);
107 break;
108 case Bounce:
109 *parameters[i] = Mathematics::BounceInterpolation(basis[i], goal[i], fullRange);
110 break;
111 case Overshoot:
112 *parameters[i] = dampedSpring[i].GetCurrentPosition();
113 break;
114 default://Linear
115 *parameters[i] = set;
116 break;
117 }
118 }
119}
120
121template<size_t maxParameters>
122void EasyEaseAnimator<maxParameters>::Update(){
123 //parameterFrame is the target, if no parameter is given for the frame, it will move towards the basis value
124 for(uint16_t i = 0; i < currentParameters; i++){
125
126 float set = rampFilter[i].Filter(parameterFrame[i]);
127 float fullRange = Mathematics::Map(set, basis[i], goal[i], 0.0f, 1.0f);
128
129 previousSet[i] = set;
130
131 //basis at 0.5f does not go to 0.5f but to zero with linear
132 //when using set, it defaults the blush is shown the inverted 1.0f to 0.0f does not work
133
134 switch(interpolationMethods[i]){
135 case Cosine:
136 *parameters[i] = Mathematics::CosineInterpolation(basis[i], goal[i], fullRange);
137 break;
138 case Bounce:
139 *parameters[i] = Mathematics::BounceInterpolation(basis[i], goal[i], fullRange);
140 break;
141 case Overshoot:
142 *parameters[i] = dampedSpring[i].Calculate(parameterFrame[i], 0.25f);
143 break;
144 default://Linear
145 *parameters[i] = fullRange;
146 break;
147 }
148
149 parameterFrame[i] = basis[i];
150 }
151}