From 2e376d3744417c311b9a0d91f496df5a87e9325a Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Wed, 3 Jan 2024 18:37:04 -0500 Subject: [PATCH] J3DClusterLoader OK --- configure.py | 2 +- include/JSystem/J3DGraphAnimator/J3DCluster.h | 71 +++++++++-- .../JSystem/J3DGraphAnimator/J3DSkinDeform.h | 65 +++++------ .../JSystem/J3DGraphLoader/J3DClusterLoader.h | 46 +++++++- src/JSystem/J3DGraphAnimator/J3DCluster.cpp | 8 +- .../J3DGraphLoader/J3DClusterLoader.cpp | 110 ++++++++++++++++-- 6 files changed, 242 insertions(+), 60 deletions(-) diff --git a/configure.py b/configure.py index c610a4670..6c13c8339 100644 --- a/configure.py +++ b/configure.py @@ -893,7 +893,7 @@ config.libs = [ [ Object(NonMatching, "JSystem/J3DGraphLoader/J3DMaterialFactory.cpp"), Object(NonMatching, "JSystem/J3DGraphLoader/J3DMaterialFactory_v21.cpp"), - Object(NonMatching, "JSystem/J3DGraphLoader/J3DClusterLoader.cpp"), + Object(Matching, "JSystem/J3DGraphLoader/J3DClusterLoader.cpp"), Object(Matching, "JSystem/J3DGraphLoader/J3DModelLoader.cpp"), Object(NonMatching, "JSystem/J3DGraphLoader/J3DModelLoaderCalcSize.cpp"), Object(Matching, "JSystem/J3DGraphLoader/J3DJointFactory.cpp"), diff --git a/include/JSystem/J3DGraphAnimator/J3DCluster.h b/include/JSystem/J3DGraphAnimator/J3DCluster.h index 511c17eed..6081c0dbb 100644 --- a/include/JSystem/J3DGraphAnimator/J3DCluster.h +++ b/include/JSystem/J3DGraphAnimator/J3DCluster.h @@ -5,20 +5,77 @@ class J3DDeformer; -struct J3DCluster { +class J3DCluster { +public: + void operator=(const J3DCluster& other) { + field_0x0 = other.field_0x0; + field_0x4 = other.field_0x4; + field_0x8 = other.field_0x8; + field_0xc = other.field_0xc; + field_0x10 = other.field_0x10; + field_0x12 = other.field_0x12; + field_0x14 = other.field_0x14; + field_0x16 = other.field_0x16; + field_0x18 = other.field_0x18; + field_0x1c = other.field_0x1c; + mDeformer = other.mDeformer; + } + + J3DDeformer* getDeformer() { return mDeformer; } + void setDeformer(J3DDeformer* deformer) { mDeformer = deformer; } + +private: + friend class J3DClusterLoader; + friend class J3DClusterLoader_v15; + /* 0x00 */ f32 field_0x0; /* 0x04 */ f32 field_0x4; - /* 0x08 */ int field_0x8; - /* 0x0C */ int field_0xc; + /* 0x08 */ void* field_0x8; + /* 0x0C */ u8 field_0xc; + /* 0x0D */ u8 field_0xd[0x10 - 0x0D]; /* 0x10 */ u16 field_0x10; /* 0x12 */ u16 field_0x12; /* 0x14 */ u16 field_0x14; /* 0x16 */ u16 field_0x16; - /* 0x18 */ u16 field_0x18[2]; - /* 0x1C */ int field_0x1c; + /* 0x18 */ void* field_0x18; + /* 0x1C */ void* field_0x1c; /* 0x20 */ J3DDeformer* mDeformer; -}; +}; // Size: 0x24 -struct J3DClusterKey {}; +class J3DClusterKey { +public: + void operator=(const J3DClusterKey& other) { + field_0x0 = other.field_0x0; + field_0x2 = other.field_0x2; + field_0x4 = other.field_0x4; + field_0x8 = other.field_0x8; + } + +private: + friend class J3DClusterLoader; + friend class J3DClusterLoader_v15; + + /* 0x00 */ u16 field_0x0; + /* 0x02 */ u16 field_0x2; + /* 0x04 */ void* field_0x4; + /* 0x08 */ void* field_0x8; +}; // Size: 0x0C + +class J3DClusterVertex { +public: + void operator=(const J3DClusterVertex& other) { + field_0x0 = other.field_0x0; + field_0x4 = other.field_0x4; + field_0x8 = other.field_0x8; + } + +private: + friend class J3DClusterLoader; + friend class J3DClusterLoader_v15; + + /* 0x00 */ u16 field_0x0; + /* 0x04 */ u16* field_0x4; + /* 0x08 */ u16* field_0x8; +}; // Size: 0x0C #endif /* J3DCLUSTER_H */ diff --git a/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h b/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h index 4b486c746..dd0f78d7f 100644 --- a/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h +++ b/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h @@ -7,9 +7,10 @@ #include "global.h" class J3DModelData; -class J3DVertexBuffer; class J3DModel; +class J3DVertexBuffer; class J3DAnmCluster; +class JUTNameTab; class J3DDeformData { public: @@ -19,34 +20,31 @@ public: void deform(J3DModel*); void setAnm(J3DAnmCluster*); + u16 getClusterNum() const { return mClusterNum; } + u16 getClusterKeyNum() const { return mClusterKeyNum; } + J3DCluster* getClusterPointer(u16 i) { return &mClusterPointer[i]; } + J3DClusterKey* getClusterKeyPointer(u16 i) { return &mClusterKeyPointer[i]; } + f32* getVtxPos() { return mVtxPos; } + f32* getVtxNrm() { return mVtxNrm; } + private: + friend class J3DClusterLoader; + friend class J3DClusterLoader_v15; + /* 0x00 */ u16 mClusterNum; /* 0x02 */ u16 mClusterKeyNum; /* 0x04 */ u16 field_0x4; - /* 0x08 */ J3DCluster** mClusterPointer; - /* 0x0C */ J3DClusterKey** mClusterKeyPointer; - /* 0x10 */ int field_0x10; + /* 0x08 */ J3DCluster* mClusterPointer; + /* 0x0C */ J3DClusterKey* mClusterKeyPointer; + /* 0x10 */ J3DClusterVertex* field_0x10; /* 0x14 */ u16 field_0x14; /* 0x16 */ u16 field_0x16; - /* 0x18 */ void* mVtxPos; - /* 0x1C */ void* mVtxNrm; - /* 0x20 */ int field_0x20; - /* 0x24 */ int field_0x24; + /* 0x18 */ f32* mVtxPos; + /* 0x1C */ f32* mVtxNrm; + /* 0x20 */ JUTNameTab* field_0x20; + /* 0x24 */ JUTNameTab* field_0x24; }; // Size: 0x28 -struct J3DSkinNList { - J3DSkinNList(); - void calcSkin_VtxPosF32(f32 (*)[4], void*, void*); - void calcSkin_VtxNrmF32(f32 (*)[4], void*, void*); - - /* 0x00 */ u16* field_0x0; - /* 0x04 */ u16* field_0x4; - /* 0x08 */ f32* field_0x8; - /* 0x0C */ f32* field_0xc; - /* 0x10 */ u16 field_0x10; - /* 0x12 */ u16 field_0x12; -}; // Size: 0x14 - class J3DSkinDeform { public: J3DSkinDeform(); @@ -84,7 +82,10 @@ STATIC_ASSERT(sizeof(J3DSkinDeform) == 0x18); class J3DDeformer { public: - J3DDeformer(J3DDeformData*); + J3DDeformer(J3DDeformData* data) { + clear(); + mDeformData = data; + } void clear(); void deform(J3DVertexBuffer*, u16, f32*); void deform(J3DVertexBuffer*, u16); @@ -93,23 +94,17 @@ public: void normalize(f32*); void normalizeWeight(int, f32*); + void checkFlag(u32) {} + private: + friend class J3DClusterLoader; + friend class J3DClusterLoader_v15; + /* 0x00 */ J3DDeformData* mDeformData; /* 0x04 */ J3DAnmCluster* mAnmCluster; - /* 0x08 */ int field_0x8; - /* 0x0C */ int field_0xc; + /* 0x08 */ void* field_0x8; + /* 0x0C */ void* field_0xc; /* 0x10 */ u32 mFlags; }; // Size: 0x14 -inline void J3DFillZero32B(register void* param_0, register u32 param_1) { - asm { - srwi param_1, param_1, 5 - mtctr param_1 - lbl_8032D948: - dcbz 0, param_0 - addi param_0, param_0, 0x20 - bdnz lbl_8032D948 - } -} - #endif /* J3DSKINDEFORM_H */ diff --git a/include/JSystem/J3DGraphLoader/J3DClusterLoader.h b/include/JSystem/J3DGraphLoader/J3DClusterLoader.h index ef81cf3d5..561e04dcc 100644 --- a/include/JSystem/J3DGraphLoader/J3DClusterLoader.h +++ b/include/JSystem/J3DGraphLoader/J3DClusterLoader.h @@ -1,7 +1,48 @@ #ifndef J3DCLUSTERLOADER_H #define J3DCLUSTERLOADER_H -class J3DClusterBlock; +#include "global.h" + +class J3DDeformData; + +// TODO: move these into a new header +struct JSystemBlockHeader { // actual name unknown + /* 0x0 */ u32 mType; + /* 0x4 */ u32 mNextOffset; + + const JSystemBlockHeader* getNext() const { + return reinterpret_cast(reinterpret_cast(this) + mNextOffset); + } +}; // Size = 0x8 + +struct JSystemFileHeader { // actual name unknown + /* 0x00 */ u32 mMagic; + /* 0x04 */ u32 mType; + /* 0x08 */ u32 mFileSize; + /* 0x0C */ u32 mBlockNum; + /* 0x10 */ u8 _10[0x20 - 0x10]; + /* 0x20 */ JSystemBlockHeader mFirst; +}; + +class J3DClusterBlock : public JSystemBlockHeader { +private: + friend class J3DClusterLoader; + friend class J3DClusterLoader_v15; + + /* 0x08 */ u16 m08; + /* 0x0A */ u16 m0A; + /* 0x0C */ u16 m0C; + /* 0x0E */ u16 m0E; + /* 0x10 */ u16 m10; + /* 0x12 */ u16 m12; + /* 0x14 */ const void* m14; + /* 0x18 */ const void* m18; + /* 0x1C */ const void* m1C; + /* 0x20 */ const void* m20; + /* 0x24 */ const void* m24; + /* 0x28 */ const void* m28; + /* 0x2C */ const void* m2C; +}; struct J3DClusterLoaderDataBase { static void* load(const void*); @@ -19,6 +60,9 @@ public: ~J3DClusterLoader_v15(); void* load(const void*); void readCluster(const J3DClusterBlock*); + +private: + /* 0x04 */ J3DDeformData* mpDeformData; }; #endif /* J3DCLUSTERLOADER_H */ diff --git a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp index 89533c3e0..3d7adadcc 100644 --- a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp @@ -13,8 +13,8 @@ void J3DDeformData::clear() { mClusterPointer = NULL; mClusterKeyNum = 0; mClusterKeyPointer = NULL; - field_0x20 = 0; - field_0x24 = 0; + field_0x20 = NULL; + field_0x24 = NULL; } /* 802F37E4-802F3814 .text __ct__13J3DDeformDataFv */ @@ -36,8 +36,8 @@ void J3DDeformData::deform(J3DVertexBuffer*) { void J3DDeformer::clear() { mDeformData = NULL; mAnmCluster = NULL; - field_0x8 = 0; - field_0xc = 0; + field_0x8 = NULL; + field_0xc = NULL; mFlags = 3; } diff --git a/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp b/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp index 85f9c06bb..61d3a11a1 100644 --- a/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp +++ b/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp @@ -4,28 +4,114 @@ // #include "JSystem/J3DGraphLoader/J3DClusterLoader.h" +#include "JSystem/J3DGraphAnimator/J3DSkinDeform.h" +#include "m_Do/m_Do_printf.h" +#include "JSystem/JSupport/JSupport.h" +#include "JSystem/JUtility/JUTNameTab.h" /* 802FB04C-802FB0E8 .text load__24J3DClusterLoaderDataBaseFPCv */ -void* J3DClusterLoaderDataBase::load(const void*) { - /* Nonmatching */ +void* J3DClusterLoaderDataBase::load(const void* i_data) { + const JSystemFileHeader* fileHeader = (JSystemFileHeader*)i_data; + if (fileHeader->mMagic == 'J3D1' && fileHeader->mType == 'bls1') { + J3DClusterLoader_v15 loader; + return loader.load(i_data); + } else if (fileHeader->mMagic == 'J3D2' && fileHeader->mType == 'bls2') { + return NULL; + } + return NULL; } /* 802FB0E8-802FB104 .text __ct__20J3DClusterLoader_v15Fv */ -J3DClusterLoader_v15::J3DClusterLoader_v15() { - /* Nonmatching */ -} +J3DClusterLoader_v15::J3DClusterLoader_v15() {} /* 802FB104-802FB160 .text __dt__20J3DClusterLoader_v15Fv */ -J3DClusterLoader_v15::~J3DClusterLoader_v15() { - /* Nonmatching */ -} +J3DClusterLoader_v15::~J3DClusterLoader_v15() {} /* 802FB160-802FB21C .text load__20J3DClusterLoader_v15FPCv */ -void* J3DClusterLoader_v15::load(const void*) { - /* Nonmatching */ +void* J3DClusterLoader_v15::load(const void* i_data) { + const JSystemFileHeader* fileHeader = (JSystemFileHeader*)i_data; + mpDeformData = new J3DDeformData(); + mpDeformData->clear(); + const JSystemBlockHeader* block = &fileHeader->mFirst; + for (int i = 0; i < fileHeader->mBlockNum; i++) { + switch (block->mType) { + case 'CLS1': + readCluster((J3DClusterBlock*)block); + break; + default: + OSReport("Unknown data block\n"); + break; + } + block = block->getNext(); + } + return mpDeformData; } /* 802FB21C-802FB698 .text readCluster__20J3DClusterLoader_v15FPC15J3DClusterBlock */ -void J3DClusterLoader_v15::readCluster(const J3DClusterBlock*) { - /* Nonmatching */ +void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) { + mpDeformData->mClusterNum = block->m08; + mpDeformData->mClusterKeyNum = block->m0A; + mpDeformData->field_0x14 = block->m0E; + mpDeformData->field_0x16 = block->m10; + mpDeformData->field_0x4 = block->m0C; + if (block->m28 != NULL) { + mpDeformData->field_0x20 = new JUTNameTab(JSUConvertOffsetToPtr(block, block->m28)); + } else { + mpDeformData->field_0x20 = NULL; + } + if (block->m2C != NULL) { + mpDeformData->field_0x24 = new JUTNameTab(JSUConvertOffsetToPtr(block, block->m2C)); + } else { + mpDeformData->field_0x24 = NULL; + } + mpDeformData->mVtxPos = JSUConvertOffsetToPtr(block, block->m20); + mpDeformData->mVtxNrm = JSUConvertOffsetToPtr(block, block->m24); + + mpDeformData->mClusterPointer = new J3DCluster[mpDeformData->getClusterNum()]; + J3DCluster* blockCluster = JSUConvertOffsetToPtr(block, block->m14); + for (int i = 0; i < mpDeformData->getClusterNum(); i++) { + mpDeformData->mClusterPointer[i] = blockCluster[i]; + } + + mpDeformData->mClusterKeyPointer = new J3DClusterKey[mpDeformData->getClusterKeyNum()]; + J3DClusterKey* blockClusterKey = JSUConvertOffsetToPtr(block, block->m18); + for (int i = 0; i < mpDeformData->getClusterKeyNum(); i++) { + mpDeformData->mClusterKeyPointer[i] = blockClusterKey[i]; + } + + mpDeformData->field_0x10 = new J3DClusterVertex[mpDeformData->field_0x4]; + J3DClusterVertex* blockClusterVertex = JSUConvertOffsetToPtr(block, block->m1C); + for (int i = 0; i < mpDeformData->field_0x4; i++) { + mpDeformData->field_0x10[i] = blockClusterVertex[i]; + } + + for (int i = 0; i < mpDeformData->getClusterNum(); i++) { + J3DCluster* cluster = &mpDeformData->mClusterPointer[i]; + cluster->field_0x8 = JSUConvertOffsetToPtr(block, cluster->field_0x8); + cluster->field_0x18 = JSUConvertOffsetToPtr(block, cluster->field_0x18); + int r3 = (int)JSUConvertOffsetToPtr(block, cluster->field_0x1c); + int r31 = (int)blockClusterVertex; + cluster->field_0x1c = &mpDeformData->field_0x10[(r3 - r31)/0xC/0xCUL]; // fakematch, TODO + J3DDeformer* deformer = new J3DDeformer(mpDeformData); + if (cluster->field_0x14 != 0) { + deformer->field_0xc = new u32[cluster->field_0x14*3]; + } else { + deformer->field_0xc = NULL; + } + deformer->mFlags = cluster->field_0xc; + deformer->field_0x8 = new u32[cluster->field_0x10]; + cluster->setDeformer(deformer); + } + + for (int i = 0; i < mpDeformData->getClusterKeyNum(); i++) { + J3DClusterKey* clusterKey = &mpDeformData->mClusterKeyPointer[i]; + clusterKey->field_0x4 = JSUConvertOffsetToPtr(block, clusterKey->field_0x4); + clusterKey->field_0x8 = JSUConvertOffsetToPtr(block, clusterKey->field_0x8); + } + + for (int i = 0; i < mpDeformData->field_0x4; i++) { + J3DClusterVertex* clusterVertex = &mpDeformData->field_0x10[i]; + clusterVertex->field_0x4 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x4); + clusterVertex->field_0x8 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x8); + } }