NW4F G3d
Loading...
Searching...
No Matches
g3d_AnimObj.h
Go to the documentation of this file.
1#ifndef NW_G3D_ANIMOBJ_H_
2#define NW_G3D_ANIMOBJ_H_
3
4#include <nw/g3d/g3d_config.h>
5#include <nw/g3d/math/g3d_MathCommon.h>
6#include <nw/g3d/res/g3d_ResAnimCurve.h>
7#include <nw/g3d/res/g3d_Binding.h>
8#include <nw/g3d/g3d_Sizer.h>
9#include <nw/g3d/ut/g3d_Flag.h>
10
11#include <limits>
12
13namespace nw { namespace g3d {
14
15namespace res {
16
17class ResModel;
18
19} // namespace res
20
21class ModelObj;
22
24{
25public:
26 typedef float (*PlayPolicy)(
27 float inputFrame, float startFrame, float endFrame, void* pUserPtr);
28
30
31 void Init(float startFrame, float endFrame, PlayPolicy pPlayPolicy);
32
37
38 void SetFrame(float frame)
39 {
41 }
42
43 float GetFrame() const { return m_Frame; }
44
45 void SetFrameRange(float start, float end)
46 {
47 NW_G3D_ASSERT(end - start >= 0.0f);
48 m_StartFrame = start;
49 m_EndFrame = end;
50 }
51
52 float GetStartFrame() const { return m_StartFrame; }
53
54 float GetEndFrame() const { return m_EndFrame; }
55
56 void SetStep(float step) { m_Step = step; }
57
58 float GetStep() const { return m_Step; }
59
60 void SetPlayPolicy(PlayPolicy policy) { m_pPlayPolicy = policy; }
61
63
64 void SetUserPtr(void* pUserPtr) { m_pUserPtr = pUserPtr; }
65
66 void* GetUserPtr() { return m_pUserPtr; }
67
68 const void* GetUserPtr() const { return m_pUserPtr; }
69
70 template <typename T>
71 T* GetUserPtr() { return static_cast<T*>(m_pUserPtr); }
72
73 template <typename T>
74 const T* GetUserPtr() const { return static_cast<const T*>(m_pUserPtr); }
75
76 static const float INVALID_FRAME;
77
78private:
79 float m_Frame;
82 float m_Step;
85
87};
88
89float PlayPolicy_Onetime(float inputFrame, float startFrame, float endFrame, void* pUserData);
90
91float PlayPolicy_Loop(float inputFrame, float startFrame, float endFrame, void* pUserData);
92
94{
95public:
97 {
99 SKIP_CALC = 0x1 << 0,
100 SKIP_APPLY = 0x1 << 1,
102 };
103
119
121
122 void Init(bit32* pBindArray, int tableSize);
123
124 void SetAnimCount(int animCount)
125 {
126 NW_G3D_ASSERT(0 <= animCount && animCount <= m_Size);
127 m_NumAnim = static_cast<u16>(animCount);
128 }
129
130 int GetSize() const { return m_Size; }
131
132 int GetAnimCount() const { return m_NumAnim; }
133
134 int GetTargetCount() const { return m_NumTarget; }
135
136 void ClearAll(int targetCount);
137
138 void BindAll(const u16* pBindIndexArray);
139
140 void Bind(int animIndex, int targetIndex)
141 {
142 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
143 NW_G3D_ASSERT_INDEX_BOUNDS(targetIndex, m_NumTarget);
144 m_pBindArray[animIndex] &= ~(INDEX_MASK | FLAG_MASK);
145 m_pBindArray[animIndex] |= (targetIndex & INDEX_MASK);
146 m_pBindArray[targetIndex] &= ~static_cast<bit32>(REVERSE_INDEX_MASK);
147 m_pBindArray[targetIndex] |= static_cast<bit32>((animIndex & INDEX_MASK) << REVERSE_SHIFT);
148 }
149
150 void Unbind(int animIndex, int targetIndex)
151 {
152 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
153 NW_G3D_ASSERT_INDEX_BOUNDS(targetIndex, m_NumTarget);
154 NW_G3D_ASSERT(targetIndex == GetTargetIndex(animIndex));
155 m_pBindArray[animIndex] |= static_cast<bit32>(NOT_BOUND | FLAG_DISABLED);
156 m_pBindArray[targetIndex] |= REVERSE_NOT_BOUND;
157 }
158
159 int GetTargetIndex(int animIndex) const
160 {
161 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
162 return m_pBindArray[animIndex] & INDEX_MASK;
163 }
164
165 int GetAnimIndex(int targetIndex) const
166 {
167 NW_G3D_ASSERT_INDEX_BOUNDS(targetIndex, m_NumTarget);
168 return ( m_pBindArray[targetIndex] >> REVERSE_SHIFT) & INDEX_MASK;
169 }
170
172
174
175 bool IsTargetBound() const { return 0 != (m_Flag & TARGET_BOUND); }
176
177 bool IsCalcEnabled(int animIndex) const
178 {
179 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
180 return CheckFlag(m_pBindArray[animIndex], FLAG_SKIP_CALC, 0);
181 }
182
183 bool IsApplyEnabled(int animIndex) const
184 {
185 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
186 return CheckFlag(m_pBindArray[animIndex], FLAG_SKIP_APPLY, 0);
187 }
188
189 bool IsEnabled(int animIndex) const
190 {
191 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
192 return CheckFlag(m_pBindArray[animIndex], FLAG_MASK, FLAG_ENABLED);
193 }
194
195 bool IsDisabled(int animIndex) const
196 {
197 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
198 return CheckFlag(m_pBindArray[animIndex], FLAG_MASK, FLAG_DISABLED);
199 }
200
201 BindFlag GetBindFlag(int animIndex) const
202 {
203 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
204 return BindFlag(m_pBindArray[animIndex] >> FLAG_SHIFT);
205 }
206
207 void SetBindFlag(int animIndex, BindFlag flag)
208 {
209 SetBindFlagRaw(animIndex, CreateFlagValue<bit32>(bit32(flag), FLAG_SHIFT, FLAG_MASK));
210 }
211
212 void SetBindFlagRaw(int animIndex, bit32 flag)
213 {
214 NW_G3D_ASSERT_INDEX_BOUNDS(animIndex, m_NumAnim);
215 m_pBindArray[animIndex] &= ~FLAG_MASK;
216 m_pBindArray[animIndex] |= flag;
217 }
218
219private:
225
227};
228
230{
231public:
233
234 void Init(AnimFrameCache* pFrameCacheArray, int arraySize);
235
236 void SetCurveCount(int curveCount)
237 {
238 NW_G3D_WARNING(m_pFrameCacheArray == NULL || curveCount <= m_Size,
239 "Too many curves to store context.\n");
240 m_NumCurve = curveCount;
241 Reset();
242 }
243
244 void Reset()
245 {
248 {
249 for (int idxCurve = 0; idxCurve < m_NumCurve; ++idxCurve)
250 {
251 m_pFrameCacheArray[idxCurve].start = std::numeric_limits<float>::infinity();
252 }
253 }
254 }
255
256 int GetCurveCount() const { return m_NumCurve; }
257
258 bool IsFrameCacheValid() const { return 0 < m_NumCurve && m_NumCurve <= m_Size; }
259
260 AnimFrameCache* GetFrameCacheArray(int startIndex) { return &m_pFrameCacheArray[startIndex]; }
261
262 void SetLastFrame(float frame) { m_LastFrame = frame; }
263
264 float GetLastFrame() const { return m_LastFrame; }
265
266private:
271
273};
274
276{
277public:
285
286 virtual ~AnimObj() {}
287
289
290 const AnimFrameCtrl& GetFrameCtrl() const { return *m_pFrameCtrl; }
291
292 void SetFrameCtrl(AnimFrameCtrl* pFrameCtrl)
293 {
294 m_pFrameCtrl = pFrameCtrl != NULL ? pFrameCtrl : &m_DefaultFrameCtrl;
295 }
296
298
300
302
303 const AnimContext& GetContext() const { return m_Context; }
304
306
307 virtual void ClearResult() = 0;
308
309 virtual void Calc() = 0;
310
312
313 void* GetBufferPtr() { return m_pBufferPtr; }
314
315protected:
316 AnimObj();
317
318 void SetBufferPtr(void* pBuffer) { m_pBufferPtr = pBuffer; }
319
320 void SetResultBuffer(void* pBuffer) { m_pResultBuffer = pBuffer; }
321
323
324 const void* GetResultBuffer() const { return m_pResultBuffer; }
325
326 void ResetFrameCtrl(int frameCount, bool loop);
327
329
331
332private:
338
340};
341
342class ModelAnimObj : public AnimObj
343{
344public:
345 virtual BindResult Bind(const ResModel* pModel) = 0;
346
347 virtual BindResult Bind(const ModelObj* pModel) = 0;
348
349 virtual void BindFast(const ResModel* pModel) = 0;
350
351 AnimBindTable& GetBindTable() { return m_BindTable; }
352
353 const AnimBindTable& GetBindTable() const { return m_BindTable; }
354
356
357 virtual void ApplyTo(ModelObj* pModelObj) const = 0;
358
359 int GetAnimCount() const { return m_BindTable.GetAnimCount(); }
360
361 int GetTargetCount() const { return m_BindTable.GetTargetCount(); }
362
363protected:
365
371
373
374 void SetBindFlagImpl(int targetIndex, BindFlag flag);
375
376 BindFlag GetBindFlagImpl(int targetIndex) const;
377
378private:
380
382};
383
384} } // namespace nw::g3d
385
386#endif // NW_G3D_ANIMOBJ_H_
Definition g3d_AnimObj.h:94
void SetBindFlag(int animIndex, BindFlag flag)
Definition g3d_AnimObj.h:207
void BindAll(const u16 *pBindIndexArray)
Definition g3d_AnimObj.cpp:95
bool IsApplyEnabled(int animIndex) const
Definition g3d_AnimObj.h:183
void Unbind(int animIndex, int targetIndex)
Definition g3d_AnimObj.h:150
int GetTargetIndex(int animIndex) const
Definition g3d_AnimObj.h:159
bit32 * m_pBindArray
Definition g3d_AnimObj.h:220
bit16 m_Flag
Definition g3d_AnimObj.h:221
bool IsTargetBound() const
Definition g3d_AnimObj.h:175
int GetTargetCount() const
Definition g3d_AnimObj.h:134
void SetTargetUnbound()
Definition g3d_AnimObj.h:173
bool IsCalcEnabled(int animIndex) const
Definition g3d_AnimObj.h:177
int GetAnimCount() const
Definition g3d_AnimObj.h:132
void SetBindFlagRaw(int animIndex, bit32 flag)
Definition g3d_AnimObj.h:212
int GetAnimIndex(int targetIndex) const
Definition g3d_AnimObj.h:165
u16 m_Size
Definition g3d_AnimObj.h:222
BindFlag GetBindFlag(int animIndex) const
Definition g3d_AnimObj.h:201
u16 m_NumTarget
Definition g3d_AnimObj.h:224
BindFlag
Definition g3d_AnimObj.h:97
@ SKIP_CALC
Definition g3d_AnimObj.h:99
@ DISABLED
Definition g3d_AnimObj.h:101
@ ENABLED
Definition g3d_AnimObj.h:98
@ SKIP_APPLY
Definition g3d_AnimObj.h:100
bool IsDisabled(int animIndex) const
Definition g3d_AnimObj.h:195
void ClearAll(int targetCount)
Definition g3d_AnimObj.cpp:84
Flag
Definition g3d_AnimObj.h:105
@ REVERSE_SHIFT
Definition g3d_AnimObj.h:108
@ FLAG_SKIP_CALC
Definition g3d_AnimObj.h:113
@ NOT_BOUND
Definition g3d_AnimObj.h:106
@ REVERSE_NOT_BOUND
Definition g3d_AnimObj.h:109
@ FLAG_MASK
Definition g3d_AnimObj.h:116
@ FLAG_SKIP_APPLY
Definition g3d_AnimObj.h:114
@ FLAG_SHIFT
Definition g3d_AnimObj.h:111
@ INDEX_MASK
Definition g3d_AnimObj.h:107
@ FLAG_DISABLED
Definition g3d_AnimObj.h:115
@ FLAG_ENABLED
Definition g3d_AnimObj.h:112
@ REVERSE_INDEX_MASK
Definition g3d_AnimObj.h:110
@ TARGET_BOUND
Definition g3d_AnimObj.h:117
u16 m_NumAnim
Definition g3d_AnimObj.h:223
void SetAnimCount(int animCount)
Definition g3d_AnimObj.h:124
void SetTargetBound()
Definition g3d_AnimObj.h:171
void Bind(int animIndex, int targetIndex)
Definition g3d_AnimObj.h:140
int GetSize() const
Definition g3d_AnimObj.h:130
bool IsEnabled(int animIndex) const
Definition g3d_AnimObj.h:189
void Init(bit32 *pBindArray, int tableSize)
Definition g3d_AnimObj.cpp:74
AnimBindTable()
Definition g3d_AnimObj.h:120
Definition g3d_AnimObj.h:230
int m_Size
Definition g3d_AnimObj.h:268
float m_LastFrame
Definition g3d_AnimObj.h:270
void Init(AnimFrameCache *pFrameCacheArray, int arraySize)
Definition g3d_AnimObj.cpp:109
int GetCurveCount() const
Definition g3d_AnimObj.h:256
void SetCurveCount(int curveCount)
Definition g3d_AnimObj.h:236
void SetLastFrame(float frame)
Definition g3d_AnimObj.h:262
bool IsFrameCacheValid() const
Definition g3d_AnimObj.h:258
float GetLastFrame() const
Definition g3d_AnimObj.h:264
void Reset()
Definition g3d_AnimObj.h:244
AnimFrameCache * GetFrameCacheArray(int startIndex)
Definition g3d_AnimObj.h:260
int m_NumCurve
Definition g3d_AnimObj.h:269
AnimFrameCache * m_pFrameCacheArray
Definition g3d_AnimObj.h:267
AnimContext()
Definition g3d_AnimObj.h:232
Definition g3d_AnimObj.h:24
void SetPlayPolicy(PlayPolicy policy)
Definition g3d_AnimObj.h:60
float m_EndFrame
Definition g3d_AnimObj.h:81
void * GetUserPtr()
Definition g3d_AnimObj.h:66
float GetEndFrame() const
Definition g3d_AnimObj.h:54
float m_Frame
Definition g3d_AnimObj.h:79
float m_StartFrame
Definition g3d_AnimObj.h:80
void SetFrame(float frame)
Definition g3d_AnimObj.h:38
float GetStep() const
Definition g3d_AnimObj.h:58
const void * GetUserPtr() const
Definition g3d_AnimObj.h:68
void Init(float startFrame, float endFrame, PlayPolicy pPlayPolicy)
Definition g3d_AnimObj.cpp:19
void UpdateFrame()
Definition g3d_AnimObj.h:33
PlayPolicy GetPlayPolicy() const
Definition g3d_AnimObj.h:62
void SetStep(float step)
Definition g3d_AnimObj.h:56
void * m_pUserPtr
Definition g3d_AnimObj.h:84
AnimFrameCtrl()
Definition g3d_AnimObj.cpp:9
float(* PlayPolicy)(float inputFrame, float startFrame, float endFrame, void *pUserPtr)
Definition g3d_AnimObj.h:26
static const float INVALID_FRAME
Definition g3d_AnimObj.h:76
float GetStartFrame() const
Definition g3d_AnimObj.h:52
void SetUserPtr(void *pUserPtr)
Definition g3d_AnimObj.h:64
void SetFrameRange(float start, float end)
Definition g3d_AnimObj.h:45
float GetFrame() const
Definition g3d_AnimObj.h:43
const T * GetUserPtr() const
Definition g3d_AnimObj.h:74
T * GetUserPtr()
Definition g3d_AnimObj.h:71
float m_Step
Definition g3d_AnimObj.h:82
PlayPolicy m_pPlayPolicy
Definition g3d_AnimObj.h:83
Definition g3d_AnimObj.h:276
void SetBufferPtr(void *pBuffer)
Definition g3d_AnimObj.h:318
void * m_pResultBuffer
Definition g3d_AnimObj.h:336
AnimContext & GetContext()
Definition g3d_AnimObj.h:301
void * m_pBufferPtr
Definition g3d_AnimObj.h:337
const AnimContext & GetContext() const
Definition g3d_AnimObj.h:303
void SetResultBuffer(void *pBuffer)
Definition g3d_AnimObj.h:320
const AnimFrameCtrl & GetDefaultFrameCtrl() const
Definition g3d_AnimObj.h:299
AnimFrameCtrl & GetFrameCtrl()
Definition g3d_AnimObj.h:288
AnimFrameCtrl & GetDefaultFrameCtrl()
Definition g3d_AnimObj.h:297
const AnimFrameCtrl & GetFrameCtrl() const
Definition g3d_AnimObj.h:290
virtual void Calc()=0
void SetFrameCtrl(AnimFrameCtrl *pFrameCtrl)
Definition g3d_AnimObj.h:292
AnimFrameCtrl * m_pFrameCtrl
Definition g3d_AnimObj.h:333
void * GetResultBuffer()
Definition g3d_AnimObj.h:322
virtual ~AnimObj()
Definition g3d_AnimObj.h:286
AnimObj()
Definition g3d_AnimObj.cpp:116
AnimContext m_Context
Definition g3d_AnimObj.h:335
BindFlag
Definition g3d_AnimObj.h:279
@ SKIP_CALC
Definition g3d_AnimObj.h:281
@ DISABLED
Definition g3d_AnimObj.h:283
@ SKIP_APPLY
Definition g3d_AnimObj.h:282
@ ENABLED
Definition g3d_AnimObj.h:280
void UpdateLastFrame()
Definition g3d_AnimObj.h:330
void InvalidateContext()
Definition g3d_AnimObj.h:305
int GetCurveCount() const
Definition g3d_AnimObj.h:311
void * GetBufferPtr()
Definition g3d_AnimObj.h:313
void ResetFrameCtrl(int frameCount, bool loop)
Definition g3d_AnimObj.cpp:121
const void * GetResultBuffer() const
Definition g3d_AnimObj.h:324
virtual void ClearResult()=0
bool IsFrameChanged() const
Definition g3d_AnimObj.h:328
AnimFrameCtrl m_DefaultFrameCtrl
Definition g3d_AnimObj.h:334
Definition g3d_AnimObj.h:343
ModelAnimObj()
Definition g3d_AnimObj.h:364
virtual void BindFast(const ResModel *pModel)=0
int GetAnimCount() const
Definition g3d_AnimObj.h:359
AnimBindTable & GetBindTable()
Definition g3d_AnimObj.h:351
const AnimBindTable & GetBindTable() const
Definition g3d_AnimObj.h:353
virtual BindResult Bind(const ResModel *pModel)=0
bool IsTargetBound() const
Definition g3d_AnimObj.h:355
virtual BindResult Bind(const ModelObj *pModel)=0
AnimBindTable m_BindTable
Definition g3d_AnimObj.h:381
virtual void ApplyTo(ModelObj *pModelObj) const =0
BindFlag GetBindFlagImpl(int targetIndex) const
void SetBindFlagImpl(int targetIndex, BindFlag flag)
int GetTargetCount() const
Definition g3d_AnimObj.h:361
void SetTargetBound()
Definition g3d_AnimObj.h:366
void SetTargetUnbound()
Definition g3d_AnimObj.h:372
Definition g3d_ModelObj.h:15
Definition g3d_Binding.h:16
Definition g3d_ResModel.h:38
#define NW_G3D_ASSERT_INDEX_BOUNDS(index, size)
Definition g3d_assert.h:23
#define NW_G3D_ASSERT(exp)
Definition g3d_assert.h:17
#define NW_G3D_WARNING(exp,...)
Definition g3d_assert.h:54
#define NW_G3D_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition g3d_defs.h:81
u16 bit16
Definition g3d_defs.h:130
u32 bit32
Definition g3d_defs.h:131
Definition g3d_defs.h:122
Definition g3d_GfxManage.cpp:10
float PlayPolicy_Loop(float inputFrame, float startFrame, float endFrame, void *)
Definition g3d_AnimObj.cpp:44
float PlayPolicy_Onetime(float inputFrame, float startFrame, float endFrame, void *)
Definition g3d_AnimObj.cpp:28
Definition g3d_ResAnimCurve.h:25
float start
Definition g3d_ResAnimCurve.h:26