summaryrefslogtreecommitdiff
path: root/src/JSystem/JParticle/JPAResourceLoader.cpp
diff options
context:
space:
mode:
authorCaroline Madsen <69010899+randomsalience@users.noreply.github.com>2024-11-03 13:39:41 -0500
committerGitHub <noreply@github.com>2024-11-03 20:39:41 +0200
commit63abf9f6d2d52ed9d1309473bf4dc1123ca1ce5b (patch)
tree873881597f156630960b2f3a959a8fade0e0e2e9 /src/JSystem/JParticle/JPAResourceLoader.cpp
parent499d4dfe745b9371f29649b3f2c461c350143e05 (diff)
JParticle mostly done (#2235)
Diffstat (limited to 'src/JSystem/JParticle/JPAResourceLoader.cpp')
-rw-r--r--src/JSystem/JParticle/JPAResourceLoader.cpp176
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;
+ }
+}