// // Generated By: dol2asm // Translation Unit: J3DModelLoaderCalcSize // #include "JSystem/J3DGraphLoader/J3DModelLoaderCalcSize.h" #include "JSystem/J3DGraphLoader/J3DModelLoader.h" #include "JSystem/J3DGraphLoader/J3DShapeFactory.h" #include "JSystem/J3DGraphLoader/J3DMaterialFactory.h" #include "JSystem/J3DGraphBase/J3DMaterial.h" #include "JSystem/J3DGraphAnimator/J3DModelData.h" #include "JSystem/JSupport/JSupport.h" #include "dolphin/os.h" #include "dol2asm.h" // // Forward References: // extern "C" void countMaterialNum__14J3DModelLoaderFPCv(); extern "C" void calcLoadSize__14J3DModelLoaderFPCvUl(); extern "C" void calcLoadMaterialTableSize__14J3DModelLoaderFPCv(); extern "C" void calcLoadBinaryDisplayListSize__14J3DModelLoaderFPCvUl(); extern "C" void calcSizeInformation__14J3DModelLoaderFPC17J3DModelInfoBlockUl(); extern "C" void calcSizeJoint__14J3DModelLoaderFPC13J3DJointBlock(); extern "C" void calcSizeEnvelope__14J3DModelLoaderFPC16J3DEnvelopeBlock(); extern "C" void calcSizeDraw__14J3DModelLoaderFPC12J3DDrawBlock(); extern "C" void calcSizeMaterial__18J3DModelLoader_v26FPC16J3DMaterialBlockUl(); extern "C" void calcSizeShape__14J3DModelLoaderFPC13J3DShapeBlockUl(); extern "C" void calcSizeTexture__14J3DModelLoaderFPC15J3DTextureBlock(); extern "C" void calcSizeMaterialTable__18J3DModelLoader_v26FPC16J3DMaterialBlockUl(); extern "C" void calcSizeTextureTable__14J3DModelLoaderFPC15J3DTextureBlock(); extern "C" void calcSizePatchedMaterial__14J3DModelLoaderFPC16J3DMaterialBlockUl(); extern "C" void calcSizeMaterialDL__14J3DModelLoaderFPC18J3DMaterialDLBlockUl(); extern "C" extern char const* const J3DModelLoaderCalcSize__stringBase0; // // External References: // extern "C" void __ct__18J3DMaterialFactoryFRC16J3DMaterialBlock(); extern "C" void __ct__18J3DMaterialFactoryFRC18J3DMaterialDLBlock(); extern "C" void countUniqueMaterials__18J3DMaterialFactoryFv(); extern "C" void calcSize__18J3DMaterialFactoryCFP11J3DMaterialQ218J3DMaterialFactory12MaterialTypeiUl(); extern "C" void func_8033674C(void* _this, void const*, void const*); extern "C" void __ct__15J3DShapeFactoryFRC13J3DShapeBlock(); extern "C" void calcSize__15J3DShapeFactoryFiUl(); extern "C" void calcSizeVcdVatCmdBuffer__15J3DShapeFactoryFUl(); extern "C" void _savegpr_22(); extern "C" void _savegpr_25(); extern "C" void _savegpr_27(); extern "C" void _savegpr_28(); extern "C" void _restgpr_22(); extern "C" void _restgpr_25(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); // // Declarations: // /* 80336794-803367D4 3310D4 0040+00 0/0 3/0 0/0 .text countMaterialNum__14J3DModelLoaderFPCv */ u16 J3DModelLoader::countMaterialNum(const void* stream) { const J3DModelFileData* header = (const J3DModelFileData*)stream; const J3DModelBlock* block = header->mBlocks; for (int i = 0; i < header->mBlockNum; block = (const J3DModelBlock*)((u8*)block + block->mBlockSize), i++) { if (block->mBlockType == 'MAT3') { return ((const J3DMaterialBlock*)block)->mMaterialNum; } } return 0; } /* ############################################################################################## */ /* 803A20E8-803A20E8 02E748 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_803A20E8 = "Unknown data block\n"; /* @stringBase0 padding */ SECTION_DEAD static char const* const pad_803A20FC = "\0\0\0"; #pragma pop /* 803367D4-803369A0 331114 01CC+00 0/0 3/0 0/0 .text calcLoadSize__14J3DModelLoaderFPCvUl */ // size load issue. #ifdef NONMATCHING u32 J3DModelLoader::calcLoadSize(void const* stream, u32 flags_) { int flags = flags_; const J3DModelFileData* header = static_cast(stream); size_t size; const J3DModelBlock* nextBlock = header->mBlocks; u32 i = 0; // TODO: What sizeof will get us a size of 0xE4? size = 0xE4; for (; i < header->mBlockNum; i++) { switch (nextBlock->mBlockType) { case 'INF1': size += calcSizeInformation((const J3DModelInfoBlock*)nextBlock, flags); break; case 'JNT1': size += calcSizeJoint((const J3DJointBlock*)nextBlock); break; case 'MAT2': break; case 'MAT3': size += calcSizeMaterial((const J3DMaterialBlock*)nextBlock, flags); break; case 'SHP1': size += calcSizeShape((const J3DShapeBlock*)nextBlock, flags); break; case 'TEX1': size += calcSizeTexture((const J3DTextureBlock*)nextBlock); break; case 'EVP1': size += calcSizeEnvelope((const J3DEnvelopeBlock*)nextBlock); break; case 'DRW1': size += calcSizeDraw((const J3DDrawBlock*)nextBlock); break; case 'VTX1': break; default: OSReport("Unknown data block\n"); break; } nextBlock = (const J3DModelBlock*)((u8*)nextBlock + nextBlock->mBlockSize); } return size; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm u32 J3DModelLoader::calcLoadSize(void const* param_0, u32 param_1) { nofralloc #include "asm/JSystem/J3DGraphLoader/J3DModelLoaderCalcSize/calcLoadSize__14J3DModelLoaderFPCvUl.s" } #pragma pop #endif /* 803369A0-80336A98 3312E0 00F8+00 0/0 3/0 0/0 .text * calcLoadMaterialTableSize__14J3DModelLoaderFPCv */ u32 J3DModelLoader::calcLoadMaterialTableSize(const void* stream) { size_t size; const J3DModelBlock* nextBlock; bool hasTextureTable; u32 i; const J3DModelFileData* header = reinterpret_cast(stream); nextBlock = header->mBlocks; hasTextureTable = false; i = 0; // TODO: What sizeof will get us a size of 0x20? Is this just the file header??? size = 0x20; for (; i < header->mBlockNum; i++) { switch (nextBlock->mBlockType) { case 'MAT2': break; case 'MAT3': size += calcSizeMaterialTable((const J3DMaterialBlock*)nextBlock, J3DMLF_21 | J3DMLF_Material_UseIndirect | J3DMLF_Material_PE_Full | J3DMLF_Material_Color_LightOn); break; case 'TEX1': size += calcSizeTextureTable((const J3DTextureBlock*)nextBlock); hasTextureTable = true; break; default: OSReport("Unknown data block\n"); break; } nextBlock = (const J3DModelBlock*)((u8*)nextBlock + nextBlock->mBlockSize); } if (!hasTextureTable) { size += 12; } return size; } /* 80336A98-80336CD8 3313D8 0240+00 0/0 3/0 0/0 .text * calcLoadBinaryDisplayListSize__14J3DModelLoaderFPCvUl */ // flags issue #ifdef NONMATCHING u32 J3DModelLoader::calcLoadBinaryDisplayListSize(const void* stream, u32 flags) { const J3DModelFileData* header = (const J3DModelFileData*)stream; const J3DModelBlock* nextBlock = header->mBlocks; u32 i = 0; u32 matFlags = flags & (J3DMLF_Material_UseIndirect | J3DMLF_26); int size = sizeof(J3DModelData); for (; i < header->mBlockNum; i++) { switch (nextBlock->mBlockType) { case 'INF1': size += calcSizeInformation((const J3DModelInfoBlock*)nextBlock, flags); break; case 'JNT1': size += calcSizeJoint((const J3DJointBlock*)nextBlock); break; case 'SHP1': size += calcSizeShape((const J3DShapeBlock*)nextBlock, flags); break; case 'TEX1': size += calcSizeTexture((const J3DTextureBlock*)nextBlock); break; case 'MDL3': size += calcSizeMaterialDL((const J3DMaterialDLBlock*)nextBlock, flags); break; case 'MAT2': break; case 'MAT3': u32 flags2 = (J3DMLF_21 | J3DMLF_Material_PE_Full | J3DMLF_Material_Color_LightOn); flags2 |= matFlags; mpMaterialBlock = (const J3DMaterialBlock*)nextBlock; if ((flags & (J3DMLF_13 | J3DMLF_DoBdlMaterialCalc)) == 0) { field_0x18 = 1; size += calcSizeMaterial((const J3DMaterialBlock*)nextBlock, flags2); } else if ((flags & (J3DMLF_13 | J3DMLF_DoBdlMaterialCalc)) == J3DMLF_DoBdlMaterialCalc) { field_0x18 = 1; size += calcSizePatchedMaterial((const J3DMaterialBlock*)nextBlock, matFlags); } break; case 'EVP1': size += calcSizeEnvelope((const J3DEnvelopeBlock*)nextBlock); break; case 'DRW1': size += calcSizeDraw((const J3DDrawBlock*)nextBlock); break; case 'VTX1': break; default: OSReport("Unknown data block\n"); break; } nextBlock = (const J3DModelBlock*)((u8*)nextBlock + nextBlock->mBlockSize); } return size; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm u32 J3DModelLoader::calcLoadBinaryDisplayListSize(void const* param_0, u32 param_1) { nofralloc #include "asm/JSystem/J3DGraphLoader/J3DModelLoaderCalcSize/calcLoadBinaryDisplayListSize__14J3DModelLoaderFPCvUl.s" } #pragma pop #endif /* 80336CD8-80336D64 331618 008C+00 2/2 0/0 0/0 .text * calcSizeInformation__14J3DModelLoaderFPC17J3DModelInfoBlockUl */ // Matches with JSUConvertOffsetToPtr #ifdef NONMATCHING u32 J3DModelLoader::calcSizeInformation(const J3DModelInfoBlock* block, u32 flags) { int size = 0; switch ((flags | block->mFlags) & J3DMLF_MtxTypeMask) { case J3DMLF_None: // Basic size = 4; break; case J3DMLF_MtxSoftImageCalc: size = 4; break; case J3DMLF_MtxMayaCalc: size = 4; break; default: break; } mpModelHierarchy = JSUConvertOffsetToPtr(block, block->mpHierarchy); return size; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm u32 J3DModelLoader::calcSizeInformation(J3DModelInfoBlock const* param_0, u32 param_1) { nofralloc #include "asm/JSystem/J3DGraphLoader/J3DModelLoaderCalcSize/calcSizeInformation__14J3DModelLoaderFPC17J3DModelInfoBlockUl.s" } #pragma pop #endif /* 80336D64-80336D90 3316A4 002C+00 2/2 0/0 0/0 .text * calcSizeJoint__14J3DModelLoaderFPC13J3DJointBlock */ u32 J3DModelLoader::calcSizeJoint(const J3DJointBlock* block) { int size = 0; if (block->mpNameTable) { size = 0x10; } size += (block->mJointNum * sizeof(J3DJoint*)); size += (block->mJointNum * sizeof(J3DJoint)); return size; } /* 80336D90-80336DA0 3316D0 0010+00 2/2 0/0 0/0 .text * calcSizeEnvelope__14J3DModelLoaderFPC16J3DEnvelopeBlock */ u32 J3DModelLoader::calcSizeEnvelope(const J3DEnvelopeBlock* block) { mEnvelopeSize = block->mWEvlpMtxNum; return 0; } /* 80336DA0-80336DB4 3316E0 0014+00 2/2 0/0 0/0 .text * calcSizeDraw__14J3DModelLoaderFPC12J3DDrawBlock */ u32 J3DModelLoader::calcSizeDraw(const J3DDrawBlock* block) { return (block->mMtxNum - mEnvelopeSize) * 2; } /* 80336DB4-80336EA0 3316F4 00EC+00 0/0 1/0 0/0 .text * calcSizeMaterial__18J3DModelLoader_v26FPC16J3DMaterialBlockUl */ u32 J3DModelLoader_v26::calcSizeMaterial(const J3DMaterialBlock* block, u32 flags) { int padding = 0; J3DMaterialFactory factory(*block); u32 count = block->mMaterialNum; int uniqueCount = factory.countUniqueMaterials(); if (block->mpNameTable != NULL) { padding = 0x10; } size_t size = padding + (count * sizeof(J3DMaterial*)); if ((flags & J3DMLF_UseUniqueMaterials) != 0) { // calc for allocated materials as well size += ALIGN_NEXT((u16)uniqueCount * sizeof(J3DMaterial), 0x20); } if ((flags & J3DMLF_UseUniqueMaterials) != 0) { for (u32 i = 0; i < uniqueCount; i++) { size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, flags); } } for (u32 i = 0; i < count; i++) { size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, flags); } return size; } /* 80336EA0-80336F44 3317E0 00A4+00 2/2 0/0 0/0 .text * calcSizeShape__14J3DModelLoaderFPC13J3DShapeBlockUl */ u32 J3DModelLoader::calcSizeShape(const J3DShapeBlock* block, u32 flags) { int size = 0; J3DShapeFactory factory(*block); int count = block->mShapeNum; if (block->mpNameTable) { size = 0x10; } size += count * sizeof(J3DShape*); size += factory.calcSizeVcdVatCmdBuffer(count); for (J3DModelHierarchy* hierarchy = mpModelHierarchy; hierarchy->mType != 0; hierarchy++) { if (hierarchy->mType == 0x12) { size += factory.calcSize(hierarchy->mValue, flags); } } return size; } /* 80336F44-80336F60 331884 001C+00 3/3 0/0 0/0 .text * calcSizeTexture__14J3DModelLoaderFPC15J3DTextureBlock */ u32 J3DModelLoader::calcSizeTexture(const J3DTextureBlock* block) { // TODO: use sizeofs here. int padding = 0; if (block->mpNameTable) { padding = 0x10; } return padding + 0xC; } /* 80336F60-80336FF0 3318A0 0090+00 0/0 1/0 0/0 .text * calcSizeMaterialTable__18J3DModelLoader_v26FPC16J3DMaterialBlockUl */ u32 J3DModelLoader_v26::calcSizeMaterialTable(const J3DMaterialBlock* block, u32 flags) { int size = 0; u32 count = block->mMaterialNum; J3DMaterialFactory factory(*block); if (block->mpNameTable) { size = 0x10; } size += (count * sizeof(J3DMaterial*)); for (u16 i = 0; i < count; i++) { size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, flags); } return size; } /* 80336FF0-80337010 331930 0020+00 1/1 0/0 0/0 .text * calcSizeTextureTable__14J3DModelLoaderFPC15J3DTextureBlock */ u32 J3DModelLoader::calcSizeTextureTable(const J3DTextureBlock* block) { return calcSizeTexture(block); } /* 80337010-803370A0 331950 0090+00 1/1 0/0 0/0 .text * calcSizePatchedMaterial__14J3DModelLoaderFPC16J3DMaterialBlockUl */ u32 J3DModelLoader::calcSizePatchedMaterial(const J3DMaterialBlock* block, u32 flags) { int padding = 0; u32 count = block->mMaterialNum; J3DMaterialFactory factory(*block); if (block->mpNameTable) { padding = 0x10; } u32 size = padding + (count * sizeof(J3DMaterial*)); for (u16 i = 0; i < count; i++) { size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_PATCHED, i, flags); } return size; } /* 803370A0-80337178 3319E0 00D8+00 1/1 0/0 0/0 .text * calcSizeMaterialDL__14J3DModelLoaderFPC18J3DMaterialDLBlockUl */ u32 J3DModelLoader::calcSizeMaterialDL(const J3DMaterialDLBlock* block, u32 flags_) { int flags = flags_; size_t size = 0; J3DMaterialFactory factory(*block); ; if (!field_0x18) { u32 count = block->mMaterialNum; if (block->mpNameTable) { size = 0x10; } size += count * sizeof(J3DLockedMaterial*); for (u16 i = 0; i < count; i++) { size += factory.calcSize(NULL, J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags); } } else { u32 count = block->mMaterialNum; for (u16 i = 0; i < count; i++) { size += factory.calcSize((J3DMaterial*)this, J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags); } } return size; } /* 803A20E8-803A20E8 02E748 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */