Fix endianness & 64-bit in 3D asset loading code

Combination of plumbing BE(T) through everything, making BE<T> have template specializations, and inverting at load time where more practical.
This commit is contained in:
PJB3005
2026-02-25 20:20:45 +01:00
parent 975a15036e
commit 284e6c50b6
32 changed files with 830 additions and 553 deletions
+115 -105
View File
@@ -4,17 +4,25 @@
#include "JSystem/J3DGraphBase/J3DSys.h"
#include <dolphin/mtx.h>
#include "dusk/endian.h"
class J3DModelData;
class J3DMaterialTable;
class J3DModelHierarchy;
#if TARGET_PC
#define OFFSET_PTR BE(u32)
#else
#define OFFSET_PTR void*
#endif
/**
* @ingroup jsystem-j3d
*
*/
struct J3DModelBlock {
/* 0x00 */ u32 mBlockType;
/* 0x04 */ u32 mBlockSize;
/* 0x00 */ BE(u32) mBlockType;
/* 0x04 */ BE(u32) mBlockSize;
};
/**
@@ -22,10 +30,10 @@ struct J3DModelBlock {
*
*/
struct J3DModelFileData {
/* 0x00 */ u32 mMagic1;
/* 0x04 */ u32 mMagic2;
/* 0x00 */ BE(u32) mMagic1;
/* 0x04 */ BE(u32) mMagic2;
/* 0x08 */ u8 field_0x08[4];
/* 0x0C */ u32 mBlockNum;
/* 0x0C */ BE(u32) mBlockNum;
/* 0x10 */ u8 field_0x10[0x10];
/* 0x20 */ J3DModelBlock mBlocks[1];
};
@@ -35,10 +43,10 @@ struct J3DModelFileData {
*
*/
struct J3DModelInfoBlock : public J3DModelBlock {
/* 0x08 */ u16 mFlags;
/* 0x0C */ u32 mPacketNum;
/* 0x10 */ u32 mVtxNum;
/* 0x14 */ void* mpHierarchy;
/* 0x08 */ BE(u16) mFlags;
/* 0x0C */ BE(u32) mPacketNum;
/* 0x10 */ BE(u32) mVtxNum;
/* 0x14 */ OFFSET_PTR mpHierarchy;
}; // size 0x18
/**
@@ -46,12 +54,12 @@ struct J3DModelInfoBlock : public J3DModelBlock {
*
*/
struct J3DVertexBlock : public J3DModelBlock {
/* 0x08 */ void* mpVtxAttrFmtList;
/* 0x0C */ void* mpVtxPosArray;
/* 0x10 */ void* mpVtxNrmArray;
/* 0x14 */ void* mpVtxNBTArray;
/* 0x18 */ void* mpVtxColorArray[2];
/* 0x20 */ void* mpVtxTexCoordArray[8];
/* 0x08 */ OFFSET_PTR mpVtxAttrFmtList;
/* 0x0C */ OFFSET_PTR mpVtxPosArray;
/* 0x10 */ OFFSET_PTR mpVtxNrmArray;
/* 0x14 */ OFFSET_PTR mpVtxNBTArray;
/* 0x18 */ OFFSET_PTR mpVtxColorArray[2];
/* 0x20 */ OFFSET_PTR mpVtxTexCoordArray[8];
}; // size 0x40
/**
@@ -59,11 +67,11 @@ struct J3DVertexBlock : public J3DModelBlock {
*
*/
struct J3DEnvelopeBlock : public J3DModelBlock {
/* 0x08 */ u16 mWEvlpMtxNum;
/* 0x0C */ void* mpWEvlpMixMtxNum;
/* 0x10 */ void* mpWEvlpMixIndex;
/* 0x14 */ void* mpWEvlpMixWeight;
/* 0x18 */ void* mpInvJointMtx;
/* 0x08 */ BE(u16) mWEvlpMtxNum;
/* 0x0C */ OFFSET_PTR mpWEvlpMixMtxNum;
/* 0x10 */ OFFSET_PTR mpWEvlpMixIndex;
/* 0x14 */ OFFSET_PTR mpWEvlpMixWeight;
/* 0x18 */ OFFSET_PTR mpInvJointMtx;
}; // size 0x1C
/**
@@ -71,9 +79,9 @@ struct J3DEnvelopeBlock : public J3DModelBlock {
*
*/
struct J3DDrawBlock : public J3DModelBlock {
/* 0x08 */ u16 mMtxNum;
/* 0x0C */ void* mpDrawMtxFlag;
/* 0x10 */ void* mpDrawMtxIndex;
/* 0x08 */ BE(u16) mMtxNum;
/* 0x0C */ OFFSET_PTR mpDrawMtxFlag;
/* 0x10 */ OFFSET_PTR mpDrawMtxIndex;
}; // size 0x14
/**
@@ -81,10 +89,10 @@ struct J3DDrawBlock : public J3DModelBlock {
*
*/
struct J3DJointBlock : public J3DModelBlock {
/* 0x08 */ u16 mJointNum;
/* 0x0C */ void* mpJointInitData;
/* 0x10 */ void* mpIndexTable;
/* 0x14 */ void* mpNameTable;
/* 0x08 */ BE(u16) mJointNum;
/* 0x0C */ OFFSET_PTR mpJointInitData;
/* 0x10 */ OFFSET_PTR mpIndexTable;
/* 0x14 */ OFFSET_PTR mpNameTable;
}; // size 0x18
/**
@@ -92,37 +100,37 @@ struct J3DJointBlock : public J3DModelBlock {
*
*/
struct J3DMaterialBlock : public J3DModelBlock {
/* 0x08 */ u16 mMaterialNum;
/* 0x0C */ void* mpMaterialInitData;
/* 0x10 */ void* mpMaterialID;
/* 0x14 */ void* mpNameTable;
/* 0x18 */ void* mpIndInitData;
/* 0x1C */ void* mpCullMode;
/* 0x20 */ void* mpMatColor;
/* 0x24 */ void* mpColorChanNum;
/* 0x28 */ void* mpColorChanInfo;
/* 0x2C */ void* mpAmbColor;
/* 0x30 */ void* mpLightInfo;
/* 0x34 */ void* mpTexGenNum;
/* 0x38 */ void* mpTexCoordInfo;
/* 0x3C */ void* mpTexCoord2Info;
/* 0x40 */ void* mpTexMtxInfo;
/* 0x44 */ void* field_0x44;
/* 0x48 */ void* mpTexNo;
/* 0x4C */ void* mpTevOrderInfo;
/* 0x50 */ void* mpTevColor;
/* 0x54 */ void* mpTevKColor;
/* 0x58 */ void* mpTevStageNum;
/* 0x5C */ void* mpTevStageInfo;
/* 0x60 */ void* mpTevSwapModeInfo;
/* 0x64 */ void* mpTevSwapModeTableInfo;
/* 0x68 */ void* mpFogInfo;
/* 0x6C */ void* mpAlphaCompInfo;
/* 0x70 */ void* mpBlendInfo;
/* 0x74 */ void* mpZModeInfo;
/* 0x78 */ void* mpZCompLoc;
/* 0x7C */ void* mpDither;
/* 0x80 */ void* mpNBTScaleInfo;
/* 0x08 */ BE(u16) mMaterialNum;
/* 0x0C */ OFFSET_PTR mpMaterialInitData;
/* 0x10 */ OFFSET_PTR mpMaterialID;
/* 0x14 */ OFFSET_PTR mpNameTable;
/* 0x18 */ OFFSET_PTR mpIndInitData;
/* 0x1C */ OFFSET_PTR mpCullMode;
/* 0x20 */ OFFSET_PTR mpMatColor;
/* 0x24 */ OFFSET_PTR mpColorChanNum;
/* 0x28 */ OFFSET_PTR mpColorChanInfo;
/* 0x2C */ OFFSET_PTR mpAmbColor;
/* 0x30 */ OFFSET_PTR mpLightInfo;
/* 0x34 */ OFFSET_PTR mpTexGenNum;
/* 0x38 */ OFFSET_PTR mpTexCoordInfo;
/* 0x3C */ OFFSET_PTR mpTexCoord2Info;
/* 0x40 */ OFFSET_PTR mpTexMtxInfo;
/* 0x44 */ OFFSET_PTR field_0x44;
/* 0x48 */ OFFSET_PTR mpTexNo;
/* 0x4C */ OFFSET_PTR mpTevOrderInfo;
/* 0x50 */ OFFSET_PTR mpTevColor;
/* 0x54 */ OFFSET_PTR mpTevKColor;
/* 0x58 */ OFFSET_PTR mpTevStageNum;
/* 0x5C */ OFFSET_PTR mpTevStageInfo;
/* 0x60 */ OFFSET_PTR mpTevSwapModeInfo;
/* 0x64 */ OFFSET_PTR mpTevSwapModeTableInfo;
/* 0x68 */ OFFSET_PTR mpFogInfo;
/* 0x6C */ OFFSET_PTR mpAlphaCompInfo;
/* 0x70 */ OFFSET_PTR mpBlendInfo;
/* 0x74 */ OFFSET_PTR mpZModeInfo;
/* 0x78 */ OFFSET_PTR mpZCompLoc;
/* 0x7C */ OFFSET_PTR mpDither;
/* 0x80 */ OFFSET_PTR mpNBTScaleInfo;
};
/**
@@ -130,34 +138,34 @@ struct J3DMaterialBlock : public J3DModelBlock {
*
*/
struct J3DMaterialBlock_v21 : public J3DModelBlock {
/* 0x08 */ u16 mMaterialNum;
/* 0x0C */ void* mpMaterialInitData;
/* 0x10 */ void* mpMaterialID;
/* 0x14 */ void* mpNameTable;
/* 0x18 */ void* mpCullMode;
/* 0x1C */ void* mpMatColor;
/* 0x20 */ void* mpColorChanNum;
/* 0x24 */ void* mpColorChanInfo;
/* 0x28 */ void* mpTexGenNum;
/* 0x2C */ void* mpTexCoordInfo;
/* 0x30 */ void* mpTexCoord2Info;
/* 0x34 */ void* mpTexMtxInfo;
/* 0x38 */ void* field_0x38;
/* 0x3C */ void* mpTexNo;
/* 0x40 */ void* mpTevOrderInfo;
/* 0x44 */ void* mpTevColor;
/* 0x48 */ void* mpTevKColor;
/* 0x4C */ void* mpTevStageNum;
/* 0x50 */ void* mpTevStageInfo;
/* 0x54 */ void* mpTevSwapModeInfo;
/* 0x58 */ void* mpTevSwapModeTableInfo;
/* 0x5C */ void* mpFogInfo;
/* 0x60 */ void* mpAlphaCompInfo;
/* 0x64 */ void* mpBlendInfo;
/* 0x68 */ void* mpZModeInfo;
/* 0x6C */ void* mpZCompLoc;
/* 0x70 */ void* mpDither;
/* 0x74 */ void* mpNBTScaleInfo;
/* 0x08 */ BE(u16) mMaterialNum;
/* 0x0C */ OFFSET_PTR mpMaterialInitData;
/* 0x10 */ OFFSET_PTR mpMaterialID;
/* 0x14 */ OFFSET_PTR mpNameTable;
/* 0x18 */ OFFSET_PTR mpCullMode;
/* 0x1C */ OFFSET_PTR mpMatColor;
/* 0x20 */ OFFSET_PTR mpColorChanNum;
/* 0x24 */ OFFSET_PTR mpColorChanInfo;
/* 0x28 */ OFFSET_PTR mpTexGenNum;
/* 0x2C */ OFFSET_PTR mpTexCoordInfo;
/* 0x30 */ OFFSET_PTR mpTexCoord2Info;
/* 0x34 */ OFFSET_PTR mpTexMtxInfo;
/* 0x38 */ OFFSET_PTR field_0x38;
/* 0x3C */ OFFSET_PTR mpTexNo;
/* 0x40 */ OFFSET_PTR mpTevOrderInfo;
/* 0x44 */ OFFSET_PTR mpTevColor;
/* 0x48 */ OFFSET_PTR mpTevKColor;
/* 0x4C */ OFFSET_PTR mpTevStageNum;
/* 0x50 */ OFFSET_PTR mpTevStageInfo;
/* 0x54 */ OFFSET_PTR mpTevSwapModeInfo;
/* 0x58 */ OFFSET_PTR mpTevSwapModeTableInfo;
/* 0x5C */ OFFSET_PTR mpFogInfo;
/* 0x60 */ OFFSET_PTR mpAlphaCompInfo;
/* 0x64 */ OFFSET_PTR mpBlendInfo;
/* 0x68 */ OFFSET_PTR mpZModeInfo;
/* 0x6C */ OFFSET_PTR mpZCompLoc;
/* 0x70 */ OFFSET_PTR mpDither;
/* 0x74 */ OFFSET_PTR mpNBTScaleInfo;
};
/**
@@ -165,13 +173,13 @@ struct J3DMaterialBlock_v21 : public J3DModelBlock {
*
*/
struct J3DMaterialDLBlock : public J3DModelBlock {
/* 0x08 */ u16 mMaterialNum;
/* 0x0C */ void* mpDisplayListInit;
/* 0x10 */ void* mpPatchingInfo;
/* 0x14 */ void* mpCurrentMtxInfo;
/* 0x18 */ void* mpMaterialMode;
/* 0x1C */ void* field_0x1c;
/* 0x20 */ void* mpNameTable;
/* 0x08 */ BE(u16) mMaterialNum;
/* 0x0C */ OFFSET_PTR mpDisplayListInit;
/* 0x10 */ OFFSET_PTR mpPatchingInfo;
/* 0x14 */ OFFSET_PTR mpCurrentMtxInfo;
/* 0x18 */ OFFSET_PTR mpMaterialMode;
/* 0x1C */ OFFSET_PTR field_0x1c;
/* 0x20 */ OFFSET_PTR mpNameTable;
};
/**
@@ -179,15 +187,15 @@ struct J3DMaterialDLBlock : public J3DModelBlock {
*
*/
struct J3DShapeBlock : public J3DModelBlock {
/* 0x08 */ u16 mShapeNum;
/* 0x0C */ void* mpShapeInitData;
/* 0x10 */ void* mpIndexTable;
/* 0x14 */ void* mpNameTable;
/* 0x18 */ void* mpVtxDescList;
/* 0x1C */ void* mpMtxTable;
/* 0x20 */ void* mpDisplayListData;
/* 0x24 */ void* mpMtxInitData;
/* 0x28 */ void* mpDrawInitData;
/* 0x08 */ BE(u16) mShapeNum;
/* 0x0C */ OFFSET_PTR mpShapeInitData;
/* 0x10 */ OFFSET_PTR mpIndexTable;
/* 0x14 */ OFFSET_PTR mpNameTable;
/* 0x18 */ OFFSET_PTR mpVtxDescList;
/* 0x1C */ OFFSET_PTR mpMtxTable;
/* 0x20 */ OFFSET_PTR mpDisplayListData;
/* 0x24 */ OFFSET_PTR mpMtxInitData;
/* 0x28 */ OFFSET_PTR mpDrawInitData;
}; // size 0x2C
/**
@@ -195,9 +203,9 @@ struct J3DShapeBlock : public J3DModelBlock {
*
*/
struct J3DTextureBlock : public J3DModelBlock {
/* 0x08 */ u16 mTextureNum;
/* 0x0C */ void* mpTextureRes;
/* 0x10 */ void* mpNameTable;
/* 0x08 */ BE(u16) mTextureNum;
/* 0x0C */ OFFSET_PTR mpTextureRes;
/* 0x10 */ OFFSET_PTR mpNameTable;
};
enum J3DModelLoaderFlagTypes {
@@ -347,4 +355,6 @@ struct J3DMtxCalcJ3DSysInitSoftimage {
}
};
#undef OFFSET_PTR
#endif /* J3DMODELLOADER_H */