NW4F G3d
Loading...
Searching...
No Matches
g3d_ResAnimCurve.h
Go to the documentation of this file.
1#ifndef NW_G3D_RES_RESANIMCURVE_H_
2#define NW_G3D_RES_RESANIMCURVE_H_
3
4#include <nw/g3d/g3d_config.h>
5#include <nw/g3d/math/g3d_MathCommon.h>
6#include <nw/g3d/res/g3d_ResCommon.h>
7
8#include <limits>
9
10namespace nw { namespace g3d { namespace res {
11
13{
14 enum
15 {
16 CURVE_BAKED = 0x1 << 0,
17
18 PLAYPOLICY_LOOP = 0x1 << 2,
19
20 NOT_BOUND = 0xFFFF
21 };
22};
23
25{
26 float start;
27 float end;
29};
30
32{
34 union
35 {
38 };
39};
40
42{
44
45public:
46 float GetFloat() const { return ref().fValue; }
47 int GetInt() const { return ref().iValue; }
48};
49
71
73{
75
76public:
104
115
116 /*
117 void Bake(void* pBuffer, size_t bufferSize) { IsFloatCurve() ? BakeFloat(pBuffer, bufferSize) : BakeInt(pBuffer, bufferSize); }
118 void BakeFloat(void* pBuffer, size_t bufferSize);
119 void BakeInt(void* pBuffer, size_t bufferSize);
120
121 size_t CalcBakedSize() const { return IsFloatCurve() ? CalcBakedFloatSize() : CalcBakedIntSize(); }
122 size_t CalcBakedFloatSize() const;
123 size_t CalcBakedIntSize() const;
124
125 void Reset() { IsFloatCurve() ? ResetFloat() : ResetInt(); }
126 void ResetFloat();
127 void ResetInt();
128 */
129
130 float EvalFloat(float frame) const
131 {
132 AnimFrameCache frameCache;
133 frameCache.start = std::numeric_limits<float>::infinity();
134 return EvalFloat(frame, &frameCache);
135 }
136
137 int EvalInt(float frame) const
138 {
139 AnimFrameCache frameCache;
140 frameCache.start = std::numeric_limits<float>::infinity();
141 return EvalInt(frame, &frameCache);
142 }
143
144 float EvalFloat(float frame, AnimFrameCache* pFrameCache) const;
145 int EvalInt(float frame, AnimFrameCache* pFrameCache) const;
146
147 bool IsFloatCurve() const { return (ref().flag & CURVE_MASK) < CURVE_INT_BASE; }
148 bool IsIntCurve() const { return (ref().flag & CURVE_MASK) >= CURVE_INT_BASE; }
149
152
153 float GetStartFrame() const { return ref().startFrame; }
154 float GetEndFrame() const { return ref().endFrame; }
155
156protected:
157 class Impl;
158
159 bit32 GetFrameType() const { return ref().flag & FRAME_MASK; }
160 bit32 GetKeyType() const { return ref().flag & KEY_MASK; }
161 bit32 GetCurveType() const { return ref().flag & CURVE_MASK; }
162
163 float WrapFrame(float frame) const;
164
165 void UpdateFrameCache(AnimFrameCache* pFrameCache, float frame) const;
166
167 template <typename T>
168 void FindFrame(AnimFrameCache *pFrameCache, float frame) const;
169
170 template <typename T>
171 float EvalCubic(float frame, AnimFrameCache* pFrameCache) const;
172
173 template <typename T>
174 float EvalLinear(float frame, AnimFrameCache* pFrameCache) const;
175
176 template <typename T>
177 float EvalBakedFloat(float frame, AnimFrameCache* pFrameCache) const;
178
179 template <typename T>
180 int EvalStepInt(float frame, AnimFrameCache* pFrameCache) const;
181
182 template <typename T>
183 int EvalBakedInt(float frame, AnimFrameCache* pFrameCache) const;
184
185 int EvalStepBool(float frame, AnimFrameCache* pFrameCache) const;
186
187 int EvalBakedBool(float frame, AnimFrameCache* pFrameCache) const;
188
189 template <typename T>
190 void BakeImpl(void* pBuffer, float start, int numKey);
191};
192
194float CastS10_5ToF32(s16 value)
195{
196 return FastCast<float>(value) * (1.0f / 32.0f);
197}
198
200s16 CastF32ToS10_5(float value)
201{
202 return Math::Floor<s16>(value * 32.0f);
203}
204
206float CalcCubic(float t, float c0, float c1, float c2, float c3)
207{
208 return ((c3 * t + c2) * t) * t + (c1 * t + c0);
209}
210
212float CalcLinear(float t, float c0, float c1)
213{
214 return c1 * t + c0;
215}
216
217template <typename T>
218struct Frame
219{
221
222 float Get() const { return FastCast<float>(frame); }
223
224 static T Quantize(float frame) { return Math::Floor<T>(frame); }
225};
226
227template <>
228struct Frame<float>
229{
230 float frame;
231
232 float Get() const { return frame; }
233
234 static float Quantize(float frame) { return frame; }
235};
236
237template <>
238struct Frame<s16>
239{
241
242 float Get() const { return CastS10_5ToF32(frame); }
243
244 static s16 Quantize(float frame) { return CastF32ToS10_5(frame); }
245};
246
247template <typename T>
249{
250 T coef[4];
251
252 float Get(float ratio) const
253 {
254 return CalcCubic(ratio, static_cast<float>(coef[0]), static_cast<float>(coef[1]),
255 static_cast<float>(coef[2]), static_cast<float>(coef[3]));
256 }
257};
258
259template <typename T>
261{
262 T coef[2];
263
264 float Get(float ratio) const
265 {
266 return CalcLinear(ratio, static_cast<float>(coef[0]), static_cast<float>(coef[1]));
267 }
268};
269
270template <typename T>
272{
274
275 float Get() const { return StaticCast<float>(value); }
276};
277
278template <typename T>
280{
282
283 int Get() const { return static_cast<int>(value); }
284};
285
286#if defined( __ghs__ )
287
288template <>
290float ResCubicKey<float>::Get(float param) const
291{
292 f32x2 term23 = __PSQ_LX(coef, 8, 0, 0);
293 f32x2 term01 = __PSQ_LX(coef, 0, 0, 0);
296 f32x2 one_t = { 1.0f, param };
300 sum = __PS_SUM0(sum, sum, sum);
301 return sum[0];
302};
303
304template <>
306float ResCubicKey<s16>::Get(float param) const
307{
312 f32x2 one_t = { 1.0f, param };
316 sum = __PS_SUM0(sum, sum, sum);
317 return sum[0];
318};
319
320template <>
322float ResCubicKey<s8>::Get(float param) const
323{
328 f32x2 one_t = { 1.0f, param };
332 sum = __PS_SUM0(sum, sum, sum);
333 return sum[0];
334};
335
336template <>
338float ResLinearKey<float>::Get(float param) const
339{
340 f32x2 coef01 = __PSQ_L(coef, 0, 0);
341 return coef01[0] + coef01[1] * param;
342};
343
344template <>
346float ResLinearKey<s16>::Get(float param) const
347{
349 return coef01[0] + coef01[1] * param;
350};
351
352template <>
354float ResLinearKey<s8>::Get(float param) const
355{
357 return coef01[0] + coef01[1] * param;
358};
359
360#endif
361
362} } } // namespace nw::g3d::res
363
364#endif // NW_G3D_RES_RESANIMCURVE_H_
Definition g3d_MathCommon.h:9
Definition g3d_ResCommon.h:62
Definition g3d_ResAnimCurve.h:42
float GetFloat() const
Definition g3d_ResAnimCurve.h:46
int GetInt() const
Definition g3d_ResAnimCurve.h:47
Definition g3d_ResAnimCurve.cpp:10
Definition g3d_ResAnimCurve.h:73
bool IsFloatCurve() const
Definition g3d_ResAnimCurve.h:147
Flag
Definition g3d_ResAnimCurve.h:78
@ KEY_MASK
Definition g3d_ResAnimCurve.h:90
@ CURVE_BAKED_BOOL
Definition g3d_ResAnimCurve.h:100
@ CURVE_CUBIC
Definition g3d_ResAnimCurve.h:94
@ CURVE_SHIFT
Definition g3d_ResAnimCurve.h:93
@ CURVE_INT_BASE
Definition g3d_ResAnimCurve.h:101
@ KEY_SHIFT
Definition g3d_ResAnimCurve.h:86
@ CURVE_MASK
Definition g3d_ResAnimCurve.h:102
@ CURVE_BAKED_INT
Definition g3d_ResAnimCurve.h:98
@ NUM_FRAME
Definition g3d_ResAnimCurve.h:84
@ KEY16
Definition g3d_ResAnimCurve.h:88
@ CURVE_BAKED_FLOAT
Definition g3d_ResAnimCurve.h:96
@ FRAME16
Definition g3d_ResAnimCurve.h:81
@ CURVE_STEP_BOOL
Definition g3d_ResAnimCurve.h:99
@ FRAME8
Definition g3d_ResAnimCurve.h:82
@ NUM_KEY
Definition g3d_ResAnimCurve.h:91
@ FRAME_MASK
Definition g3d_ResAnimCurve.h:83
@ CURVE_LINEAR
Definition g3d_ResAnimCurve.h:95
@ FRAME32
Definition g3d_ResAnimCurve.h:80
@ CURVE_STEP_INT
Definition g3d_ResAnimCurve.h:97
@ KEY8
Definition g3d_ResAnimCurve.h:89
@ KEY32
Definition g3d_ResAnimCurve.h:87
@ FRAME_SHIFT
Definition g3d_ResAnimCurve.h:79
float GetEndFrame() const
Definition g3d_ResAnimCurve.h:154
int EvalInt(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:76
float EvalFloat(float frame) const
Definition g3d_ResAnimCurve.h:130
bool IsIntCurve() const
Definition g3d_ResAnimCurve.h:148
int EvalStepBool(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:267
bit32 GetCurveType() const
Definition g3d_ResAnimCurve.h:161
int EvalStepInt(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:246
void UpdateFrameCache(AnimFrameCache *pFrameCache, float frame) const
Definition g3d_ResAnimCurve.cpp:147
WrapMode
Definition g3d_ResAnimCurve.h:106
@ WRAP_MIRROR
Definition g3d_ResAnimCurve.h:109
@ WRAP_REPEAT
Definition g3d_ResAnimCurve.h:108
@ WRAP_PRE_SHIFT
Definition g3d_ResAnimCurve.h:112
@ WRAP_MASK
Definition g3d_ResAnimCurve.h:111
@ WRAP_POST_SHIFT
Definition g3d_ResAnimCurve.h:113
@ WRAP_CLAMP
Definition g3d_ResAnimCurve.h:107
float WrapFrame(float frame) const
Definition g3d_ResAnimCurve.cpp:88
float EvalLinear(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:217
float EvalBakedFloat(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:231
void FindFrame(AnimFrameCache *pFrameCache, float frame) const
Definition g3d_ResAnimCurve.cpp:161
void BakeImpl(void *pBuffer, float start, int numKey)
int EvalBakedInt(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:256
WrapMode GetPreWrapMode() const
Definition g3d_ResAnimCurve.h:150
float EvalFloat(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:64
int EvalInt(float frame) const
Definition g3d_ResAnimCurve.h:137
bit32 GetFrameType() const
Definition g3d_ResAnimCurve.h:159
WrapMode GetPostWrapMode() const
Definition g3d_ResAnimCurve.h:151
float GetStartFrame() const
Definition g3d_ResAnimCurve.h:153
bit32 GetKeyType() const
Definition g3d_ResAnimCurve.h:160
float EvalCubic(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:203
int EvalBakedBool(float frame, AnimFrameCache *pFrameCache) const
Definition g3d_ResAnimCurve.cpp:276
#define NW_G3D_RES_COMMON(class_name)
Definition g3d_ResCommon.h:30
#define NW_G3D_FORCE_INLINE
Definition g3d_defs.h:66
u16 bit16
Definition g3d_defs.h:130
u32 bit32
Definition g3d_defs.h:131
Definition g3d_defs.h:122
NW_G3D_FORCE_INLINE float CalcCubic(float t, float c0, float c1, float c2, float c3)
Definition g3d_ResAnimCurve.h:206
NW_G3D_FORCE_INLINE float CastS10_5ToF32(s16 value)
Definition g3d_ResAnimCurve.h:194
NW_G3D_FORCE_INLINE float CalcLinear(float t, float c0, float c1)
Definition g3d_ResAnimCurve.h:212
NW_G3D_FORCE_INLINE s16 CastF32ToS10_5(float value)
Definition g3d_ResAnimCurve.h:200
Definition g3d_GfxManage.cpp:10
Definition g3d_ResAnimCurve.h:13
@ NOT_BOUND
Definition g3d_ResAnimCurve.h:20
@ PLAYPOLICY_LOOP
Definition g3d_ResAnimCurve.h:18
@ CURVE_BAKED
Definition g3d_ResAnimCurve.h:16
Definition g3d_ResAnimCurve.h:25
float start
Definition g3d_ResAnimCurve.h:26
int keyIndex
Definition g3d_ResAnimCurve.h:28
float end
Definition g3d_ResAnimCurve.h:27
Definition g3d_ResAnimCurve.h:229
float Get() const
Definition g3d_ResAnimCurve.h:232
static float Quantize(float frame)
Definition g3d_ResAnimCurve.h:234
float frame
Definition g3d_ResAnimCurve.h:230
Definition g3d_ResAnimCurve.h:219
T frame
Definition g3d_ResAnimCurve.h:220
float Get() const
Definition g3d_ResAnimCurve.h:222
static T Quantize(float frame)
Definition g3d_ResAnimCurve.h:224
Definition g3d_ResAnimCurve.h:32
f32 fValue
Definition g3d_ResAnimCurve.h:36
u32 targetOffset
Definition g3d_ResAnimCurve.h:33
s32 iValue
Definition g3d_ResAnimCurve.h:37
Definition g3d_ResAnimCurve.h:51
f32 startFrame
Definition g3d_ResAnimCurve.h:55
s32 iOffset
Definition g3d_ResAnimCurve.h:65
Offset ofsKeyArray
Definition g3d_ResAnimCurve.h:69
f32 fScale
Definition g3d_ResAnimCurve.h:59
u16 numKey
Definition g3d_ResAnimCurve.h:53
Offset ofsFrameArray
Definition g3d_ResAnimCurve.h:68
bit16 flag
Definition g3d_ResAnimCurve.h:52
f32 fOffset
Definition g3d_ResAnimCurve.h:64
u32 targetOffset
Definition g3d_ResAnimCurve.h:54
f32 endFrame
Definition g3d_ResAnimCurve.h:56
s32 iScale
Definition g3d_ResAnimCurve.h:60
Definition g3d_ResAnimCurve.h:249
T coef[4]
Definition g3d_ResAnimCurve.h:250
float Get(float ratio) const
Definition g3d_ResAnimCurve.h:252
Definition g3d_ResAnimCurve.h:272
float Get() const
Definition g3d_ResAnimCurve.h:275
T value
Definition g3d_ResAnimCurve.h:273
Definition g3d_ResAnimCurve.h:280
int Get() const
Definition g3d_ResAnimCurve.h:283
T value
Definition g3d_ResAnimCurve.h:281
Definition g3d_ResAnimCurve.h:261
float Get(float ratio) const
Definition g3d_ResAnimCurve.h:264
T coef[2]
Definition g3d_ResAnimCurve.h:262