// // J3DClusterLoader // #include "JSystem/JSystem.h" // IWYU pragma: keep #include "JSystem/J3DGraphLoader/J3DClusterLoader.h" #include "JSystem/J3DGraphAnimator/J3DSkinDeform.h" #include "JSystem/JSupport/JSupport.h" #include "JSystem/JKernel/JKRHeap.h" #include #include void* J3DClusterLoaderDataBase::load(const void* i_data) { J3D_ASSERT_NULLPTR(41, i_data); const JUTDataFileHeader* fileHeader = (JUTDataFileHeader*)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; } J3DClusterLoader_v15::J3DClusterLoader_v15() {} J3DClusterLoader_v15::~J3DClusterLoader_v15() {} void* J3DClusterLoader_v15::load(const void* i_data) { J3D_ASSERT_NULLPTR(98, i_data); mpDeformData = JKR_NEW J3DDeformData(); const JUTDataFileHeader* fileHeader = (JUTDataFileHeader*)i_data; const JUTDataBlockHeader* block = &fileHeader->mFirstBlock; 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 = (JUTDataBlockHeader*)((u8*)block + block->mSize); } return mpDeformData; } void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) { J3D_ASSERT_NULLPTR(147, block); mpDeformData->mClusterNum = block->mClusterNum; mpDeformData->mClusterKeyNum = block->mClusterKeyNum; mpDeformData->mVtxPosNum = block->mVtxPosNum; mpDeformData->mVtxNrmNum = block->mVtxNrmNum; mpDeformData->mClusterVertexNum = block->mClusterVertexNum; if ((uintptr_t)block->mClusterName != (uintptr_t)NULL) { mpDeformData->mClusterName = JKR_NEW JUTNameTab(JSUConvertOffsetToPtr(block, block->mClusterName)); } else { mpDeformData->mClusterName = NULL; } if ((uintptr_t)block->mClusterKeyName != (uintptr_t)NULL) { mpDeformData->mClusterKeyName = JKR_NEW JUTNameTab(JSUConvertOffsetToPtr(block, block->mClusterKeyName)); } else { mpDeformData->mClusterKeyName = NULL; } mpDeformData->mVtxPos = JSUConvertOffsetToPtr(block, block->mVtxPos); mpDeformData->mVtxNrm = JSUConvertOffsetToPtr(block, block->mVtxNrm); intptr_t clusterPointer = (intptr_t) block->mClusterPointer; int clusterKeyPointerSize = (intptr_t)block->mClusterKeyPointer - (intptr_t)block->mClusterPointer; int clusterVertexPointerSize = (intptr_t)block->mClusterVertex - (intptr_t)block->mClusterPointer; int vtxPosSize = (intptr_t)block->mVtxPos - (intptr_t)block->mClusterPointer; u8* arr = JKR_NEW_ARRAY_ARGS(u8, vtxPosSize, 0x20); memcpy(arr, JSUConvertOffsetToPtr(block, block->mClusterPointer), vtxPosSize); mpDeformData->mClusterPointer = (J3DCluster*)arr; mpDeformData->mClusterKeyPointer = (J3DClusterKey*)&arr[clusterKeyPointerSize]; mpDeformData->mClusterVertex = (J3DClusterVertex*)&arr[clusterVertexPointerSize]; #if TARGET_PC mpDeformData->mDeformers = JKR_NEW_ARRAY(J3DDeformer*, mpDeformData->getClusterNum()); #endif for (int i = 0; i < mpDeformData->getClusterNum(); i++) { J3DCluster* cluster = &mpDeformData->mClusterPointer[i]; #if !TARGET_PC cluster->mClusterKey = JSUConvertOffsetToPtr(arr - (intptr_t)clusterPointer, cluster->mClusterKey); cluster->field_0x18 = JSUConvertOffsetToPtr(block, cluster->field_0x18); cluster->mClusterVertex = JSUConvertOffsetToPtr(arr - (intptr_t)clusterPointer, cluster->mClusterVertex); #endif J3DDeformer* deformer = JKR_NEW J3DDeformer(mpDeformData); if (cluster->field_0x14 != 0) { deformer->field_0xc = JKR_NEW_ARRAY(f32, cluster->field_0x14 * 3); } else { deformer->field_0xc = NULL; } deformer->mFlags = cluster->mFlags; deformer->field_0x8 = JKR_NEW_ARRAY(f32, cluster->mKeyNum); #if TARGET_PC deformer->mArrayBase = arr - clusterPointer; deformer->mBlockBase = block; mpDeformData->mDeformers[i] = deformer; #else cluster->setDeformer(deformer); #endif } #if !TARGET_PC 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->mClusterVertexNum; i++) { J3DClusterVertex* clusterVertex = &mpDeformData->mClusterVertex[i]; clusterVertex->field_0x4 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x4); clusterVertex->field_0x8 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x8); } #endif DCStoreRange(arr, vtxPosSize); }