PeriDyno 1.0.0
Loading...
Searching...
No Matches
AnimationCurve.cpp
Go to the documentation of this file.
1#include "AnimationCurve.h"
2
3#include "Object.h"
4#include "DataTypes.h"
5
6namespace dyno
7{
8
9 template<typename TDataType>
17
18 template<typename TDataType>
20 {
21 m_maxSize = size;
22 m_initVal[0] = dx;
23 m_initVal[1] = dy;
24 m_initVal[2] = dz;
25 m_endVal[0] = dx;
26 m_endVal[1] = dy;
27 m_endVal[2] = dz;
28 }
29
30 template<typename TDataType>
34
35 template<typename TDataType>
36 void AnimationCurve<TDataType>::set(int index, const std::vector<long long>& tim, const std::vector<Real>& val)
37 {
38 // for(auto t : tim)
39 // this->m_times[index].push_back((double)t / FBXTIME);
40 this->m_times[index].assign(tim.begin(), tim.end());
41 this->m_values[index].assign(val.begin(), val.end());
42 }
43
44 template<typename TDataType>
46 {
47 long long fbx_time = secondsToFbxTime(ptime);
48 auto getReal = [=](
49 Real init,
50 std::vector<long long>& times,
51 std::vector<Real>& vals,
52 long long fbx_time) mutable -> Real
53 {
54 int cur = BEFORE;
55 int size = times.size();
56 if (fbx_time < 0.f) return init;
57 if (times[size - 1] == 0) return vals[size - 1];
58
59 if (fbx_time >= times[size - 1]) {
60 fbx_time %= times[size - 1];
61 // fbx_time %= (times[size - 1] * 2);
62 // if (fbx_time >= times[size - 1])
63 // fbx_time = 2 * times[size - 1] - fbx_time;
64 // return vals[size - 1];
65 }
66
67 while(cur + 1 < size && times[cur + 1] <= fbx_time)
68 ++cur;
69
70 assert(cur < size - 1);
71
72 long long left_time, right_time;
73 left_time = (cur == BEFORE) ? 0 : times[cur];
74 right_time = times[cur + 1];
75 Real left_val, right_val;
76 left_val = (cur == BEFORE) ? init : vals[cur];
77 right_val = vals[cur + 1];
78
79 // Lerp
80 Real t = Real(double(fbx_time - left_time) / double(right_time - left_time));
81 return left_val * (1 - t) + right_val * t;
82 };
83
84 return Coord(getReal(m_initVal[0], m_times[0], m_values[0], fbx_time),
85 getReal(m_initVal[1], m_times[1], m_values[1], fbx_time),
86 getReal(m_initVal[2], m_times[2], m_values[2], fbx_time));
87 }
88
89 template<typename TDataType>
91 {
92 long long fbx_time = secondsToFbxTime(ptime);
93 auto getReal = [=](
94 Real init,
95 std::vector<long long>& times,
96 std::vector<Real>& vals,
97 long long fbx_time,
98 int& cur) mutable -> Real
99 {
100 int size = times.size();
101 if (fbx_time < 0.f) return init;
102 // if (fbx_time >= times[size - 1]) return init * vals[size - 1];
103 if (fbx_time >= times[size - 1]) return vals[size - 1];
104
105 while(cur + 1 < size && times[cur + 1] <= fbx_time)
106 ++cur;
107
108 assert(cur < size - 1);
109
110 long long left_time, right_time;
111 left_time = (cur == BEFORE) ? 0 : times[cur];
112 right_time = times[cur + 1];
113 Real left_val, right_val;
114 left_val = (cur == BEFORE) ? init : vals[cur];
115 right_val = vals[cur + 1];
116
117 // Lerp
118 Real t = Real(double(fbx_time - left_time) / double(right_time - left_time));
119 return left_val * (1 - t) + right_val * t;
120 };
121
122 return Coord(getReal(m_initVal[0], m_times[0], m_values[0], fbx_time, m_cur[0]),
123 getReal(m_initVal[1], m_times[1], m_values[1], fbx_time, m_cur[1]),
124 getReal(m_initVal[2], m_times[2], m_values[2], fbx_time, m_cur[2]));
125 }
126
127
128 template<typename TDataType>
130 {
131 long long fbx_time = secondsToFbxTime(ptime);
132 auto getReal = [&](
133 Real init,
134 std::vector<long long>& times,
135 std::vector<Real>& vals,
136 long long fbx_time) mutable -> Real
137 {
138 int cur = BEFORE;
139 int size = times.size();
140 if (fbx_time < 0.f) return init;
141 // if (fbx_time >= times[size - 1]) return init * vals[size - 1];
142 if (fbx_time >= times[size - 1])
143 return vals[size - 1];
144
145 while(cur + 1 < size && times[cur + 1] <= fbx_time)
146 ++cur;
147
148 assert(cur < size - 1);
149
150 long long left_time, right_time;
151 left_time = (cur == BEFORE) ? 0 : times[cur];
152 right_time = times[cur + 1];
153 Real left_val, right_val;
154 left_val = (cur == BEFORE) ? init : vals[cur];
155 right_val = vals[cur + 1];
156
157 // Lerp
158 Real t = Real(double(fbx_time - left_time) / double(right_time - left_time));
159 return left_val * (1 - t) + right_val * t;
160 };
161
162 return Coord(getReal(m_initVal[0], m_times[0], m_values[0], fbx_time),
163 getReal(m_initVal[1], m_times[1], m_values[1], fbx_time),
164 getReal(m_initVal[2], m_times[2], m_values[2], fbx_time));
165 }
167}
#define BEFORE
#define DEFINE_CLASS(name)
Definition Object.h:140
double Real
Definition Typedef.inl:23
assert(queueCount >=1)
void set(int index, const std::vector< LongLong > &tim, const std::vector< Real > &val)
LongLong secondsToFbxTime(Real value)
Coord getCurveValueAlong(Real ptime)
Coord getCurveValueCycle(Real ptime)
std::vector< Real > m_values[3]
Coord getCurveValueAll(Real ptime)
std::vector< LongLong > m_times[3]
TDataType::Real Real
TDataType::Coord Coord
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25