1#ifndef NW_G3D_SKELETALANIMOBJ_H_
2#define NW_G3D_SKELETALANIMOBJ_H_
4#include <nw/g3d/g3d_config.h>
5#include <nw/g3d/g3d_AnimObj.h>
6#include <nw/g3d/res/g3d_ResModel.h>
7#include <nw/g3d/res/g3d_ResSkeletalAnim.h>
9namespace nw {
namespace g3d {
26 bool Init(
const InitArg& arg,
void* pBuffer, size_t bufferSize);
88 return pSkeleton->GetBoneCount() <= GetBindTable().GetSize();
94 return pRes->GetBoneAnimCount() <= m_MaxBoneAnim;
99 return Align(
sizeof(BoneAnimResult) *
static_cast<size_t>(GetBindTable().GetAnimCount()), LL_CACHE_FETCH_SIZE);
127 template <
typename ConvRot>
130 template <
typename ConvRot>
183 m_Sizer.Invalidate();
198 m_Sizer.Invalidate();
211 m_Sizer.Invalidate();
224 m_Sizer.Invalidate();
234 m_Sizer.Invalidate();
271 bool Init(
const InitArg& arg,
void* pBuffer, size_t bufferSize);
286 m_NumBone =
static_cast<u16>(count);
323 return Align(
sizeof(BoneAnimBlendResult) * m_NumBone, LL_CACHE_FETCH_SIZE);
345 template <
typename ConvRot,
BlendMode mode>
387 m_Sizer.Invalidate();
400 m_Sizer.Invalidate();
461 return length == 0.0f;
469#if defined( __ghs__ )
470 f32x2 sincosx = Math::SinCos(pResult->euler.x);
471 f32x2 sincosy = Math::SinCos(pResult->euler.y);
472 f32x2 sincosz = Math::SinCos(pResult->euler.z);
474 f32x2 cossinx = __PS_MERGE10(sincosx, sincosx);
476 f32x2 sxsz_cxcz = __PS_MUL(sincosx, sincosz);
477 f32x2 cxsz_sxcz = __PS_MUL(cossinx, sincosz);
478 f32x2 cxcz_sxsz = __PS_MERGE10(sxsz_cxcz, sxsz_cxcz);
479 f32x2 sxcz_cxsz = __PS_MERGE10(cxsz_sxcz, cxsz_sxcz);
481 f32x2 sy_sy = __PS_MERGE00(sincosy, sincosy);
482 f32x2 cysz_cycz = __PS_MULS1(sincosz, sincosy);
484 f32x2 xz_yy = __PS_MADD(cxcz_sxsz, sy_sy, sxsz_cxcz);
485 f32x2 xy_yz = __PS_MSUB(sxcz_cxsz, sy_sy, cxsz_sxcz);
487 pResult->axes[0].x = cysz_cycz[1];
488 pResult->axes[1].x = cysz_cycz[0];
490 reinterpret_cast<f32x2&>(pResult->axes[0].a[1]) = __PS_MERGE00(xy_yz, xz_yy);
491 reinterpret_cast<f32x2&>(pResult->axes[1].a[1]) = __PS_MERGE11(xz_yy, xy_yz);
493 float sx, sy, sz, cx, cy, cz;
498 float cxcz = cx * cz;
499 float sxsy = sx * sy;
500 float cxsz = cx * sz;
502 pResult
->axes[0].x = cy * cz;
503 pResult
->axes[1].x = cy * sz;
505 pResult
->axes[0].y = sxsy * cz - cxsz;
506 pResult
->axes[1].y = sxsy * sz + cxcz;
508 pResult
->axes[0].z = cxcz * sy + sx * sz;
509 pResult
->axes[1].z = cxsz * sy - sx * cz;
520 float yy2 = 2 * quat.y * quat.y;
521 float zz2 = 2 * quat.z * quat.z;
522 float xx2 = 2 * quat.x * quat.x;
523 float xy2 = 2 * quat.x * quat.y;
524 float xz2 = 2 * quat.x * quat.z;
525 float yz2 = 2 * quat.y * quat.z;
526 float wz2 = 2 * quat.w * quat.z;
527 float wx2 = 2 * quat.w * quat.x;
528 float wy2 = 2 * quat.w * quat.y;
530 axisX.x = 1.0f - yy2 - zz2;
535 axisY.y = 1.0f - xx2 - zz2;
555#if defined( __ghs__ )
556 f32x2 lengthSqYZ = { lengthSqY, lengthSqZ };
557 f32x2 rsqrtYZ = Math::RSqrt(lengthSqYZ);
558 float rsqrtY = rsqrtYZ[0], rsqrtZ = rsqrtYZ[1];
BindFlag
Definition g3d_AnimObj.h:279
Definition g3d_SkeletalAnimObj.h:427
static void Convert(Mtx34 *pMtx, const BoneAnimBlendResult *pResult)
Definition g3d_SkeletalAnimObj.h:540
static void Convert(Mtx34 *pMtx, const BoneAnimResult *pResult)
Definition g3d_SkeletalAnimObj.h:573
Definition g3d_SkeletalAnimObj.h:415
static void Convert(BoneAnimResult *pResult)
Definition g3d_SkeletalAnimObj.h:467
Definition g3d_SkeletalAnimObj.h:434
static void Convert(Mtx34 *pMtx, const BoneAnimResult *pResult)
Definition g3d_SkeletalAnimObj.h:436
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_SkeletalAnimObj.h:421
static void Convert(BoneAnimResult *pResult)
Definition g3d_SkeletalAnimObj.h:514
Definition g3d_SkeletalAnimObj.h:443
static void Convert(Mtx34 *pMtx, const BoneAnimBlendResult *pResult)
Definition g3d_SkeletalAnimObj.h:450
static void Convert(Mtx34 *pMtx, const BoneAnimResult *pResult)
Definition g3d_SkeletalAnimObj.h:445
Definition g3d_Sizer.h:10
Sizer()
Definition g3d_Sizer.h:18
Definition g3d_SkeletalAnimObj.cpp:430
Definition g3d_SkeletalAnimObj.h:377
bool IsValid() const
Definition g3d_SkeletalAnimObj.h:405
void Clear()
Definition g3d_SkeletalAnimObj.h:381
InitArg()
Definition g3d_SkeletalAnimObj.h:379
void Reserve(const ResSkeleton *pResSkeleton)
Definition g3d_SkeletalAnimObj.h:383
Sizer & GetSizer() const
Definition g3d_SkeletalAnimObj.h:407
Sizer m_Sizer
Definition g3d_SkeletalAnimObj.h:411
int m_NumBone
Definition g3d_SkeletalAnimObj.h:410
int GetMaxBoneCount() const
Definition g3d_SkeletalAnimObj.h:403
void Reserve(const ResModel *pResModel)
Definition g3d_SkeletalAnimObj.h:390
void SetMaxBoneCount(int boneCount)
Definition g3d_SkeletalAnimObj.h:396
Definition g3d_SkeletalAnimObj.h:361
void Calc(const InitArg &arg)
Definition g3d_SkeletalAnimObj.cpp:442
Chunk chunk[NUM_CHUNK]
Definition g3d_SkeletalAnimObj.h:373
@ RESULT_BUFFER
Definition g3d_SkeletalAnimObj.h:369
@ NUM_CHUNK
Definition g3d_SkeletalAnimObj.h:370
Sizer()
Definition g3d_SkeletalAnimObj.h:363
Definition g3d_SkeletalAnimObj.h:254
BlendMode GetBlendMode() const
Definition g3d_SkeletalAnimObj.h:295
void SetBlendMode(BlendMode mode)
Definition g3d_SkeletalAnimObj.h:293
size_t CalcLCSize() const
Definition g3d_SkeletalAnimObj.h:321
void * m_pBufferPtr
Definition g3d_SkeletalAnimObj.h:355
void ApplyToImpl(SkeletonObj *pSkeletonObj) const
Definition g3d_SkeletalAnimObj.cpp:556
void * m_pMemResultBuffer
Definition g3d_SkeletalAnimObj.h:354
void ClearResult()
Definition g3d_SkeletalAnimObj.cpp:489
const BoneAnimBlendResult * GetResultArray() const
Definition g3d_SkeletalAnimObj.h:309
u16 m_MaxBone
Definition g3d_SkeletalAnimObj.h:351
BlendMode
Definition g3d_SkeletalAnimObj.h:257
@ BLEND_INTERPOLATE
Definition g3d_SkeletalAnimObj.h:258
@ BLEND_ADD
Definition g3d_SkeletalAnimObj.h:259
static size_t CalcBufferSize(const InitArg &arg)
Definition g3d_SkeletalAnimObj.cpp:455
BoneAnimBlendResult * GetResultArray()
Definition g3d_SkeletalAnimObj.h:303
int GetMaxBoneCount() const
Definition g3d_SkeletalAnimObj.h:291
bool Init(const InitArg &arg, void *pBuffer, size_t bufferSize)
Definition g3d_SkeletalAnimObj.cpp:462
bool IsResultOnCache() const
Definition g3d_SkeletalAnimObj.h:330
Alignment
Definition g3d_SkeletalAnimObj.h:265
@ BUFFER_ALIGNMENT
Definition g3d_SkeletalAnimObj.h:266
size_t LCMount(void *pLC, size_t size, bool load)
void Blend(SkeletalAnimObj *pAnimObj, float weight)
Definition g3d_SkeletalAnimObj.cpp:497
bit32 m_Flag
Definition g3d_SkeletalAnimObj.h:353
void * m_pResultBuffer
Definition g3d_SkeletalAnimObj.h:350
int GetBoneCount() const
Definition g3d_SkeletalAnimObj.h:289
void ApplyTo(SkeletonObj *pSkeletonObj) const
Definition g3d_SkeletalAnimObj.cpp:548
void EnableSlerp()
Definition g3d_SkeletalAnimObj.h:297
Flag
Definition g3d_SkeletalAnimObj.h:336
@ USE_SLERP
Definition g3d_SkeletalAnimObj.h:338
@ INVALID_RESULT
Definition g3d_SkeletalAnimObj.h:341
@ MASK_RESULT
Definition g3d_SkeletalAnimObj.h:342
@ NORMALIZED
Definition g3d_SkeletalAnimObj.h:339
@ BLEND_MASK
Definition g3d_SkeletalAnimObj.h:337
@ CACHE_RESULT
Definition g3d_SkeletalAnimObj.h:340
void SetBoneCount(int count)
Definition g3d_SkeletalAnimObj.h:283
u16 m_NumBone
Definition g3d_SkeletalAnimObj.h:352
void * GetBufferPtr()
Definition g3d_SkeletalAnimObj.h:281
void DisableSlerp()
Definition g3d_SkeletalAnimObj.h:299
BoneAnimBlendResult * GetResultArrayMutable() const
Definition g3d_SkeletalAnimObj.h:315
bool IsSlerpEnabled() const
Definition g3d_SkeletalAnimObj.h:301
SkeletalAnimBlender()
Definition g3d_SkeletalAnimObj.h:269
void LCUnmount(bool store)
Definition g3d_SkeletalAnimObj.h:167
bool m_ContextAvailable
Definition g3d_SkeletalAnimObj.h:248
void SetMaxBoneCount(int boneCount)
Definition g3d_SkeletalAnimObj.h:207
int GetMaxBoneAnimCount() const
Definition g3d_SkeletalAnimObj.h:227
int GetMaxCurveCount() const
Definition g3d_SkeletalAnimObj.h:237
int m_NumBoneAnim
Definition g3d_SkeletalAnimObj.h:245
void Reserve(const ResSkeletalAnim *pResAnim)
Definition g3d_SkeletalAnimObj.h:192
void SetMaxCurveCount(int curveCount)
Definition g3d_SkeletalAnimObj.h:229
void EnableContext()
Definition g3d_SkeletalAnimObj.h:201
InitArg()
Definition g3d_SkeletalAnimObj.h:169
void SetMaxBoneAnimCount(int boneAnimCount)
Definition g3d_SkeletalAnimObj.h:220
void DisableContext()
Definition g3d_SkeletalAnimObj.h:203
void Clear()
Definition g3d_SkeletalAnimObj.h:171
Sizer & GetSizer() const
Definition g3d_SkeletalAnimObj.h:241
int m_NumBone
Definition g3d_SkeletalAnimObj.h:244
int m_NumCurve
Definition g3d_SkeletalAnimObj.h:246
void Reserve(const ResModel *pResModel)
Definition g3d_SkeletalAnimObj.h:186
Sizer m_Sizer
Definition g3d_SkeletalAnimObj.h:250
int GetMaxBoneCount() const
Definition g3d_SkeletalAnimObj.h:214
bool IsContextEnabled() const
Definition g3d_SkeletalAnimObj.h:205
bool IsValid() const
Definition g3d_SkeletalAnimObj.h:239
bool m_ContextEnabled
Definition g3d_SkeletalAnimObj.h:247
void Reserve(const ResSkeleton *pResSkeleton)
Definition g3d_SkeletalAnimObj.h:179
Definition g3d_SkeletalAnimObj.h:148
@ FRAMECACHE_ARRAY
Definition g3d_SkeletalAnimObj.h:158
@ NUM_CHUNK
Definition g3d_SkeletalAnimObj.h:160
@ BIND_TABLE
Definition g3d_SkeletalAnimObj.h:157
@ RESULT_BUFFER
Definition g3d_SkeletalAnimObj.h:156
void Calc(const InitArg &arg)
Definition g3d_SkeletalAnimObj.cpp:121
Chunk chunk[NUM_CHUNK]
Definition g3d_SkeletalAnimObj.h:163
Sizer()
Definition g3d_SkeletalAnimObj.h:150
Definition g3d_SkeletalAnimObj.h:15
virtual void ClearResult()
Definition g3d_SkeletalAnimObj.cpp:269
const ResBoneAnim * GetBoneAnim(int animIndex) const
Definition g3d_SkeletalAnimObj.h:122
void SetBindFlag(const ResSkeleton *pSkeleton, int boneIndex, BindFlag flag)
Definition g3d_SkeletalAnimObj.cpp:313
bit32 m_Flag
Definition g3d_SkeletalAnimObj.h:139
void ApplyTo(SkeletonObj *pSkeletonObj) const
Definition g3d_SkeletalAnimObj.cpp:351
SkeletalAnimObj()
Definition g3d_SkeletalAnimObj.h:24
size_t CalcLCSize() const
Definition g3d_SkeletalAnimObj.h:97
void BindFast(const ResSkeleton *pSkeleton)
Definition g3d_SkeletalAnimObj.cpp:250
BoneAnimResult * GetResultArray()
Definition g3d_SkeletalAnimObj.h:72
Alignment
Definition g3d_SkeletalAnimObj.h:20
@ BUFFER_ALIGNMENT
Definition g3d_SkeletalAnimObj.h:21
ResBoneAnimData * m_pBoneAnimArray
Definition g3d_SkeletalAnimObj.h:137
virtual void BindFast(const ResModel *pModel)
Definition g3d_SkeletalAnimObj.cpp:263
bool IsAcceptable(const ResSkeletalAnim *pRes) const
Definition g3d_SkeletalAnimObj.h:91
Flag
Definition g3d_SkeletalAnimObj.h:110
@ MASK_RESULT
Definition g3d_SkeletalAnimObj.h:113
@ INVALID_RESULT
Definition g3d_SkeletalAnimObj.h:112
@ CACHE_RESULT
Definition g3d_SkeletalAnimObj.h:111
void(SkeletalAnimObj::* m_pFuncApplyToImpl)(SkeletonObj *) const
Definition g3d_SkeletalAnimObj.h:142
static size_t CalcBufferSize(const InitArg &arg)
Definition g3d_SkeletalAnimObj.cpp:139
void(SkeletalAnimObj::* m_pFuncCalcImpl)()
Definition g3d_SkeletalAnimObj.h:141
ResBoneAnim * GetBoneAnim(int animIndex)
Definition g3d_SkeletalAnimObj.h:117
BindResult Bind(const ResSkeleton *pSkeleton)
Definition g3d_SkeletalAnimObj.cpp:204
bool IsAcceptable(const ResSkeleton *pSkeleton) const
Definition g3d_SkeletalAnimObj.h:84
virtual BindResult Bind(const ResModel *pModel)
Definition g3d_SkeletalAnimObj.cpp:238
s32 m_MaxBoneAnim
Definition g3d_SkeletalAnimObj.h:138
BindResult Bind(const SkeletonObj *pSkeletonObj)
Definition g3d_SkeletalAnimObj.cpp:232
void SetBindFlag(int boneIndex, BindFlag flag)
Definition g3d_SkeletalAnimObj.h:40
virtual void Calc()
Definition g3d_SkeletalAnimObj.cpp:333
bool Init(const InitArg &arg, void *pBuffer, size_t bufferSize)
Definition g3d_SkeletalAnimObj.cpp:146
BindFlag GetBindFlag(int boneIndex)
Definition g3d_SkeletalAnimObj.h:48
void LCUnmount(bool store)
bool IsResultOnCache() const
Definition g3d_SkeletalAnimObj.h:106
virtual void ApplyTo(ModelObj *pModelObj) const
Definition g3d_SkeletalAnimObj.cpp:345
virtual BindResult Bind(const ModelObj *pModelObj)
Definition g3d_SkeletalAnimObj.cpp:244
void ApplyToImpl(SkeletonObj *pSkeletonObj) const
Definition g3d_SkeletalAnimObj.cpp:407
size_t LCMount(void *pLC, size_t size, bool load)
const ResSkeletalAnim * GetResource() const
Definition g3d_SkeletalAnimObj.h:62
void SetResource(ResSkeletalAnim *pRes)
Definition g3d_SkeletalAnimObj.cpp:178
void ResetResource()
Definition g3d_SkeletalAnimObj.h:66
const BoneAnimResult * GetResultArray() const
Definition g3d_SkeletalAnimObj.h:78
void CalcImpl()
Definition g3d_SkeletalAnimObj.cpp:361
void * m_pMemResultBuffer
Definition g3d_SkeletalAnimObj.h:140
ResSkeletalAnim * m_pRes
Definition g3d_SkeletalAnimObj.h:136
void ClearResult(const ResSkeleton *pSkeleton)
Definition g3d_SkeletalAnimObj.cpp:283
Definition g3d_SkeletonObj.h:102
Definition g3d_MathCommon.h:9
static void SinCos(float *pSin, float *pCos, float rad)
Definition g3d_MathCommon-inl.h:238
static float RSqrt(float x)
Definition g3d_MathCommon-inl.h:150
Definition g3d_Matrix34.h:34
Mtx34 & SetR(const Quat &r)
Definition g3d_Matrix34-inl.h:150
Mtx34 & SetR(const Vec3 &r)
Definition g3d_Matrix34-inl.h:122
Definition g3d_Quaternion.h:28
Definition g3d_Vector3.h:30
Vec3 & Set(const Vec3 &v)
Definition g3d_Vector3-inl.h:47
static Vec3 * Cast(float *a)
Definition g3d_Vector3-inl.h:15
Vec3 & Cross(const Vec3 &lhs, const Vec3 &rhs)
Definition g3d_Vector3-inl.h:276
Vec3 & Mul(const Vec3 &lhs, float rhs)
Definition g3d_Vector3-inl.h:154
static float LengthSq(const Vec3 &v)
Definition g3d_Vector3-inl.h:241
Definition g3d_Binding.h:16
Definition g3d_ResSkeletalAnim.h:55
Definition g3d_ResModel.h:38
Definition g3d_ResSkeletalAnim.h:123
bool IsCurveBaked() const
Definition g3d_ResSkeletalAnim.h:158
int GetCurveCount() const
Definition g3d_ResSkeletalAnim.h:164
Definition g3d_ResSkeleton.h:162
#define NW_G3D_ASSERT_NOT_NULL(exp)
Definition g3d_assert.h:20
#define NW_G3D_ASSERT(exp)
Definition g3d_assert.h:17
#define NW_G3D_WARNING(exp,...)
Definition g3d_assert.h:54
#define NW_G3D_INLINE
Definition g3d_defs.h:68
#define NW_G3D_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition g3d_defs.h:81
u32 bit32
Definition g3d_defs.h:131
Definition g3d_SkeletalAnimObj.h:456
NW_G3D_INLINE bool LengthSqEqualsZero(float length)
Definition g3d_SkeletalAnimObj.h:459
Definition g3d_GfxManage.cpp:10
Definition g3d_Sizer.h:13
Vec4 v[DIM_MAJOR]
Definition g3d_Matrix34.h:26
float a[DIM]
Definition g3d_Vector4.h:18
Definition g3d_ResSkeletalAnim.h:28
Quat rotate
Definition g3d_ResSkeletalAnim.h:37
Vec3 axes[2]
Definition g3d_ResSkeletalAnim.h:36
Definition g3d_ResSkeletalAnim.h:14
Vec3 euler
Definition g3d_ResSkeletalAnim.h:21
Vec3 axes[2]
Definition g3d_ResSkeletalAnim.h:24
Quat quat
Definition g3d_ResSkeletalAnim.h:22
Definition g3d_ResSkeletalAnim.h:42