#ifndef J3DANIMATION_H #define J3DANIMATION_H #include "JSystem/J3DGraphAnimator/J3DModelData.h" #include "JSystem/JUtility/JUTAssert.h" #include "JSystem/JUtility/JUTNameTab.h" #include "global.h" struct JUTDataBlockHeader { /* 0x0 */ u32 mType; /* 0x4 */ u32 mSize; const JUTDataBlockHeader* getNext() const { // fake inline return reinterpret_cast(reinterpret_cast(this) + mSize); } }; struct JUTDataFileHeader { // actual struct name unknown /* 0x00 */ u32 mMagic; /* 0x04 */ u32 mType; /* 0x08 */ u32 mFileSize; /* 0x0C */ u32 mBlockNum; /* 0x10 */ u8 _10[0x1C - 0x10]; /* 0x1C */ u32 mSeAnmOffset; // Only exists for some BCKs /* 0x20 */ JUTDataBlockHeader mFirstBlock; }; // unknown name. refers to ANK1 chunk of BCK files struct J3DAnmTransform_ANK1 { /* 0x00 */ u32 magic; /* 0x04 */ u32 size; /* 0x08 */ u8 attribute; /* 0x09 */ u8 rotation_frac; /* 0x0A */ s16 duration; /* 0x0C */ s16 keyframe_num; /* 0x0E */ s16 scale_entries; /* 0x10 */ s16 rotation_entries; /* 0x12 */ s16 translation_entries; /* 0x14 */ u32 anm_data_offset; /* 0x18 */ u32 scale_data_offset; /* 0x1C */ u32 rotation_data_offset; /* 0x20 */ u32 translation_data_offset; }; typedef struct _GXColor GXColor; typedef struct _GXColorS10 GXColorS10; /** * @ingroup jsystem-j3d * */ struct J3DAnmKeyTableBase { /* 0x00 */ u16 mMaxFrame; /* 0x02 */ u16 mOffset; /* 0x04 */ u16 mType; }; // Size = 0x6 /** * @ingroup jsystem-j3d * */ struct J3DAnmColorKeyTable { J3DAnmKeyTableBase mRInfo; J3DAnmKeyTableBase mGInfo; J3DAnmKeyTableBase mBInfo; J3DAnmKeyTableBase mAInfo; }; // Size = 0x18 /** * @ingroup jsystem-j3d * */ struct J3DAnmVtxColorIndexData { /* 0x00 */ u16 mNum; /* 0x04 */ void* mpData; }; /** * @ingroup jsystem-j3d * */ struct J3DAnmColorFullTable { /* 0x00 */ u16 mRMaxFrame; /* 0x02 */ u16 mROffset; /* 0x04 */ u16 mGMaxFrame; /* 0x06 */ u16 mGOffset; /* 0x08 */ u16 mBMaxFrame; /* 0x0A */ u16 mBOffset; /* 0x0C */ u16 mAMaxFrame; /* 0x0E */ u16 mAOffset; }; // Size = 0x10 /** * @ingroup jsystem-j3d * */ struct J3DAnmVisibilityFullTable { u16 _0; u16 _2; }; // Size = 0x4 /** * @ingroup jsystem-j3d * */ struct J3DAnmTransformKeyTable { J3DAnmKeyTableBase mScaleInfo; J3DAnmKeyTableBase mRotationInfo; J3DAnmKeyTableBase mTranslateInfo; }; // Size = 0x12 /** * @ingroup jsystem-j3d * */ struct J3DAnmTransformFullTable { /* 0x00 */ u16 mScaleMaxFrame; /* 0x02 */ u16 mScaleOffset; /* 0x04 */ u16 mRotationMaxFrame; /* 0x06 */ u16 mRotationOffset; /* 0x08 */ u16 mTranslateMaxFrame; /* 0x0A */ u16 mTranslateOffset; }; // Size = 0xC /** * @ingroup jsystem-j3d * */ struct J3DAnmTexPatternFullTable { /* 0x00 */ u16 mMaxFrame; /* 0x02 */ u16 mOffset; /* 0x04 */ u8 mTexNo; /* 0x06 */ u16 _6; }; // Size = 0x8 /** * @ingroup jsystem-j3d * */ struct J3DAnmCRegKeyTable { /* 0x00 */ J3DAnmKeyTableBase mRTable; /* 0x06 */ J3DAnmKeyTableBase mGTable; /* 0x0C */ J3DAnmKeyTableBase mBTable; /* 0x12 */ J3DAnmKeyTableBase mATable; /* 0x18 */ u8 mColorId; u8 padding[3]; }; // Size = 0x1C /** * @ingroup jsystem-j3d * */ struct J3DAnmKRegKeyTable { /* 0x00 */ J3DAnmKeyTableBase mRTable; /* 0x06 */ J3DAnmKeyTableBase mGTable; /* 0x0C */ J3DAnmKeyTableBase mBTable; /* 0x12 */ J3DAnmKeyTableBase mATable; /* 0x18 */ u8 mColorId; u8 padding[3]; }; // Size = 0x1C /** * @ingroup jsystem-j3d * */ struct J3DAnmDataBlockHeader { // actual name unknown /* 0x0 */ u32 mType; /* 0x4 */ u32 mNextOffset; }; // Size = 0x8 /** * @ingroup jsystem-j3d * */ struct J3DAnmDataHeader { // actual name unknown /* 0x00 */ u32 mMagic; /* 0x04 */ u32 mType; /* 0x08 */ u8 _8[4]; /* 0x0C */ u32 mCount; /* 0x10 */ u8 _10[0x20 - 0x10]; /* 0x20 */ J3DAnmDataBlockHeader mFirst; }; /** * @ingroup jsystem-j3d * */ struct J3DAnmVtxColorFullData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; // padding? /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 mAnmTableNum[2]; /* 0x10 */ u8 field_0x10[0x18 - 0x10]; /* 0x18 */ void* mTableOffsets[2]; /* 0x20 */ void* mVtxColorIndexDataOffsets[2]; /* 0x28 */ void* mVtxColorIndexPointerOffsets[2]; /* 0x30 */ void* mRValuesOffset; /* 0x34 */ void* mGValuesOffset; /* 0x38 */ void* mBValuesOffset; /* 0x3C */ void* mAValuesOffset; }; // Size = 0x40 STATIC_ASSERT(sizeof(J3DAnmVtxColorFullData) == 0x40); /** * @ingroup jsystem-j3d * */ struct J3DAnmVisibilityFullData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; // padding? /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 field_0xc; /* 0x0E */ u16 field_0xe; /* 0x10 */ void* mTableOffset; /* 0x14 */ void* mValuesOffset; }; // Size = 0x18 STATIC_ASSERT(sizeof(J3DAnmVisibilityFullData) == 0x18); /** * @ingroup jsystem-j3d * */ struct J3DAnmTransformFullData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 field_0xc; /* 0x0E */ u8 field_0xe[0x14 - 0xe]; /* 0x14 */ void* mTableOffset; /* 0x18 */ void* mScaleValOffset; /* 0x1C */ void* mRotValOffset; /* 0x20 */ void* mTransValOffset; }; // Size = 0x24 STATIC_ASSERT(sizeof(J3DAnmTransformFullData) == 0x24); /** * @ingroup jsystem-j3d * */ struct J3DAnmColorKeyData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9[3]; /* 0x0C */ s16 mFrameMax; /* 0x0E */ u16 mUpdateMaterialNum; /* 0x10 */ u16 field_0x10; /* 0x12 */ u16 field_0x12; /* 0x14 */ u16 field_0x14; /* 0x16 */ u16 field_0x16; /* 0x18 */ void* mTableOffset; /* 0x1C */ void* mUpdateMaterialIDOffset; /* 0x20 */ void* mNameTabOffset; /* 0x24 */ void* mRValOffset; /* 0x28 */ void* mGValOffset; /* 0x2C */ void* mBValOffset; /* 0x30 */ void* mAValOffset; }; // Size = 0x34 STATIC_ASSERT(sizeof(J3DAnmColorKeyData) == 0x34); /** * @ingroup jsystem-j3d * */ struct J3DAnmTextureSRTKeyData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; /* 0x0A */ s16 field_0xa; /* 0x0C */ u16 field_0xc; /* 0x0E */ u16 field_0xe; /* 0x10 */ u16 field_0x10; /* 0x12 */ u16 field_0x12; /* 0x14 */ void* mTableOffset; /* 0x18 */ void* mUpdateMatIDOffset; /* 0x1C */ void* mNameTab1Offset; /* 0x20 */ void* mUpdateTexMtxIDOffset; /* 0x24 */ void* unkOffset; /* 0x28 */ void* mScaleValOffset; /* 0x2C */ void* mRotValOffset; /* 0x30 */ void* mTransValOffset; /* 0x34 */ u16 field_0x34; /* 0x36 */ u16 field_0x36; /* 0x38 */ u16 field_0x38; /* 0x3A */ u16 field_0x3a; /* 0x3C */ void* mInfoTable2Offset; /* 0x40 */ void* field_0x40; /* 0x44 */ void* mNameTab2Offset; /* 0x48 */ void* field_0x48; /* 0x4C */ void* field_0x4c; /* 0x50 */ void* field_0x50; /* 0x54 */ void* field_0x54; /* 0x58 */ void* field_0x58; /* 0x5C */ s32 field_0x5c; }; // Size = 0x60 STATIC_ASSERT(sizeof(J3DAnmTextureSRTKeyData) == 0x60); /** * @ingroup jsystem-j3d * */ struct J3DAnmVtxColorKeyData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 mAnmTableNum[2]; /* 0x10 */ u8 field_0x10[0x18 - 0x10]; /* 0x18 */ void* mTableOffsets[2]; /* 0x20 */ void* mVtxColoIndexDataOffset[2]; /* 0x28 */ void* mVtxColoIndexPointerOffset[2]; /* 0x30 */ void* mRValOffset; /* 0x34 */ void* mGValOffset; /* 0x38 */ void* mBValOffset; /* 0x3C */ void* mAValOffset; }; // Size = 0x40 STATIC_ASSERT(sizeof(J3DAnmVtxColorKeyData) == 0x40); /** * @ingroup jsystem-j3d * */ struct J3DAnmTexPatternFullData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 field_0xc; /* 0x0E */ u16 field_0xe; /* 0x10 */ void* mTableOffset; /* 0x14 */ void* mValuesOffset; /* 0x18 */ void* mUpdateMaterialIDOffset; /* 0x1C */ void* mNameTabOffset; }; // Size = 0x20 STATIC_ASSERT(sizeof(J3DAnmTexPatternFullData) == 0x20); /** * @ingroup jsystem-j3d * */ struct J3DAnmTevRegKeyData { /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; // maybe padding /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 mCRegUpdateMaterialNum; /* 0x0E */ u16 mKRegUpdateMaterialNum; /* 0x10 */ u16 field_0x10; /* 0x12 */ u16 field_0x12; /* 0x14 */ u16 field_0x14; /* 0x16 */ u16 field_0x16; /* 0x18 */ u16 field_0x18; /* 0x1A */ u16 field_0x1a; /* 0x1C */ u16 field_0x1c; /* 0x1E */ u16 field_0x1e; /* 0x20 */ void* mCRegTableOffset; /* 0x24 */ void* mKRegTableOffset; /* 0x28 */ void* mCRegUpdateMaterialIDOffset; /* 0x2C */ void* mKRegUpdateMaterialIDOffset; /* 0x30 */ void* mCRegNameTabOffset; /* 0x34 */ void* mKRegNameTabOffset; /* 0x38 */ void* mCRValuesOffset; /* 0x3C */ void* mCGValuesOffset; /* 0x40 */ void* mCBValuesOffset; /* 0x44 */ void* mCAValuesOffset; /* 0x48 */ void* mKRValuesOffset; /* 0x4C */ void* mKGValuesOffset; /* 0x50 */ void* mKBValuesOffset; /* 0x54 */ void* mKAValuesOffset; }; // Size = 0x58 STATIC_ASSERT(sizeof(J3DAnmTevRegKeyData) == 0x58); /** * @ingroup jsystem-j3d * */ struct J3DAnmColorFullData { /* PlaceHolder Structure */ /* 0x00 */ J3DAnmDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9[3]; /* 0x0C */ s16 mFrameMax; /* 0x0E */ u16 mUpdateMaterialNum; /* 0x10 */ u8 field_0x10[0x18 - 0x10]; /* 0x18 */ void* mTableOffset; /* 0x1C */ void* mUpdateMaterialIDOffset; /* 0x20 */ void* mNameTabOffset; /* 0x24 */ void* mRValuesOffset; /* 0x28 */ void* mGValuesOffset; /* 0x2C */ void* mBValuesOffset; /* 0x30 */ void* mAValuesOffset; }; // Size = 0x34 STATIC_ASSERT(sizeof(J3DAnmColorFullData) == 0x34); /** * @ingroup jsystem-j3d * */ struct J3DAnmClusterKeyTable { /* 0x00 */ J3DAnmKeyTableBase mWeightTable; }; /** * @ingroup jsystem-j3d * */ struct J3DAnmTransformKeyData { /* 0x00 */ JUTDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x09 */ u8 field_0x9; /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 field_0xc; /* 0x10 */ int field_0x10; /* 0x14 */ void* mTableOffset; /* 0x18 */ void* field_0x18; /* 0x1c */ void* field_0x1c; /* 0x20 */ void* field_0x20; }; /** * @ingroup jsystem-j3d * */ struct J3DAnmClusterKeyData { /* 0x00 */ JUTDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x0A */ s16 mFrameMax; /* 0x0C */ s32 field_0xc; /* 0x10 */ void* mTableOffset; /* 0x14 */ void* mWeightOffset; }; /** * @ingroup jsystem-j3d * */ struct J3DAnmClusterFullData { /* 0x00 */ JUTDataBlockHeader mHeader; /* 0x08 */ u8 field_0x8; /* 0x0A */ s16 mFrameMax; /* 0x0C */ s32 field_0xc; /* 0x10 */ void* mTableOffset; /* 0x14 */ void* mWeightOffset; }; /** * @ingroup jsystem-j3d * */ struct J3DAnmClusterFullTable { u16 mMaxFrame; u16 mOffset; }; /** * @ingroup jsystem-j3d * */ class J3DAnmBase { public: J3DAnmBase() { mAttribute = 0; field_0x5 = 0; mFrameMax = 0; mFrame = 0.0f; } J3DAnmBase(s16 i_frameMax) { mAttribute = 0; field_0x5 = 0; mFrameMax = i_frameMax; mFrame = 0.0f; } virtual ~J3DAnmBase() {} virtual s32 getKind() const = 0; u8 getAttribute() const { return mAttribute; } s16 getFrameMax() const { return mFrameMax; } f32 getFrame() const { return mFrame; } void setFrame(f32 frame) { mFrame = frame; } /* 0x4 */ u8 mAttribute; /* 0x5 */ u8 field_0x5; /* 0x6 */ s16 mFrameMax; /* 0x8 */ f32 mFrame; }; // Size: 0xC /** * @ingroup jsystem-j3d * */ class J3DAnmTransform : public J3DAnmBase { public: /* 80328E40 */ J3DAnmTransform(s16, f32*, s16*, f32*); /* 8003B93C */ virtual ~J3DAnmTransform() {} /* 8003C77C */ virtual s32 getKind() const { return 0; } virtual void getTransform(u16, J3DTransformInfo*) const = 0; /* 0x0C */ f32* mScaleData; /* 0x10 */ s16* mRotData; /* 0x14 */ f32* mTransData; /* 0x18 */ s16 field_0x18; /* 0x1A */ s16 field_0x1a; /* 0x1C */ u16 field_0x1c; /* 0x1E */ s16 field_0x1e; }; // Size: 0x20 /** * @ingroup jsystem-j3d * */ class J3DAnmTransformKey : public J3DAnmTransform { public: J3DAnmTransformKey() : J3DAnmTransform(0, NULL, NULL, NULL) { mDecShift = 0; mAnmTable = 0; } /* 80329A34 */ void calcTransform(f32, u16, J3DTransformInfo*) const; /* 8003B8D0 */ virtual ~J3DAnmTransformKey() {} /* 8003C800 */ virtual s32 getKind() const { return 8; } /* 8003C808 */ virtual void getTransform(u16 param_0, J3DTransformInfo* param_1) const { calcTransform(mFrame, param_0, param_1); } /* 0x20 */ int mDecShift; /* 0x24 */ J3DAnmTransformKeyTable* mAnmTable; }; // Size: 0x28 /** * @ingroup jsystem-j3d * */ class J3DAnmTransformFull : public J3DAnmTransform { public: J3DAnmTransformFull() : J3DAnmTransform(0, NULL, NULL, NULL) { mAnmTable = NULL; } /* 8032C2AC */ virtual ~J3DAnmTransformFull() {} /* 8032C318 */ virtual s32 getKind() const { return 9; } /* 80328E90 */ virtual void getTransform(u16, J3DTransformInfo*) const; /* 0x20 */ J3DAnmTransformFullTable* mAnmTable; }; // Size: 0x24 /** * @ingroup jsystem-j3d * */ class J3DAnmTransformFullWithLerp : public J3DAnmTransformFull { public: /* 8032C228 */ virtual ~J3DAnmTransformFullWithLerp() {} /* 8032C2A4 */ virtual s32 getKind() const { return 16; } /* 803291F0 */ virtual void getTransform(u16, J3DTransformInfo*) const; }; // Size: 0x24 struct J3DTextureSRTInfo; class J3DModelData; class J3DMaterialTable; /** * @ingroup jsystem-j3d * */ class J3DAnmTextureSRTKey : public J3DAnmBase { public: /* 80329E5C */ J3DAnmTextureSRTKey(); /* 80329F14 */ void calcTransform(f32, u16, J3DTextureSRTInfo*) const; /* 8032B0C0 */ void searchUpdateMaterialID(J3DMaterialTable*); /* 8032B1D4 */ void searchUpdateMaterialID(J3DModelData*); /* 8032C198 */ virtual ~J3DAnmTextureSRTKey() {} /* 8032C220 */ virtual s32 getKind() const { return 4; } void getTransform(u16 param_0, J3DTextureSRTInfo* pSRTInfo) const { calcTransform(getFrame(), param_0, pSRTInfo); } u16 getUpdateMaterialID(u16 idx) const { J3D_ASSERT(1029, idx < mTrackNum / 3, "Error : range over."); return mUpdateMaterialID[idx]; } u16 getUpdateMaterialNum() const { return mTrackNum / 3; } u16 getPostUpdateMaterialNum() const { return field_0x4a / 3; } int getUpdateTexMtxID(u16 idx) const { J3D_ASSERT(1017, idx < mTrackNum / 3, "Error : range over."); return mUpdateTexMtxID[idx]; } bool isValidUpdateMaterialID(u16 idx) const { return mUpdateMaterialID[idx] != 0xffff; } u32 getTexMtxCalcType() { return mTexMtxCalcType; } Vec* getSRTCenter(u16 idx) { J3D_ASSERT(1047, idx < mTrackNum / 3, "Error : range over."); return &mSRTCenter[idx]; } /* 0x0C */ int mDecShift; /* 0x10 */ J3DAnmTransformKeyTable* mAnmTable; /* 0x14 */ u16 mTrackNum; /* 0x16 */ u16 mScaleNum; /* 0x18 */ u16 mRotNum; /* 0x1A */ u16 mTransNum; /* 0x1C */ f32* mScaleData; /* 0x20 */ s16* mRotData; /* 0x24 */ f32* mTransData; /* 0x28 */ u8* mUpdateTexMtxID; /* 0x2C */ u16* mUpdateMaterialID; /* 0x30 */ JUTNameTab mUpdateMaterialName; /* 0x40 */ Vec* mSRTCenter; /* 0x44 */ u16 field_0x44; /* 0x46 */ u16 field_0x46; /* 0x48 */ u16 field_0x48; /* 0x4A */ u16 field_0x4a; /* 0x4C */ void* field_0x4c; /* 0x50 */ void* field_0x50; /* 0x54 */ void* field_0x54; /* 0x58 */ void* field_0x58; /* 0x5C */ u8* mPostUpdateTexMtxID; /* 0x60 */ u16* mPostUpdateMaterialID; /* 0x64 */ JUTNameTab mPostUpdateMaterialName; /* 0x74 */ Vec* mPostSRTCenter; /* 0x78 */ u32 mTexMtxCalcType; }; // Size: 0x7C /** * @ingroup jsystem-j3d * */ class J3DAnmTexPattern : public J3DAnmBase { public: /* 8032AED8 */ J3DAnmTexPattern(); /* 8032AF50 */ void getTexNo(u16, u16*) const; /* 8032B004 */ void searchUpdateMaterialID(J3DMaterialTable*); /* 8032B09C */ void searchUpdateMaterialID(J3DModelData*); /* 8032BD20 */ virtual ~J3DAnmTexPattern() {} /* 8032BD94 */ virtual s32 getKind() const { return 2; } u16 getUpdateMaterialID(u16 idx) const { J3D_ASSERT(2288, idx < mUpdateMaterialNum, "Error : range over."); return mUpdateMaterialID[idx]; } u16 getUpdateMaterialNum() const { return mUpdateMaterialNum; } bool isValidUpdateMaterialID(u16 id) const { return mUpdateMaterialID[id] != 0xFFFF; } J3DAnmTexPatternFullTable* getAnmTable() { return mAnmTable; } /* 0x0C */ u16* mTextureIndex; /* 0x10 */ J3DAnmTexPatternFullTable* mAnmTable; /* 0x14 */ u16 field_0x14; /* 0x16 */ u16 mUpdateMaterialNum; /* 0x18 */ u16* mUpdateMaterialID; /* 0x1C */ JUTNameTab mUpdateMaterialName; }; // Size: 0x2C /** * @ingroup jsystem-j3d * */ class J3DAnmTevRegKey : public J3DAnmBase { public: /* 8032AE18 */ J3DAnmTevRegKey(); /* 8032B1F8 */ void getTevColorReg(u16, _GXColorS10*) const; /* 8032B4BC */ void getTevKonstReg(u16, _GXColor*) const; /* 8032B780 */ void searchUpdateMaterialID(J3DMaterialTable*); /* 8032B87C */ void searchUpdateMaterialID(J3DModelData*); /* 8032BD9C */ virtual ~J3DAnmTevRegKey() {} /* 8032BE24 */ virtual s32 getKind() const { return 5; } u16 getCRegUpdateMaterialNum() const { return mCRegUpdateMaterialNum; } u16 getKRegUpdateMaterialNum() const { return mKRegUpdateMaterialNum; } u16 getCRegUpdateMaterialID(u16 idx) const { J3D_ASSERT(2100, idx < mCRegUpdateMaterialNum, "Error : range over."); return mCRegUpdateMaterialID[idx]; } u16 getKRegUpdateMaterialID(u16 idx) const { J3D_ASSERT(2140, idx < mKRegUpdateMaterialNum, "Error : range over."); return mKRegUpdateMaterialID[idx]; } const J3DAnmCRegKeyTable* getAnmCRegKeyTable() const { return mAnmCRegKeyTable; } const J3DAnmKRegKeyTable* getAnmKRegKeyTable() const { return mAnmKRegKeyTable; } bool isValidCRegUpdateMaterialID(u16 idx) { return mCRegUpdateMaterialID[idx] != 0xffff; } bool isValidKRegUpdateMaterialID(u16 idx) { return mKRegUpdateMaterialID[idx] != 0xffff; } /* 0x0C */ u16 mCRegUpdateMaterialNum; /* 0x0E */ u16 mKRegUpdateMaterialNum; /* 0x10 */ u16 mCRegDataCountR; /* 0x12 */ u16 mCRegDataCountG; /* 0x14 */ u16 mCRegDataCountB; /* 0x16 */ u16 mCRegDataCountA; /* 0x18 */ u16 mKRegDataCountR; /* 0x1A */ u16 mKRegDataCountG; /* 0x1C */ u16 mKRegDataCountB; /* 0x1E */ u16 mKRegDataCountA; /* 0x20 */ u16* mCRegUpdateMaterialID; /* 0x24 */ JUTNameTab mCRegUpdateMaterialName; /* 0x34 */ u16* mKRegUpdateMaterialID; /* 0x38 */ JUTNameTab mKRegUpdateMaterialName; /* 0x48 */ J3DAnmCRegKeyTable* mAnmCRegKeyTable; /* 0x4C */ J3DAnmKRegKeyTable* mAnmKRegKeyTable; /* 0x50 */ s16* mAnmCRegDataR; /* 0x54 */ s16* mAnmCRegDataG; /* 0x58 */ s16* mAnmCRegDataB; /* 0x5C */ s16* mAnmCRegDataA; /* 0x60 */ s16* mAnmKRegDataR; /* 0x64 */ s16* mAnmKRegDataG; /* 0x68 */ s16* mAnmKRegDataB; /* 0x6C */ s16* mAnmKRegDataA; }; // Size: 0x70 /** * @ingroup jsystem-j3d * */ class J3DAnmColor : public J3DAnmBase { public: /* 8032A828 */ J3DAnmColor(); /* 8032A8A4 */ void searchUpdateMaterialID(J3DMaterialTable*); /* 8032BCAC */ virtual ~J3DAnmColor() {} /* 8032BF44 */ virtual s32 getKind() const { return 1; } /* 8032BF4C */ virtual void getColor(u16, GXColor*) const {} u16 getUpdateMaterialNum() const { return mUpdateMaterialNum; } bool isValidUpdateMaterialID(u16 id) const { return mUpdateMaterialID[id] != 0xFFFF; } u16 getUpdateMaterialID(u16 idx) const { J3D_ASSERT(1578, idx < mUpdateMaterialNum, "Error : range over."); return mUpdateMaterialID[idx]; } /* 0x0C */ u16 field_0xc; /* 0x0E */ u16 field_0xe; /* 0x10 */ u16 field_0x10; /* 0x12 */ u16 field_0x12; /* 0x14 */ u16 mUpdateMaterialNum; /* 0x18 */ u16* mUpdateMaterialID; /* 0x1C */ JUTNameTab mUpdateMaterialName; }; // Size: 0x2C /** * @ingroup jsystem-j3d * */ class J3DAnmColorKey : public J3DAnmColor { public: /* 8032AB00 */ J3DAnmColorKey(); /* 8032BE2C */ virtual ~J3DAnmColorKey() {} /* 8032BEB0 */ virtual s32 getKind() const { return 11; } /* 8032AB54 */ virtual void getColor(u16, GXColor*) const; /* 0x2C */ s16* mColorR; /* 0x30 */ s16* mColorG; /* 0x34 */ s16* mColorB; /* 0x38 */ s16* mColorA; /* 0x3C */ J3DAnmColorKeyTable* mAnmTable; }; /** * @ingroup jsystem-j3d * */ class J3DAnmColorFull : public J3DAnmColor { public: /* 8032AB00 */ J3DAnmColorFull(); /* 8032BE2C */ virtual ~J3DAnmColorFull() {} /* 8032BEB0 */ virtual s32 getKind() const { return 10; } /* 8032AB54 */ virtual void getColor(u16, GXColor*) const; /* 0x2C */ u8* mColorR; /* 0x30 */ u8* mColorG; /* 0x34 */ u8* mColorB; /* 0x38 */ u8* mColorA; /* 0x3C */ J3DAnmColorFullTable* mAnmTable; }; /** * @ingroup jsystem-j3d * */ class J3DAnmVtxColor : public J3DAnmBase { public: J3DAnmVtxColor(); virtual ~J3DAnmVtxColor() {} virtual s32 getKind() const { return 7; } virtual void getColor(u8, u16, GXColor*) const {} /* 0x0C */ u16 mAnmTableNum[2]; /* 0x10 */ J3DAnmVtxColorIndexData* mAnmVtxColorIndexData[2]; }; // Size: 0x18 /** * @ingroup jsystem-j3d * */ class J3DAnmVtxColorKey : public J3DAnmVtxColor { public: /* 8032A4E0 */ J3DAnmVtxColorKey(); /* 8032BF50 */ virtual ~J3DAnmVtxColorKey() {} /* 8032BFBC */ virtual s32 getKind() const { return 15; } /* 8032A53C */ virtual void getColor(u8, u16, GXColor*) const; /* 0x18 */ J3DAnmColorKeyTable* mpTable[2]; /* 0x20 */ s16* mColorR; /* 0x24 */ s16* mColorG; /* 0x28 */ s16* mColorB; /* 0x2C */ s16* mColorA; }; /** * @ingroup jsystem-j3d * */ class J3DAnmVtxColorFull : public J3DAnmVtxColor { public: /* 8032A30C */ J3DAnmVtxColorFull(); /* 8032BFC4 */ virtual ~J3DAnmVtxColorFull() {} /* 8032C030 */ virtual s32 getKind() const { return 14; } /* 8032A368 */ virtual void getColor(u8, u16, GXColor*) const; /* 0x18 */ J3DAnmColorFullTable* mpTable[2]; /* 0x20 */ u8* mColorR; /* 0x24 */ u8* mColorG; /* 0x28 */ u8* mColorB; /* 0x2C */ u8* mColorA; }; /** * @ingroup jsystem-j3d * */ class J3DAnmCluster : public J3DAnmBase { public: J3DAnmCluster(s16 param_1, f32* param_2) : J3DAnmBase(param_1) { mWeight = param_2; } /* 8032BCAC */ virtual ~J3DAnmCluster() {} /* 8032BF44 */ virtual s32 getKind() const { return 3; } /* 8032BF4C */ virtual f32 getWeight(u16) const { return 1.0f; } /* 0x0C */ f32* mWeight; }; // Size: 0x10 /** * @ingroup jsystem-j3d * */ class J3DAnmClusterFull : public J3DAnmCluster { public: J3DAnmClusterFull() : J3DAnmCluster(0, 0) { mAnmTable = NULL; } /* 8032BCAC */ virtual ~J3DAnmClusterFull() {} /* 8032BF44 */ virtual s32 getKind() const { return 12; } /* 8032BF4C */ virtual f32 getWeight(u16) const; /* 0x10 */ J3DAnmClusterFullTable* mAnmTable; }; /** * @ingroup jsystem-j3d * */ class J3DAnmClusterKey : public J3DAnmCluster { public: J3DAnmClusterKey() : J3DAnmCluster(0, NULL) { mAnmTable = NULL; } /* 8032C044 */ virtual ~J3DAnmClusterKey() {} /* 8032C0B0 */ virtual s32 getKind() const { return 13; } /* 8032A218 */ virtual f32 getWeight(u16) const; /* 0x10 */ J3DAnmClusterKeyTable* mAnmTable; }; /** * @ingroup jsystem-j3d * */ class J3DAnmVisibilityFull : public J3DAnmBase { public: J3DAnmVisibilityFull() : J3DAnmBase(0) { mUpdateMaterialNum = 0; field_0xe = 0; mAnmTable = NULL; mVisibility = NULL; } /* 8033979C */ virtual ~J3DAnmVisibilityFull() {} /* 803397F8 */ virtual s32 getKind() const { return 6; } /* 0x0C */ u16 mUpdateMaterialNum; /* 0x0E */ u16 field_0xe; /* 0x10 */ J3DAnmVisibilityFullTable* mAnmTable; /* 0x14 */ u8* mVisibility; }; /** * @ingroup jsystem-j3d * */ class J3DFrameCtrl { public: enum Attribute_e { EMode_NONE, EMode_RESET, EMode_LOOP, EMode_REVERSE, EMode_LOOP_REVERSE, }; J3DFrameCtrl() { this->init(0); } void init(s16); BOOL checkPass(f32); void update(); virtual ~J3DFrameCtrl() {} u8 getAttribute() const { return mAttribute; } void setAttribute(u8 attr) { mAttribute = attr; } u8 getState() const { return mState; } bool checkState(u8 state) const { return mState & state ? true : false; } s16 getStart() const { return mStart; } void setStart(s16 start) { mStart = start; mFrame = start; } s16 getEnd() const { return mEnd; } void setEnd(s16 end) { mEnd = end; } s32 getLoop() { return mLoop; } void setLoop(s16 loop) { mLoop = loop; } f32 getRate() const { return mRate; } void setRate(f32 rate) { mRate = rate; } f32 getFrame() const { return mFrame; } void setFrame(f32 frame) { mFrame = frame; } void reset() { mFrame = mStart; mRate = 1.0f; mState = 0; } /* 0x04 */ u8 mAttribute; /* 0x05 */ u8 mState; /* 0x06 */ s16 mStart; /* 0x08 */ s16 mEnd; /* 0x0A */ s16 mLoop; /* 0x0C */ f32 mRate; /* 0x10 */ f32 mFrame; }; // Size: 0x14 struct J3DMtxCalcAnmBase: public J3DMtxCalc { J3DMtxCalcAnmBase(J3DAnmTransform* param_0) { mAnmTransform = param_0; } /* 8000D8EC */ ~J3DMtxCalcAnmBase() {} /* 80014FB8 */ J3DAnmTransform* getAnmTransform() { return mAnmTransform; } /* 80014FC0 */ void setAnmTransform(J3DAnmTransform* param_0) { mAnmTransform = param_0; } J3DAnmTransform* mAnmTransform; }; struct J3DMtxCalcAnimationAdaptorBase { J3DMtxCalcAnimationAdaptorBase() {} void change(J3DAnmTransform*) {} }; template struct J3DMtxCalcAnimationAdaptorDefault : public J3DMtxCalcAnimationAdaptorBase { J3DMtxCalcAnimationAdaptorDefault(J3DAnmTransform* param_0) {} void calc(J3DMtxCalcAnmBase* param_0) { J3DTransformInfo transform; J3DTransformInfo* transform_p; if (param_0->getAnmTransform() != NULL) { u16 jnt_no = J3DMtxCalc::getJoint()->getJntNo(); param_0->getAnmTransform()->getTransform(jnt_no, &transform); transform_p = &transform; } else { transform_p = &J3DMtxCalc::getJoint()->getTransformInfo(); } A0::calcTransform(*transform_p); } }; template struct J3DMtxCalcAnimation : public J3DMtxCalcAnmBase { J3DMtxCalcAnimation(J3DAnmTransform* param_0) : J3DMtxCalcAnmBase(param_0), field_0x8(param_0) {} ~J3DMtxCalcAnimation() {} void setAnmTransform(J3DAnmTransform* param_0) { mAnmTransform = param_0; field_0x8.change(param_0); } void init(const Vec& param_0, const Mtx& param_1) { B0::init(param_0, param_1); } void calc() { field_0x8.calc(this); } A0 field_0x8; }; #endif /* J3DANIMATION_H */