NW4F G3d
Loading...
Searching...
No Matches
g3d_ShapeAnimObj.h
Go to the documentation of this file.
1#ifndef NW_G3D_SHAPEANIMOBJ_H_
2#define NW_G3D_SHAPEANIMOBJ_H_
3
4#include <nw/g3d/g3d_config.h>
5#include <nw/g3d/g3d_AnimObj.h>
6#include <nw/g3d/res/g3d_ResShapeAnim.h>
7
8namespace nw { namespace g3d {
9
10class ModelObj;
11class ShapeObj;
12
14{
15public:
16 class InitArg;
17
19 {
21 };
22
24
25 bool Init(const InitArg& arg, void* pBuffer, size_t bufferSize);
26
27 static size_t CalcBufferSize(const InitArg& arg);
28
29 virtual BindResult Bind(const ResModel* pModel);
30 virtual BindResult Bind(const ModelObj* pModel);
31 virtual void BindFast(const ResModel* pModel);
32
33 void SetBindFlag(int shapeIndex, BindFlag flag)
34 {
36 SetBindFlagImpl(shapeIndex, flag);
37 }
38
39 BindFlag GetBindFlag(int shapeIndex)
40 {
42 return GetBindFlagImpl(shapeIndex);
43 }
44
45 virtual void ClearResult();
46 virtual void Calc();
47 virtual void ApplyTo(ModelObj* pModelObj) const;
48
49 const ResShapeAnim* GetResource() const { return m_pRes; };
50
51 void SetResource(ResShapeAnim* pRes);
52
54 {
55 m_pRes = NULL;
57 }
58
59 bool IsAcceptable(const ResModel* pModel) const
60 {
63 return pModel->GetShapeCount() <= GetBindTable().GetSize();
64 }
65
66 bool IsAcceptable(const ResShapeAnim* pRes) const
67 {
69 return pRes->GetVertexShapeAnimCount() <= m_MaxVtxShpAnim &&
70 pRes->GetKeyShapeAnimCount() <= m_MaxSubBind;
71 }
72
73 int GetKeyShapeCount(int shapeIndex) const
74 {
76 NW_G3D_ASSERT_INDEX_BOUNDS(shapeIndex, GetBindTable().GetTargetCount());
77 int idxAnim = GetBindTable().GetAnimIndex(shapeIndex);
78 if (idxAnim != AnimBindTable::NOT_BOUND && GetBindTable().IsApplyEnabled(idxAnim))
79 {
80 return m_pRes->GetVertexShapeAnim(idxAnim)->GetKeyShapeAnimCount();
81 }
82 return 0;
83 }
84
85 s8* GetKeyShapeIndexArray(int shapeIndex) const
86 {
88 NW_G3D_ASSERT_INDEX_BOUNDS(shapeIndex, GetBindTable().GetTargetCount());
89 int idxAnim = GetBindTable().GetAnimIndex(shapeIndex);
90 if (idxAnim != AnimBindTable::NOT_BOUND && GetBindTable().IsApplyEnabled(idxAnim))
91 {
92 s32 beginKeyShapeAnim = m_pRes->GetVertexShapeAnim(idxAnim)->ref().beginKeyShapeAnim;
93 return &m_pSubBindIndexArray[beginKeyShapeAnim];
94 }
95 return NULL;
96 }
97
98protected:
100 {
101 return ResVertexShapeAnim::ResCast(&m_pVertexShapeAnimArray[animIndex]);
102 }
103
104 const ResVertexShapeAnim* GetVertexShapeAnim(int animIndex) const
105 {
106 return ResVertexShapeAnim::ResCast(&m_pVertexShapeAnimArray[animIndex]);
107 }
108
109 BindResult SubBind(const ResVertexShapeAnim* pVertexShapeAnim, const ResShape* pShape);
110
111 BindResult SubBindFast(const ResVertexShapeAnim* pVertexShapeAnim);
112
113 void ApplyTo(ShapeObj* pShapeObj, int animIndex) const;
114
115private:
116 class Sizer;
122
124};
125
126class ShapeAnimObj::Sizer : public nw::g3d::Sizer
127{
128public:
130
131 void Calc(const InitArg& arg);
132
133 enum
134 {
140 };
141
143};
144
146{
147public:
149
150 void Clear()
151 {
153 m_ContextEnabled = true;
154 m_ContextAvailable = false;
155 }
156
157 void Reserve(const ResModel* pResModel)
158 {
159 NW_G3D_ASSERT_NOT_NULL(pResModel);
160 m_NumShape = std::max(m_NumShape, pResModel->GetShapeCount());
161 m_Sizer.Invalidate();
162 }
163
164 void Reserve(const ResShapeAnim* pResAnim)
165 {
166 NW_G3D_ASSERT_NOT_NULL(pResAnim);
167 m_NumVertexShapeAnim = std::max(m_NumVertexShapeAnim, pResAnim->GetVertexShapeAnimCount());
169 m_NumCurve = std::max(m_NumCurve, pResAnim->GetCurveCount());
171 m_Sizer.Invalidate();
172 }
173
174 void EnableContext() { m_ContextEnabled = true; m_Sizer.Invalidate(); }
175
176 void DisableContext() { m_ContextEnabled = false; m_Sizer.Invalidate(); }
177
179
180 void SetMaxShapeCount(int shapeCount)
181 {
182 NW_G3D_ASSERT(shapeCount >= 0);
183 m_NumShape = shapeCount;
184 m_Sizer.Invalidate();
185 }
186
187 int GetMaxShapeCount() const { return m_NumShape; }
188
189 void SetMaxVertexShapeAnimCount(int vertexShapeAnimCount)
190 {
191 NW_G3D_ASSERT(vertexShapeAnimCount >= 0);
192 m_NumVertexShapeAnim = vertexShapeAnimCount;
193 m_Sizer.Invalidate();
194 }
195
197
198 void SetMaxKeyShapeAnimCount(int keyShapeAnimCount)
199 {
200 NW_G3D_ASSERT(keyShapeAnimCount >= 0);
201 m_NumKeyShapeAnim = keyShapeAnimCount;
202 m_Sizer.Invalidate();
203 }
204
206
207 void SetMaxCurveCount(int curveCount)
208 {
209 NW_G3D_ASSERT(curveCount >= 0);
210 m_NumCurve = curveCount;
211 m_ContextAvailable = true;
212 m_Sizer.Invalidate();
213 }
214
215 int GetMaxCurveCount() const { return m_NumCurve; }
216
217 bool IsValid() const
218 {
219 return m_NumShape >= 0 && m_NumVertexShapeAnim >= 0 &&
220 m_NumKeyShapeAnim >= 0 && m_NumCurve >= 0;
221 }
222
223 Sizer& GetSizer() const { return m_Sizer; }
224
225 InitArg(int shapeCount, int vertexShapeAnimCount, int keyShapeAnimCount)
226 : m_NumShape(shapeCount)
227 , m_NumVertexShapeAnim(vertexShapeAnimCount)
228 , m_NumKeyShapeAnim(keyShapeAnimCount)
229 , m_NumCurve(0)
230 , m_ContextEnabled(false)
231 , m_ContextAvailable(true)
232 {
233 NW_G3D_ASSERT(shapeCount >= 0);
234 NW_G3D_ASSERT(vertexShapeAnimCount >= 0);
235 NW_G3D_ASSERT(keyShapeAnimCount >= 0);
236 }
237
238 void EnableContext(int curveCount)
239 {
240 NW_G3D_ASSERT(curveCount >= 0);
241 m_NumCurve = curveCount;
242 m_ContextEnabled = true;
243 m_Sizer.Invalidate();
244 }
245
246private:
253 mutable Sizer m_Sizer;
254};
255
256} } // namespace nw::g3d
257
258#endif // NW_G3D_SHAPEANIMOBJ_H_
Definition g3d_AnimObj.h:94
@ NOT_BOUND
Definition g3d_AnimObj.h:106
BindFlag
Definition g3d_AnimObj.h:279
Definition g3d_AnimObj.h:343
ModelAnimObj()
Definition g3d_AnimObj.h:364
BindFlag GetBindFlagImpl(int targetIndex) const
void SetBindFlagImpl(int targetIndex, BindFlag flag)
void SetTargetUnbound()
Definition g3d_AnimObj.h:372
Definition g3d_ModelObj.h:15
Definition g3d_ShapeAnimObj.h:146
void Reserve(const ResModel *pResModel)
Definition g3d_ShapeAnimObj.h:157
int m_NumCurve
Definition g3d_ShapeAnimObj.h:250
bool m_ContextEnabled
Definition g3d_ShapeAnimObj.h:251
bool IsValid() const
Definition g3d_ShapeAnimObj.h:217
void DisableContext()
Definition g3d_ShapeAnimObj.h:176
int GetMaxShapeCount() const
Definition g3d_ShapeAnimObj.h:187
InitArg(int shapeCount, int vertexShapeAnimCount, int keyShapeAnimCount)
Definition g3d_ShapeAnimObj.h:225
int m_NumShape
Definition g3d_ShapeAnimObj.h:247
bool m_ContextAvailable
Definition g3d_ShapeAnimObj.h:252
Sizer m_Sizer
Definition g3d_ShapeAnimObj.h:253
int m_NumKeyShapeAnim
Definition g3d_ShapeAnimObj.h:249
int m_NumVertexShapeAnim
Definition g3d_ShapeAnimObj.h:248
void SetMaxKeyShapeAnimCount(int keyShapeAnimCount)
Definition g3d_ShapeAnimObj.h:198
int GetMaxVertexShapeAnimCount() const
Definition g3d_ShapeAnimObj.h:196
bool IsContextEnabled() const
Definition g3d_ShapeAnimObj.h:178
InitArg()
Definition g3d_ShapeAnimObj.h:148
Sizer & GetSizer() const
Definition g3d_ShapeAnimObj.h:223
void Clear()
Definition g3d_ShapeAnimObj.h:150
int GetMaxCurveCount() const
Definition g3d_ShapeAnimObj.h:215
void SetMaxShapeCount(int shapeCount)
Definition g3d_ShapeAnimObj.h:180
void EnableContext()
Definition g3d_ShapeAnimObj.h:174
void SetMaxCurveCount(int curveCount)
Definition g3d_ShapeAnimObj.h:207
int GetMaxKeyShapeAnimCount() const
Definition g3d_ShapeAnimObj.h:205
void Reserve(const ResShapeAnim *pResAnim)
Definition g3d_ShapeAnimObj.h:164
void EnableContext(int curveCount)
Definition g3d_ShapeAnimObj.h:238
void SetMaxVertexShapeAnimCount(int vertexShapeAnimCount)
Definition g3d_ShapeAnimObj.h:189
Definition g3d_ShapeAnimObj.h:127
Chunk chunk[NUM_CHUNK]
Definition g3d_ShapeAnimObj.h:142
@ BIND_TABLE
Definition g3d_ShapeAnimObj.h:136
@ FRAMECACHE_ARRAY
Definition g3d_ShapeAnimObj.h:138
@ NUM_CHUNK
Definition g3d_ShapeAnimObj.h:139
@ SUBBIND_TABLE
Definition g3d_ShapeAnimObj.h:137
@ RESULT_BUFFER
Definition g3d_ShapeAnimObj.h:135
void Calc(const InitArg &arg)
Definition g3d_ShapeAnimObj.cpp:8
Sizer()
Definition g3d_ShapeAnimObj.h:129
Definition g3d_ShapeAnimObj.h:14
BindResult SubBindFast(const ResVertexShapeAnim *pVertexShapeAnim)
Definition g3d_ShapeAnimObj.cpp:192
ResVertexShapeAnimData * m_pVertexShapeAnimArray
Definition g3d_ShapeAnimObj.h:118
ShapeAnimObj()
Definition g3d_ShapeAnimObj.h:23
s8 * m_pSubBindIndexArray
Definition g3d_ShapeAnimObj.h:121
virtual void ApplyTo(ModelObj *pModelObj) const
Definition g3d_ShapeAnimObj.cpp:274
void SetResource(ResShapeAnim *pRes)
Definition g3d_ShapeAnimObj.cpp:64
ResVertexShapeAnim * GetVertexShapeAnim(int animIndex)
Definition g3d_ShapeAnimObj.h:99
static size_t CalcBufferSize(const InitArg &arg)
Definition g3d_ShapeAnimObj.cpp:26
bool IsAcceptable(const ResShapeAnim *pRes) const
Definition g3d_ShapeAnimObj.h:66
virtual void Calc()
Definition g3d_ShapeAnimObj.cpp:223
s32 m_MaxVtxShpAnim
Definition g3d_ShapeAnimObj.h:119
virtual void BindFast(const ResModel *pModel)
Definition g3d_ShapeAnimObj.cpp:144
void SetBindFlag(int shapeIndex, BindFlag flag)
Definition g3d_ShapeAnimObj.h:33
bool IsAcceptable(const ResModel *pModel) const
Definition g3d_ShapeAnimObj.h:59
int GetKeyShapeCount(int shapeIndex) const
Definition g3d_ShapeAnimObj.h:73
ResShapeAnim * m_pRes
Definition g3d_ShapeAnimObj.h:117
void ResetResource()
Definition g3d_ShapeAnimObj.h:53
BindResult SubBind(const ResVertexShapeAnim *pVertexShapeAnim, const ResShape *pShape)
Definition g3d_ShapeAnimObj.cpp:171
bool Init(const InitArg &arg, void *pBuffer, size_t bufferSize)
Definition g3d_ShapeAnimObj.cpp:33
const ResVertexShapeAnim * GetVertexShapeAnim(int animIndex) const
Definition g3d_ShapeAnimObj.h:104
Alignment
Definition g3d_ShapeAnimObj.h:19
@ BUFFER_ALIGNMENT
Definition g3d_ShapeAnimObj.h:20
const ResShapeAnim * GetResource() const
Definition g3d_ShapeAnimObj.h:49
s32 m_MaxSubBind
Definition g3d_ShapeAnimObj.h:120
virtual BindResult Bind(const ResModel *pModel)
Definition g3d_ShapeAnimObj.cpp:79
virtual void ClearResult()
Definition g3d_ShapeAnimObj.cpp:210
s8 * GetKeyShapeIndexArray(int shapeIndex) const
Definition g3d_ShapeAnimObj.h:85
void ApplyTo(ShapeObj *pShapeObj, int animIndex) const
Definition g3d_ShapeAnimObj.cpp:294
BindFlag GetBindFlag(int shapeIndex)
Definition g3d_ShapeAnimObj.h:39
virtual BindResult Bind(const ModelObj *pModel)
Definition g3d_ShapeAnimObj.cpp:111
Definition g3d_ShapeObj.h:95
Definition g3d_Sizer.h:10
Sizer()
Definition g3d_Sizer.h:18
Definition g3d_Binding.h:16
Definition g3d_ResModel.h:38
Definition g3d_ResShapeAnim.h:81
int GetCurveCount() const
Definition g3d_ResShapeAnim.h:109
bool IsCurveBaked() const
Definition g3d_ResShapeAnim.h:103
int GetKeyShapeAnimCount() const
Definition g3d_ResShapeAnim.h:107
Definition g3d_ResShape.h:237
Definition g3d_ResShapeAnim.h:32
int GetKeyShapeAnimCount() const
Definition g3d_ResShapeAnim.h:56
#define NW_G3D_ASSERT_NOT_NULL(exp)
Definition g3d_assert.h:20
#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_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition g3d_defs.h:81
Definition g3d_GfxManage.cpp:10
Definition g3d_Sizer.h:13
Definition g3d_ResShapeAnim.h:17