// // Generated by dtk // Translation Unit: JPAEmitterLoader.cpp // #include "JSystem/JSystem.h" // IWYU pragma: keep #include "JSystem/JParticle/JPAEmitterLoader.h" #include "JSystem/JParticle/JPAEmitter.h" #include "JSystem/JParticle/JPAResourceManager.h" #include "JSystem/JParticle/JPADynamicsBlock.h" #include "JSystem/JParticle/JPABaseShape.h" #include "JSystem/JParticle/JPAExtraShape.h" #include "JSystem/JParticle/JPASweepShape.h" #include "JSystem/JParticle/JPAExTexShape.h" #include "JSystem/JParticle/JPAKeyBlock.h" #include "JSystem/JParticle/JPAFieldBlock.h" #include "JSystem/JUtility/JUTAssert.h" #include "JSystem/JUtility/JUTDataHeader.h" #include "JSystem/JKernel/JKRHeap.h" static void dummy(u32 texNum) { JUT_WARN(0, "%s", "This is WRONG Version File\n"); JUT_WARN(0, "%s", "This is NO JPA File\n"); JPAEmitterData* pEmtrRes = NULL; JUT_ASSERT(0, pEmtrRes); JUT_ASSERT(0, pEmtrRes->pLinkInfoArray); JPADataBlockLinkInfo* pLinkInfo = NULL; JUT_ASSERT(0, pLinkInfo); JUT_ASSERT(0, pLinkInfo->keyBlocks || pLinkInfo->keyNum == 0); JUT_ASSERT(0, pLinkInfo->fldBlocks || pLinkInfo->fldNum == 0); JUT_ASSERT(0, pLinkInfo->texDataBase || texNum == 0); u32 fldCntr = 0; JUT_ASSERT(0, pLinkInfo->fldBlocks[fldCntr]); u32 keyCntr = 0; JUT_ASSERT(0, pLinkInfo->keyBlocks[keyCntr]); JUT_ASSERT(0, pLinkInfo->dynBlock); JUT_ASSERT(0, pLinkInfo->bspBlock); JUT_ASSERT(0, pLinkInfo->espBlock); JUT_ASSERT(0, pLinkInfo->sspBlock); JUT_ASSERT(0, pLinkInfo->etxBlock); } /* 802590B4-8025917C .text load__31JPAEmitterArchiveLoaderDataBaseFPCUcP7JKRHeapPP18JPAEmitterResourcePP18JPATextureResource */ void JPAEmitterArchiveLoaderDataBase::load(const u8* data, JKRHeap* heap, JPAEmitterResource** dstEmtrRes, JPATextureResource** dstTexRes) { u32 magic = ((const u32*)data)[0]; if (magic == 'JPAC') { u32 version = ((const u32*)data)[1]; if (version == '1-00') { JPAEmitterArchiveLoader_v10 loader; loader.pHeap = heap; loader.pData = data; loader.mpEmtrRes = NULL; loader.mpTexRes = NULL; loader.load(); *dstEmtrRes = loader.getEmitterResource(); *dstTexRes = loader.getTextureResource(); } else { JUT_WARN(201, "%s", "This is WRONG Version File\n"); } } else { JUT_WARN(202, "%s", "This is WRONG File\n"); } } struct JPAEmitterArchiveData_v10 { /* 0x00 */ u32 magic; /* 0x04 */ u32 size; /* 0x08 */ u16 emtrResNum; /* 0x0A */ u16 texResNum; }; struct JPAEmitterParticleHeader_v10 { /* 0x00 */ u32 magic; // 'JEFF' /* 0x04 */ u32 type; // 'jpa1' /* 0x08 */ u8 field_0x08[0x0C - 0x08]; /* 0x0C */ u32 blockNum; /* 0x10 */ u8 field_0x10[0x14 - 0x10]; /* 0x14 */ u8 keyNum; /* 0x15 */ u8 fldNum; /* 0x16 */ u8 textureNum; /* 0x18 */ u16 resID; }; struct JPAEmitterBlockHeader_v10 { /* 0x00 */ u32 magic; /* 0x04 */ u32 size; /* 0x08 */ u8 field_0x08[0x0C - 0x08]; /* 0x0C */ u8 blockData; }; /* 8025917C-8025991C .text load__27JPAEmitterArchiveLoader_v10Fv */ void JPAEmitterArchiveLoader_v10::load() { const JPAEmitterArchiveData_v10* header = (const JPAEmitterArchiveData_v10*)pData; mpEmtrRes = new(pHeap, 0) JPAEmitterResource(header->emtrResNum, pHeap); mpTexRes = new(pHeap, 0) JPATextureResource(header->texResNum, pHeap); u32 offs = 0x20; for (s32 i = 0; i < header->emtrResNum; i++) { const JPAEmitterParticleHeader_v10* ptcl = (const JPAEmitterParticleHeader_v10*)&pData[offs]; JPAEmitterData* pEmtrRes = new(pHeap, 0) JPAEmitterData(); JUT_ASSERT(234, pEmtrRes); JPADataBlockLinkInfo* pLinkInfo = new(pHeap, 0) JPADataBlockLinkInfo(); JUT_ASSERT(238, pLinkInfo); pEmtrRes->infoNum = 1; pEmtrRes->pLinkInfoArray = new(pHeap, 0) JPADataBlockLinkInfo*[pEmtrRes->infoNum]; JUT_ASSERT(243, pEmtrRes->pLinkInfoArray); pEmtrRes->pLinkInfoArray[0] = pLinkInfo; pLinkInfo->keyNum = ptcl->keyNum; pLinkInfo->keyBlocks = (JPAKeyBlock**) (pLinkInfo->keyNum != 0 ? new(pHeap, 0) JPAKeyBlockArc*[pLinkInfo->keyNum] : NULL); JUT_ASSERT(250, pLinkInfo->keyBlocks || pLinkInfo->keyNum == 0); pLinkInfo->fldNum = ptcl->fldNum; pLinkInfo->fldBlocks = (JPAFieldBlock**) (pLinkInfo->fldNum != 0 ? new(pHeap, 0) JPAFieldBlockArc*[pLinkInfo->fldNum] : NULL); JUT_ASSERT(256, pLinkInfo->fldBlocks || pLinkInfo->fldNum == 0); pLinkInfo->mTextureNum = ptcl->textureNum; pLinkInfo->texDataBase = NULL; u32 fld_cntr = 0; u32 key_cntr = 0; u32 j = 0; u32 blockOffs = offs + 0x20; for (; j < ptcl->blockNum; j++) { const JPAEmitterBlockHeader_v10* block = (const JPAEmitterBlockHeader_v10*)(pData + blockOffs); u32 size = block->size; switch (block->magic) { case 'FLD1': pLinkInfo->fldBlocks[fld_cntr] = (JPAFieldBlock*) new(pHeap, 0) JPAFieldBlockArc(pData + blockOffs); JUT_ASSERT(274, pLinkInfo->fldBlocks[fld_cntr]); fld_cntr++; break; case 'KFA1': pLinkInfo->keyBlocks[key_cntr] = (JPAKeyBlock*) new(pHeap, 0) JPAKeyBlockArc(pData + blockOffs); JUT_ASSERT(279, pLinkInfo->keyBlocks[key_cntr]); key_cntr++; break; case 'BEM1': pLinkInfo->dynBlock = (JPADynamicsBlock*) new(pHeap, 0) JPADynamicsBlockArc(pData + blockOffs); JUT_ASSERT(284, pLinkInfo->dynBlock); break; case 'BSP1': pLinkInfo->bspBlock = (JPABaseShape*) new(pHeap, 0) JPABaseShapeArc(pData + blockOffs, pHeap); JUT_ASSERT(288, pLinkInfo->bspBlock); break; case 'ESP1': pLinkInfo->espBlock = (JPAExtraShape*) new(pHeap, 0) JPAExtraShapeArc(pData + blockOffs); JUT_ASSERT(292, pLinkInfo->espBlock); break; case 'SSP1': pLinkInfo->sspBlock = (JPASweepShape*) new(pHeap, 0) JPASweepShapeArc(pData + blockOffs); JUT_ASSERT(296, pLinkInfo->sspBlock); break; case 'ETX1': pLinkInfo->etxBlock = (JPAExTexShape*) new(pHeap, 0) JPAExTexShapeArc(pData + blockOffs); JUT_ASSERT(300, pLinkInfo->etxBlock); break; case 'TDB1': pLinkInfo->texDataBase = (u16*)&block->blockData; break; } blockOffs += size; } getEmitterResource()->registration(pEmtrRes, ptcl->resID); offs = blockOffs; } for (s32 i = 0; i < header->texResNum; i++) { const JUTDataBlockHeader* tex1Block = (const JUTDataBlockHeader*)(pData + offs); u32 size = tex1Block->mSize; JPATexture* pTex = new(pHeap, 0) JPATextureArc(pData + offs); JUT_ASSERT(319, pTex); getTextureResource()->registration(pTex); offs += size; } }