diff options
| author | Caroline Madsen <69010899+randomsalience@users.noreply.github.com> | 2024-11-03 13:39:41 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-03 20:39:41 +0200 |
| commit | 63abf9f6d2d52ed9d1309473bf4dc1123ca1ce5b (patch) | |
| tree | 873881597f156630960b2f3a959a8fade0e0e2e9 /src/JSystem/JParticle/JPAResourceLoader.cpp | |
| parent | 499d4dfe745b9371f29649b3f2c461c350143e05 (diff) | |
JParticle mostly done (#2235)
Diffstat (limited to 'src/JSystem/JParticle/JPAResourceLoader.cpp')
| -rw-r--r-- | src/JSystem/JParticle/JPAResourceLoader.cpp | 176 |
1 files changed, 93 insertions, 83 deletions
diff --git a/src/JSystem/JParticle/JPAResourceLoader.cpp b/src/JSystem/JParticle/JPAResourceLoader.cpp index 66f3cd6e58..580e913afe 100644 --- a/src/JSystem/JParticle/JPAResourceLoader.cpp +++ b/src/JSystem/JParticle/JPAResourceLoader.cpp @@ -4,93 +4,103 @@ // #include "JSystem/JParticle/JPAResourceLoader.h" -#include "dolphin/types.h" - -// -// Types: -// - -struct JPATexture { - /* 8027D7D4 */ JPATexture(u8 const*); -}; - -struct JKRHeap {}; - -struct JPAResource { - /* 80274010 */ JPAResource(); - /* 80274080 */ void init(JKRHeap*); -}; - -struct JPAResourceManager { - /* 80273F8C */ void registRes(JPAResource*); - /* 80273FAC */ void registTex(JPATexture*); -}; - -struct JPAResourceLoader { - /* 8027D8A0 */ JPAResourceLoader(u8 const*, JPAResourceManager*); - /* 8027D8E0 */ void load_jpc(u8 const*, JPAResourceManager*); -}; - -struct JPAKeyBlock { - /* 8027D730 */ JPAKeyBlock(u8 const*); -}; - -struct JPAFieldBlock { - /* 8027D088 */ JPAFieldBlock(u8 const*, JKRHeap*); -}; - -struct JPAExtraShape { - /* 8027AD88 */ JPAExtraShape(u8 const*); -}; - -struct JPADynamicsBlock { - /* 8027BB18 */ JPADynamicsBlock(u8 const*); -}; - -struct JPABaseShape { - /* 8027A6DC */ JPABaseShape(u8 const*, JKRHeap*); -}; - -// -// Forward References: -// - -extern "C" void __ct__17JPAResourceLoaderFPCUcP18JPAResourceManager(); -extern "C" void load_jpc__17JPAResourceLoaderFPCUcP18JPAResourceManager(); - -// -// External References: -// - -extern "C" void registRes__18JPAResourceManagerFP11JPAResource(); -extern "C" void registTex__18JPAResourceManagerFP10JPATexture(); -extern "C" void __ct__11JPAResourceFv(); -extern "C" void init__11JPAResourceFP7JKRHeap(); -extern "C" void __ct__12JPABaseShapeFPCUcP7JKRHeap(); -extern "C" void __ct__13JPAExtraShapeFPCUc(); -extern "C" void __ct__13JPAChildShapeFPCUc(); -extern "C" void __ct__13JPAExTexShapeFPCUc(); -extern "C" void __ct__16JPADynamicsBlockFPCUc(); -extern "C" void __ct__13JPAFieldBlockFPCUcP7JKRHeap(); -extern "C" void __ct__11JPAKeyBlockFPCUc(); -extern "C" void __ct__10JPATextureFPCUc(); -extern "C" void* __nw__FUlP7JKRHeapi(); -extern "C" void* __nwa__FUlP7JKRHeapi(); -extern "C" void _savegpr_18(); -extern "C" void _restgpr_18(); - -// -// Declarations: -// +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JParticle/JPABaseShape.h" +#include "JSystem/JParticle/JPAChildShape.h" +#include "JSystem/JParticle/JPADynamicsBlock.h" +#include "JSystem/JParticle/JPAExTexShape.h" +#include "JSystem/JParticle/JPAExtraShape.h" +#include "JSystem/JParticle/JPAFieldBlock.h" +#include "JSystem/JParticle/JPAKeyBlock.h" +#include "JSystem/JParticle/JPAResource.h" +#include "JSystem/JParticle/JPAResourceManager.h" /* 8027D8A0-8027D8E0 2781E0 0040+00 0/0 1/1 0/0 .text * __ct__17JPAResourceLoaderFPCUcP18JPAResourceManager */ -JPAResourceLoader::JPAResourceLoader(u8 const* param_0, JPAResourceManager* param_1) { - // NONMATCHING +JPAResourceLoader::JPAResourceLoader(u8 const* data, JPAResourceManager* mgr) { + if (*(u32*)(data + 4) == '2-10') { + load_jpc(data, mgr); + } } +struct JPAResourceHeader { + /* 0x0 */ u16 mUsrIdx; + /* 0x2 */ u16 mBlockNum; + /* 0x4 */ u8 mFieldBlockNum; + /* 0x5 */ u8 mKeyBlockNum; + /* 0x6 */ u8 mTDB1Num; +}; + /* 8027D8E0-8027DCA0 278220 03C0+00 1/1 0/0 0/0 .text * load_jpc__17JPAResourceLoaderFPCUcP18JPAResourceManager */ -void JPAResourceLoader::load_jpc(u8 const* param_0, JPAResourceManager* param_1) { - // NONMATCHING -}
\ No newline at end of file +void JPAResourceLoader::load_jpc(u8 const* data, JPAResourceManager* mgr) { + JKRHeap* heap = mgr->mpHeap; + mgr->mResMax = *(u16*)(data + 8); + mgr->mTexMax = *(u16*)(data + 0xA); + mgr->mpResArr = new (heap, 0) JPAResource*[mgr->mResMax]; + mgr->mpTexArr = new (heap, 0) JPATexture*[mgr->mTexMax]; + + u32 offset = 0x10; + for (int i = 0; i < *(u16*)(data + 8); i++) { + JPAResourceHeader* header = (JPAResourceHeader*)(data + offset); + JPAResource* res = new (heap, 0) JPAResource(); + res->mFieldBlockNum = header->mFieldBlockNum; + res->mpFieldBlocks = res->mFieldBlockNum != 0 ? + new (heap, 0) JPAFieldBlock*[res->mFieldBlockNum] : NULL; + res->mKeyBlockNum = header->mKeyBlockNum; + res->mpKeyBlocks = res->mKeyBlockNum != 0 ? + new (heap, 0) JPAKeyBlock*[res->mKeyBlockNum] : NULL; + res->mTDB1Num = header->mTDB1Num; + res->mpTDB1 = NULL; + res->mUsrIdx = header->mUsrIdx; + + offset += 8; + u32 field_idx = 0; + u32 key_idx = 0; + + for (int j = 0; j < header->mBlockNum; j++) { + u32 magic = *(u32*)(data + offset); + u32 size = *(u32*)(data + offset + 4); + switch (magic) { + case 'FLD1': + res->mpFieldBlocks[field_idx] = new (heap, 0) JPAFieldBlock(data + offset, heap); + field_idx++; + break; + case 'KFA1': + res->mpKeyBlocks[key_idx] = new (heap, 0) JPAKeyBlock(data + offset); + key_idx++; + break; + case 'BEM1': + res->mpDynamicsBlock = new (heap, 0) JPADynamicsBlock(data + offset); + break; + case 'BSP1': + res->mpBaseShape = new (heap, 0) JPABaseShape(data + offset, heap); + break; + case 'ESP1': + res->mpExtraShape = new (heap, 0) JPAExtraShape(data + offset); + break; + case 'SSP1': + res->mpChildShape = new (heap, 0) JPAChildShape(data + offset); + break; + case 'ETX1': + res->mpExTexShape = new (heap, 0) JPAExTexShape(data + offset); + break; + case 'TDB1': + res->mpTDB1 = (const u16*)(data + offset + 8); + break; + } + offset += size; + } + + res->init(heap); + mgr->registRes(res); + } + + offset = *(u32*)(data + 0xC); + for (int i = 0; i < *(u16*)(data + 0xA); i++) { + u32 size = *(u32*)(data + offset + 4); + JPATexture* tex = new (heap, 0) JPATexture(data + offset); + mgr->registTex(tex); + offset += size; + } +} |
