diff --git a/include/JSystem/J3DGraphAnimator/J3DAnimation.h b/include/JSystem/J3DGraphAnimator/J3DAnimation.h index 15ded86a066..562818b5bcd 100644 --- a/include/JSystem/J3DGraphAnimator/J3DAnimation.h +++ b/include/JSystem/J3DGraphAnimator/J3DAnimation.h @@ -6,6 +6,205 @@ #include "dolphin/gx/GX.h" #include "dolphin/types.h" +struct J3DAnmDataBlockHeader { // actual name unknown + /* 0x0 */ u32 mType; + /* 0x4 */ u32 mNextOffset; +}; // Size = 0x8 + +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; +}; + +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 */ s32 mTableOffsets[2]; + /* 0x20 */ s32 mVtxColorIndexDataOffsets[2]; + /* 0x28 */ s32 mVtxColorIndexPointerOffsets[2]; + /* 0x30 */ s32 mRValuesOffset; + /* 0x34 */ s32 mGValuesOffset; + /* 0x38 */ s32 mBValuesOffset; + /* 0x3C */ s32 mAValuesOffset; +}; // Size = 0x40 + +STATIC_ASSERT(sizeof(J3DAnmVtxColorFullData) == 0x40); + +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 */ s32 mTableOffset; + /* 0x14 */ s32 mValuesOffset; +}; // Size = 0x18 + +STATIC_ASSERT(sizeof(J3DAnmVisibilityFullData) == 0x18); + +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 */ s32 mTableOffset; + /* 0x18 */ s32 mScaleValOffset; + /* 0x1C */ s32 mRotValOffset; + /* 0x20 */ s32 mTransValOffset; +}; // Size = 0x24 + +STATIC_ASSERT(sizeof(J3DAnmTransformFullData) == 0x24); + +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 */ s32 mTableOffset; /* Created by retype action */ + /* 0x1C */ s32 mUpdateMaterialIDOffset; + /* 0x20 */ s32 mNameTabOffset; /* Created by retype action */ + /* 0x24 */ s32 mRValOffset; + /* 0x28 */ s32 mGValOffset; + /* 0x2C */ s32 mBValOffset; + /* 0x30 */ s32 mAValOffset; +}; // Size = 0x34 + +STATIC_ASSERT(sizeof(J3DAnmColorKeyData) == 0x34); + +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 */ s32 mTableOffset; + /* 0x18 */ s32 mUpdateMatIDOffset; + /* 0x1C */ s32 mNameTab1Offset; + /* 0x20 */ s32 mUpdateTexMtxIDOffset; + /* 0x24 */ s32 unkOffset; + /* 0x28 */ s32 mScaleValOffset; + /* 0x2C */ s32 mRotValOffset; + /* 0x30 */ s32 mTransValOffset; + /* 0x34 */ u16 field_0x34; + /* 0x36 */ u16 field_0x36; + /* 0x38 */ u16 field_0x38; + /* 0x3A */ u16 field_0x3a; + /* 0x3C */ s32 mInfoTable2Offset; + /* 0x40 */ s32 field_0x40; + /* 0x44 */ u32 mNameTab2Offset; + /* 0x48 */ s32 field_0x48; + /* 0x4C */ s32 field_0x4c; + /* 0x50 */ s32 field_0x50; + /* 0x54 */ s32 field_0x54; + /* 0x58 */ s32 field_0x58; + /* 0x5C */ s32 field_0x5c; +}; // Size = 0x60 + +STATIC_ASSERT(sizeof(J3DAnmTextureSRTKeyData) == 0x60); + +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 */ s32 mTableOffsets[2]; + /* 0x20 */ s32 mVtxColoIndexDataOffset[2]; + /* 0x28 */ s32 mVtxColoIndexPointerOffset[2]; + /* 0x30 */ s32 mRValOffset; + /* 0x34 */ s32 mGValOffset; + /* 0x38 */ s32 mBValOffset; + /* 0x3C */ s32 mAValOffset; +}; // Size = 0x40 + +STATIC_ASSERT(sizeof(J3DAnmVtxColorKeyData) == 0x40); + +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 */ s32 mTableOffset; + /* 0x14 */ s32 mValuesOffset; + /* 0x18 */ s32 mUpdaterMaterialIDOffset; + /* 0x1C */ s32 mNameTabOffset; +}; // Size = 0x20 + +STATIC_ASSERT(sizeof(J3DAnmTexPatternFullData) == 0x20); + +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 */ s32 mCRegTableOffset; + /* 0x24 */ s32 mKRegTableOffset; + /* 0x28 */ s32 mCRegUpdateMaterialIDOffset; + /* 0x2C */ s32 mKRegUpdateMaterialIDOffset; + /* 0x30 */ s32 mCRegNameTabOffset; + /* 0x34 */ s32 mKRegNameTabOffset; + /* 0x38 */ s32 mCRValuesOffset; + /* 0x3C */ s32 mCGValuesOffset; + /* 0x40 */ s32 mCBValuesOffset; + /* 0x44 */ s32 mCAValuesOffset; + /* 0x48 */ s32 mKRValuesOffset; + /* 0x4C */ s32 mKGValuesOffset; + /* 0x50 */ s32 mKBValuesOffset; + /* 0x54 */ s32 mKAValuesOffset; +}; // Size = 0x58 + +STATIC_ASSERT(sizeof(J3DAnmTevRegKeyData) == 0x58); + +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 */ s32 mTableOffset; + /* 0x1C */ s32 mUpdateMaterialIDOffset; + /* 0x20 */ s32 mNameTabOffset; + /* 0x24 */ s32 mRValuesOffset; + /* 0x28 */ s32 mGValuesOffset; + /* 0x2C */ s32 mBValuesOffset; + /* 0x30 */ s32 mAValuesOffset; +}; // Size = 0x34 + +STATIC_ASSERT(sizeof(J3DAnmColorFullData) == 0x34); + class J3DAnmBase { public: virtual ~J3DAnmBase(); diff --git a/include/JSystem/JSupport/JSupport.h b/include/JSystem/JSupport/JSupport.h new file mode 100644 index 00000000000..830116e95e3 --- /dev/null +++ b/include/JSystem/JSupport/JSupport.h @@ -0,0 +1,13 @@ +#ifndef JSUPPORT_H +#define JSUPPORT_H + +template +T* JSUConvertOffsetToPtr(const void* ptr, const void* offset) { + if (ptr == NULL) { + return NULL; + } else { + return (T*) ((s32)ptr + (s32)offset); + } +} + +#endif diff --git a/libs/JSystem/J2DGraph/J2DAnmLoader.cpp b/libs/JSystem/J2DGraph/J2DAnmLoader.cpp index b5397bc2ca3..31e29f891e3 100644 --- a/libs/JSystem/J2DGraph/J2DAnmLoader.cpp +++ b/libs/JSystem/J2DGraph/J2DAnmLoader.cpp @@ -5,6 +5,7 @@ #include "JSystem/J2DGraph/J2DAnmLoader.h" #include "JSystem/J2DGraph/J2DAnimation.h" +#include "JSystem/JSupport/JSupport.h" #include "dol2asm.h" #include "dolphin/types.h" @@ -12,193 +13,10 @@ // Types: // -struct DataBlockHeader { - /* 0x0 */ u32 mType; - /* 0x4 */ u32 mNextOffset; -}; - -struct DataHeader { - /* 0x00 */ u32 mMagic; - /* 0x04 */ u32 mType; - /* 0x08 */ u8 _8[4]; - /* 0x0C */ u32 mCount; - /* 0x10 */ u8 _10[0x20-0x10]; - /* 0x20 */ DataBlockHeader mFirst; -}; - -struct J3DAnmVtxColorFullData { /* PlaceHolder Structure */ - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9; // padding? - s16 mFrameMax; - u16 mAnmTableNum[2]; - u8 field_0x10[0x18-0x10]; - s32 mTableOffsets[2]; - s32 mVtxColorIndexDataOffsets[2]; - s32 mVtxColorIndexPointerOffsets[2]; - s32 mRValuesOffset; - s32 mGValuesOffset; - s32 mBValuesOffset; - s32 mAValuesOffset; -}; - -struct J3DAnmVisibilityFullData { - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9; // padding? - s16 mFrameMax; - u16 field_0xc; - u16 field_0xe; - s32 mTableOffset; - s32 mValuesOffset; -}; - -struct J3DAnmTransformFullData { - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9; - s16 mFrameMax; - u16 field_0xc; - u8 field_0xe[0x14-0xe]; - s32 mTableOffset; - s32 mScaleValOffset; - s32 mRotValOffset; - s32 mTransValOffset; -}; - -struct J3DAnmColorKeyData { - /* 0x00 */ DataBlockHeader 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 */ s32 mTableOffset; /* Created by retype action */ - /* 0x1C */ s32 mUpdateMaterialIDOffset; - /* 0x20 */ s32 mNameTabOffset; /* Created by retype action */ - /* 0x24 */ s32 mRValOffset; - /* 0x28 */ s32 mGValOffset; - /* 0x2C */ s32 mBValOffset; - /* 0x30 */ s32 mAValOffset; -}; // Size = 0x34 - -struct J3DAnmTextureSRTKeyData { - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9; - s16 field_0xa; - u16 field_0xc; - u16 field_0xe; - u16 field_0x10; - u16 field_0x12; - s32 mTableOffset; - s32 mUpdateMatIDOffset; - s32 mNameTab1Offset; - s32 mUpdateTexMtxIDOffset; - s32 unkOffset; - s32 mScaleValOffset; - s32 mRotValOffset; - s32 mTransValOffset; - u16 field_0x34; - u16 field_0x36; - u16 field_0x38; - u16 field_0x3a; - s32 mInfoTable2Offset; - s32 field_0x40; - u32 mNameTab2Offset; - s32 field_0x48; - s32 field_0x4c; - s32 field_0x50; - s32 field_0x54; - s32 field_0x58; - s32 field_0x5c; -}; - -struct J3DAnmVtxColorKeyData { - /* 0x00 */ DataBlockHeader mHeader; - /* 0x08 */ u8 field_0x8; - /* 0x09 */ u8 field_0x9; - /* 0x0A */ s16 mFrameMax; - /* 0x0C */ u16 mAnmTableNum[2]; - /* 0x10 */ u8 field_0x10[0x18-0x10]; - /* 0x18 */ s32 mTableOffsets[2]; - /* 0x20 */ s32 mVtxColoIndexDataOffset[2]; - /* 0x28 */ s32 mVtxColoIndexPointerOffset[2]; - /* 0x30 */ s32 mRValOffset; - /* 0x34 */ s32 mGValOffset; - /* 0x38 */ s32 mBValOffset; - /* 0x3C */ s32 mAValOffset; -}; // Size = 0x40 - -struct J3DAnmTexPatternFullData { - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9; - s16 mFrameMax; - u16 field_0xc; - u16 field_0xe; - s32 mTableOffset; - s32 mValuesOffset; - s32 mUpdaterMaterialIDOffset; - s32 mNameTabOffset; -}; - -struct J3DAnmTevRegKeyData { - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9; // maybe padding - s16 mFrameMax; - u16 mCRegUpdateMaterialNum; - u16 mKRegUpdateMaterialNum; - u16 field_0x10; - u16 field_0x12; - u16 field_0x14; - u16 field_0x16; - u16 field_0x18; - u16 field_0x1a; - u16 field_0x1c; - u16 field_0x1e; - s32 mCRegTableOffset; - s32 mKRegTableOffset; - s32 mCRegUpdateMaterialIDOffset; - s32 mKRegUpdateMaterialIDOffset; - s32 mCRegNameTabOffset; - s32 mKRegNameTabOffset; - s32 mCRValuesOffset; - s32 mCGValuesOffset; - s32 mCBValuesOffset; - s32 mCAValuesOffset; - s32 mKRValuesOffset; - s32 mKGValuesOffset; - s32 mKBValuesOffset; - s32 mKAValuesOffset; -}; - -struct J3DAnmColorFullData { /* PlaceHolder Structure */ - /* 0x00 */ DataBlockHeader mHeader; - u8 field_0x8; - u8 field_0x9[3]; - s16 mFrameMax; - u16 mUpdateMaterialNum; - u8 field_0x10[0x18-0x10]; - s32 mTableOffset; - s32 mUpdateMaterialIDOffset; - s32 mNameTabOffset; - s32 mRValuesOffset; - s32 mGValuesOffset; - s32 mBValuesOffset; - s32 mAValuesOffset; -}; - -struct J2DScreen {}; - /* 80308A6C-80309290 3033AC 0824+00 0/0 26/26 2/2 .text load__20J2DAnmLoaderDataBaseFPCv */ void* J2DAnmLoaderDataBase::load(void const* param_0) { - const DataHeader* hdr = (const DataHeader*) param_0; + const J3DAnmDataHeader* hdr = (const J3DAnmDataHeader*) param_0; if (hdr == NULL) { return NULL; } else if (hdr->mMagic == 'J3D1') { @@ -280,8 +98,8 @@ J2DAnmKeyLoader_v15::~J2DAnmKeyLoader_v15() {} /* 80309308-80309414 303C48 010C+00 2/1 0/0 0/0 .text load__19J2DAnmKeyLoader_v15FPCv */ void *J2DAnmKeyLoader_v15::load(void const* param_0) { - const DataHeader *hdr = (const DataHeader*) param_0; - const DataBlockHeader *dataPtr = &hdr->mFirst; + const J3DAnmDataHeader *hdr = (const J3DAnmDataHeader*) param_0; + const J3DAnmDataBlockHeader *dataPtr = &hdr->mFirst; for (s32 i = 0; i < hdr->mCount; i++) { switch (dataPtr->mType) { case 'ANK1': @@ -300,7 +118,7 @@ void *J2DAnmKeyLoader_v15::load(void const* param_0) { this->readAnmTevReg((J3DAnmTevRegKeyData*) dataPtr); break; } - dataPtr = (DataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); + dataPtr = (J3DAnmDataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); } return _4; } @@ -308,8 +126,8 @@ void *J2DAnmKeyLoader_v15::load(void const* param_0) { /* 80309414-80309570 303D54 015C+00 1/0 0/0 0/0 .text * setResource__19J2DAnmKeyLoader_v15FP10J2DAnmBasePCv */ void J2DAnmKeyLoader_v15::setResource(J2DAnmBase* pAnm, void const* param_1) { - const DataHeader *hdr = (const DataHeader*) param_1; - const DataBlockHeader *dataPtr = &hdr->mFirst; + const J3DAnmDataHeader *hdr = (const J3DAnmDataHeader*) param_1; + const J3DAnmDataBlockHeader *dataPtr = &hdr->mFirst; for (s32 i = 0; i < hdr->mCount; i++) { switch (dataPtr->mType) { case 'ANK1': @@ -338,7 +156,7 @@ void J2DAnmKeyLoader_v15::setResource(J2DAnmBase* pAnm, void const* param_1) { } break; } - dataPtr = (DataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); + dataPtr = (J3DAnmDataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); } } @@ -348,15 +166,6 @@ void J2DAnmKeyLoader_v15::readAnmTransform(J3DAnmTransformKeyData const* pData) this->setAnmTransform((J2DAnmTransformKey*)_4, pData); } -template // TODO move -T* JSUConvertOffsetToPtr(const void* ptr, const void* offset) { - if (ptr == NULL) { - return NULL; - } else { - return (T*) ((s32)ptr + (s32)offset); - } -} - /* 80309598-80309634 303ED8 009C+00 2/2 0/0 0/0 .text * setAnmTransform__19J2DAnmKeyLoader_v15FP18J2DAnmTransformKeyPC22J3DAnmTransformKeyData */ void J2DAnmKeyLoader_v15::setAnmTransform(J2DAnmTransformKey* param_0, J3DAnmTransformKeyData const* param_1) { @@ -478,8 +287,8 @@ void J2DAnmKeyLoader_v15::setAnmVtxColor(J2DAnmVtxColorKey* pAnm, J3DAnmVtxColor /* 80309A80-80309B8C 3043C0 010C+00 2/1 0/0 0/0 .text load__20J2DAnmFullLoader_v15FPCv */ void *J2DAnmFullLoader_v15::load(void const* param_0) { - const DataHeader *hdr = (const DataHeader*) param_0; - const DataBlockHeader *dataPtr = &hdr->mFirst; + const J3DAnmDataHeader *hdr = (const J3DAnmDataHeader*) param_0; + const J3DAnmDataBlockHeader *dataPtr = &hdr->mFirst; for (s32 i = 0; i < hdr->mCount; i++) { switch (dataPtr->mType) { case 'ANF1': @@ -498,7 +307,7 @@ void *J2DAnmFullLoader_v15::load(void const* param_0) { this->readAnmVtxColor((J3DAnmVtxColorFullData*) dataPtr); break; } - dataPtr = (DataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); + dataPtr = (J3DAnmDataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); } return _4; } @@ -506,8 +315,8 @@ void *J2DAnmFullLoader_v15::load(void const* param_0) { /* 80309B8C-80309CE8 3044CC 015C+00 1/0 0/0 0/0 .text * setResource__20J2DAnmFullLoader_v15FP10J2DAnmBasePCv */ void J2DAnmFullLoader_v15::setResource(J2DAnmBase* pAnm, void const* pData) { - const DataHeader *hdr = (const DataHeader*) pData; - const DataBlockHeader *dataPtr = &hdr->mFirst; + const J3DAnmDataHeader *hdr = (const J3DAnmDataHeader*) pData; + const J3DAnmDataBlockHeader *dataPtr = &hdr->mFirst; for (s32 i = 0; i < hdr->mCount; i++) { switch (dataPtr->mType) { case 'ANF1': @@ -531,7 +340,7 @@ void J2DAnmFullLoader_v15::setResource(J2DAnmBase* pAnm, void const* pData) { this->setAnmVtxColor((J2DAnmVtxColorFull*) pAnm, (J3DAnmVtxColorFullData*) dataPtr); break; } - dataPtr = (DataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); + dataPtr = (J3DAnmDataBlockHeader*)((s32)dataPtr + dataPtr->mNextOffset); } }