From 9f22f27909501c47e414ecccd698b203cbd57629 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sun, 12 Apr 2026 20:14:24 -0700 Subject: [PATCH] fixes and cleanups for j3d material --- .../J3DGraphAnimator/J3DMaterialAttach.h | 2 +- .../JSystem/J3DGraphBase/J3DMaterial.h | 2 +- .../include/JSystem/J3DGraphBase/J3DPacket.h | 8 +-- .../J3DGraphAnimator/J3DMaterialAttach.cpp | 4 +- .../JSystem/src/J3DGraphAnimator/J3DModel.cpp | 2 +- libs/JSystem/src/J3DGraphBase/J3DMaterial.cpp | 14 ++--- libs/JSystem/src/J3DGraphBase/J3DPacket.cpp | 4 +- .../src/J3DGraphLoader/J3DModelLoader.cpp | 62 ++++++++++--------- src/d/d_drawlist.cpp | 17 ++++- 9 files changed, 66 insertions(+), 49 deletions(-) diff --git a/libs/JSystem/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h b/libs/JSystem/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h index 15128fab34..91461cdba3 100644 --- a/libs/JSystem/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h +++ b/libs/JSystem/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h @@ -53,7 +53,7 @@ private: /* 0x06 */ u16 mUniqueMatNum; /* 0x08 */ J3DMaterial** mMaterialNodePointer; /* 0x0C */ JUTNameTab* mMaterialName; - /* 0x10 */ J3DMaterial* field_0x10; + /* 0x10 */ J3DMaterial* mMaterial; /* 0x14 */ J3DTexture* mTexture; /* 0x18 */ JUTNameTab* mTextureName; /* 0x1C */ u16 field_0x1c; diff --git a/libs/JSystem/include/JSystem/J3DGraphBase/J3DMaterial.h b/libs/JSystem/include/JSystem/J3DGraphBase/J3DMaterial.h index 3083dd6480..829156ad1b 100644 --- a/libs/JSystem/include/JSystem/J3DGraphBase/J3DMaterial.h +++ b/libs/JSystem/include/JSystem/J3DGraphBase/J3DMaterial.h @@ -115,7 +115,7 @@ public: /* 0x14 */ u16 mIndex; /* 0x18 */ u32 mInvalid; /* 0x1C */ u32 field_0x1c; - /* 0x20 */ u32 mDiffFlag; + /* 0x20 */ u32 mMaterialID; /* 0x24 */ J3DColorBlock* mColorBlock; /* 0x28 */ J3DTexGenBlock* mTexGenBlock; /* 0x2C */ J3DTevBlock* mTevBlock; diff --git a/libs/JSystem/include/JSystem/J3DGraphBase/J3DPacket.h b/libs/JSystem/include/JSystem/J3DGraphBase/J3DPacket.h index 79e19651e4..4be9fe1f17 100644 --- a/libs/JSystem/include/JSystem/J3DGraphBase/J3DPacket.h +++ b/libs/JSystem/include/JSystem/J3DGraphBase/J3DPacket.h @@ -31,8 +31,6 @@ enum J3DDiffFlag { J3DDiffFlag_TevStageIndirect = 0x8000000, J3DDiffFlag_Fog = 0x10000000, J3DDiffFlag_Blend = 0x20000000, - J3DDiffFlag_Unk40000000 = 0x40000000, - J3DDiffFlag_Changed = 0x80000000, }; #define J3D_DIFF_LIGHTOBJNUM(n) ((n & 0xF) << 4) @@ -309,9 +307,9 @@ public: } void setInitShapePacket(J3DShapePacket* packet) { mpInitShapePacket = packet; } - void setMaterialID(u32 id) { mDiffFlag = id; } + void setMaterialID(u32 id) { mMaterialID = id; } void setMaterialAnmID(J3DMaterialAnm* materialAnm) { mpMaterialAnm = materialAnm; } - BOOL isChanged() { return mDiffFlag & J3DDiffFlag_Changed; } + BOOL isChanged() { return mMaterialID & 0x80000000; } bool isEnabled_Diff() { return mpInitShapePacket->getDisplayListObj() != NULL; } virtual ~J3DMatPacket(); @@ -322,7 +320,7 @@ public: /* 0x28 */ J3DShapePacket* mpInitShapePacket; /* 0x2C */ J3DShapePacket* mpShapePacket; /* 0x30 */ J3DMaterial* mpMaterial; - /* 0x34 */ u32 mDiffFlag; + /* 0x34 */ u32 mMaterialID; /* 0x38 */ J3DTexture* mpTexture; /* 0x3C */ J3DMaterialAnm* mpMaterialAnm; }; // Size: 0x40 diff --git a/libs/JSystem/src/J3DGraphAnimator/J3DMaterialAttach.cpp b/libs/JSystem/src/J3DGraphAnimator/J3DMaterialAttach.cpp index 6004d366e5..9a98c21357 100644 --- a/libs/JSystem/src/J3DGraphAnimator/J3DMaterialAttach.cpp +++ b/libs/JSystem/src/J3DGraphAnimator/J3DMaterialAttach.cpp @@ -11,7 +11,7 @@ void J3DMaterialTable::clear() { mUniqueMatNum = 0; mMaterialNodePointer = NULL; mMaterialName = NULL; - field_0x10 = 0; + mMaterial = NULL; mTexture = NULL; mTextureName = NULL; field_0x1c = 0; @@ -22,7 +22,7 @@ J3DMaterialTable::J3DMaterialTable() { mUniqueMatNum = 0; mMaterialNodePointer = NULL; mMaterialName = NULL; - field_0x10 = 0; + mMaterial = NULL; mTexture = NULL; mTextureName = NULL; field_0x1c = 0; diff --git a/libs/JSystem/src/J3DGraphAnimator/J3DModel.cpp b/libs/JSystem/src/J3DGraphAnimator/J3DModel.cpp index 6233d6dff7..f2bd737b4f 100644 --- a/libs/JSystem/src/J3DGraphAnimator/J3DModel.cpp +++ b/libs/JSystem/src/J3DGraphAnimator/J3DModel.cpp @@ -138,7 +138,7 @@ s32 J3DModel::createMatPacket(J3DModelData* pModelData, u32 mdlFlags) { matPacket->setInitShapePacket(shapePacket); matPacket->addShapePacket(shapePacket); matPacket->setTexture(pModelData->getTexture()); - matPacket->setMaterialID(materialNode->mDiffFlag); + matPacket->setMaterialID(materialNode->mMaterialID); if (pModelData->getModelDataType() == 1) { matPacket->lock(); diff --git a/libs/JSystem/src/J3DGraphBase/J3DMaterial.cpp b/libs/JSystem/src/J3DGraphBase/J3DMaterial.cpp index 6c39e96c9b..0c772305b2 100644 --- a/libs/JSystem/src/J3DGraphBase/J3DMaterial.cpp +++ b/libs/JSystem/src/J3DGraphBase/J3DMaterial.cpp @@ -176,7 +176,7 @@ void J3DMaterial::initialize() { mMaterialMode = 1; mIndex = -1; mInvalid = 0; - mDiffFlag = 0; + mMaterialID = 0; mColorBlock = NULL; mTexGenBlock = NULL; mTevBlock = NULL; @@ -207,7 +207,7 @@ void J3DMaterial::makeDisplayList_private(J3DDisplayListObj* pDLObj) { void J3DMaterial::makeDisplayList() { if (!j3dSys.getMatPacket()->isLocked()) { - j3dSys.getMatPacket()->mDiffFlag = mDiffFlag; + j3dSys.getMatPacket()->setMaterialID(mMaterialID); makeDisplayList_private(j3dSys.getMatPacket()->getDisplayListObj()); } } @@ -238,7 +238,7 @@ void J3DMaterial::loadSharedDL() { } void J3DMaterial::patch() { - j3dSys.getMatPacket()->mDiffFlag = mDiffFlag; + j3dSys.getMatPacket()->setMaterialID(mMaterialID); j3dSys.getMatPacket()->beginPatch(); mTevBlock->patch(); mColorBlock->patch(); @@ -323,8 +323,8 @@ void J3DMaterial::copy(J3DMaterial* pOther) { } void J3DMaterial::reset() { - if ((~mDiffFlag & J3DDiffFlag_Changed) == 0) { - mDiffFlag &= ~J3DDiffFlag_Changed; + if ((~mMaterialID & 0x80000000) == 0) { + mMaterialID &= ~0x80000000; mMaterialMode = mpOrigMaterial->mMaterialMode; mInvalid = mpOrigMaterial->mInvalid; mMaterialAnm = NULL; @@ -333,8 +333,8 @@ void J3DMaterial::reset() { } void J3DMaterial::change() { - if ((mDiffFlag & (J3DDiffFlag_Changed | J3DDiffFlag_Unk40000000)) == 0) { - mDiffFlag |= J3DDiffFlag_Changed; + if ((mMaterialID & 0xC0000000) == 0) { + mMaterialID |= 0x80000000; mMaterialAnm = NULL; } } diff --git a/libs/JSystem/src/J3DGraphBase/J3DPacket.cpp b/libs/JSystem/src/J3DGraphBase/J3DPacket.cpp index bf2348020a..9e28a7f7cb 100644 --- a/libs/JSystem/src/J3DGraphBase/J3DPacket.cpp +++ b/libs/JSystem/src/J3DGraphBase/J3DPacket.cpp @@ -178,7 +178,7 @@ J3DMatPacket::J3DMatPacket() { mpInitShapePacket = NULL; mpShapePacket = NULL; mpMaterial = NULL; - mDiffFlag = 0xFFFFFFFF; + mMaterialID = 0xFFFFFFFF; mpTexture = NULL; mpMaterialAnm = NULL; } @@ -204,7 +204,7 @@ void J3DMatPacket::endDiff() { bool J3DMatPacket::isSame(J3DMatPacket* pOther) const { J3D_ASSERT_NULLPTR(521, pOther != NULL); - return mDiffFlag == pOther->mDiffFlag && (mDiffFlag >> 31) == 0; + return mMaterialID == pOther->mMaterialID && (mMaterialID & 0x80000000) == 0; } void J3DMatPacket::draw() { diff --git a/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp b/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp index 3d064e33de..32f0e4eed9 100644 --- a/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp +++ b/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp @@ -618,6 +618,12 @@ void J3DModelLoader::readJoint(J3DJointBlock const* i_block) { } } +#if TARGET_PC +#define MATERIAL_ID(ptr, offset) (((uintptr_t((ptr)) >> 4) & 0x3FFFFFFF) + (offset)) +#else +#define MATERIAL_ID(ptr, offset) (((uintptr_t((ptr)) >> 4) + (offset))) +#endif + void J3DModelLoader_v26::readMaterial(J3DMaterialBlock const* i_block, u32 i_flags) { J3D_ASSERT_NULLPTR(817, i_block); J3DMaterialFactory factory(*i_block); @@ -633,16 +639,16 @@ void J3DModelLoader_v26::readMaterial(J3DMaterialBlock const* i_block, u32 i_fla mpMaterialTable->mMaterialNodePointer = JKR_NEW_ARRAY(J3DMaterial*, mpMaterialTable->mMaterialNum); J3D_ASSERT_ALLOCMEM(841, mpMaterialTable->mMaterialNodePointer); if (i_flags & 0x200000) { - mpMaterialTable->field_0x10 = JKR_NEW_ARRAY_ARGS(J3DMaterial, mpMaterialTable->mUniqueMatNum, 0x20); - J3D_ASSERT_ALLOCMEM(846, mpMaterialTable->field_0x10); + mpMaterialTable->mMaterial = JKR_NEW_ARRAY_ARGS(J3DMaterial, mpMaterialTable->mUniqueMatNum, 0x20); + J3D_ASSERT_ALLOCMEM(846, mpMaterialTable->mMaterial); } else { - mpMaterialTable->field_0x10 = NULL; + mpMaterialTable->mMaterial = NULL; } if (i_flags & 0x200000) { for (u16 i = 0; i < mpMaterialTable->mUniqueMatNum; i++) { - factory.create(&mpMaterialTable->field_0x10[i], + factory.create(&mpMaterialTable->mMaterial[i], J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, i_flags); - mpMaterialTable->field_0x10[i].mDiffFlag = (uintptr_t)&mpMaterialTable->field_0x10[i] >> 4; + mpMaterialTable->mMaterial[i].mMaterialID = MATERIAL_ID(&mpMaterialTable->mMaterial[i], 0); } } for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { @@ -651,15 +657,15 @@ void J3DModelLoader_v26::readMaterial(J3DMaterialBlock const* i_block, u32 i_fla } if (i_flags & 0x200000) { for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = - (uintptr_t)&mpMaterialTable->field_0x10[factory.getMaterialID(i)] >> 4; + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = + MATERIAL_ID(&mpMaterialTable->mMaterial[factory.getMaterialID(i)], 0); mpMaterialTable->mMaterialNodePointer[i]->mpOrigMaterial = - &mpMaterialTable->field_0x10[factory.getMaterialID(i)]; + &mpMaterialTable->mMaterial[factory.getMaterialID(i)]; } } else { for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = - ((uintptr_t)mpMaterialTable->mMaterialNodePointer >> 4) + factory.getMaterialID(i); + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = + MATERIAL_ID(mpMaterialTable->mMaterialNodePointer, factory.getMaterialID(i)); } } } @@ -679,15 +685,15 @@ void J3DModelLoader_v21::readMaterial_v21(J3DMaterialBlock_v21 const* i_block, u mpMaterialTable->mMaterialNodePointer = JKR_NEW_ARRAY(J3DMaterial*, mpMaterialTable->mMaterialNum); J3D_ASSERT_ALLOCMEM(940, mpMaterialTable->mMaterialNodePointer); if (i_flags & 0x200000) { - mpMaterialTable->field_0x10 = JKR_NEW_ARRAY_ARGS(J3DMaterial, mpMaterialTable->mUniqueMatNum, 0x20); - J3D_ASSERT_ALLOCMEM(945, mpMaterialTable->field_0x10); + mpMaterialTable->mMaterial = JKR_NEW_ARRAY_ARGS(J3DMaterial, mpMaterialTable->mUniqueMatNum, 0x20); + J3D_ASSERT_ALLOCMEM(945, mpMaterialTable->mMaterial); } else { - mpMaterialTable->field_0x10 = NULL; + mpMaterialTable->mMaterial = NULL; } if (i_flags & 0x200000) { for (u16 i = 0; i < mpMaterialTable->mUniqueMatNum; i++) { - factory.create(&mpMaterialTable->field_0x10[i], i, i_flags); - mpMaterialTable->field_0x10[i].mDiffFlag = (uintptr_t)&mpMaterialTable->field_0x10[i] >> 4; + factory.create(&mpMaterialTable->mMaterial[i], i, i_flags); + mpMaterialTable->mMaterial[i].mMaterialID = MATERIAL_ID(&mpMaterialTable->mMaterial[i], 0); } } for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { @@ -695,14 +701,14 @@ void J3DModelLoader_v21::readMaterial_v21(J3DMaterialBlock_v21 const* i_block, u } if (i_flags & 0x200000) { for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = - (uintptr_t)&mpMaterialTable->field_0x10[factory.getMaterialID(i)] >> 4; + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = + MATERIAL_ID(&mpMaterialTable->mMaterial[factory.getMaterialID(i)], 0); mpMaterialTable->mMaterialNodePointer[i]->mpOrigMaterial = - &mpMaterialTable->field_0x10[factory.getMaterialID(i)]; + &mpMaterialTable->mMaterial[factory.getMaterialID(i)]; } } else { for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = 0xc0000000; + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = 0xC0000000; } } } @@ -767,8 +773,8 @@ void J3DModelLoader_v26::readMaterialTable(J3DMaterialBlock const* i_block, u32 factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_NORMAL, i, i_flags); } for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = - (uintptr_t)mpMaterialTable->mMaterialNodePointer + factory.getMaterialID(i); + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = + MATERIAL_ID(mpMaterialTable->mMaterialNodePointer, factory.getMaterialID(i)); } } @@ -790,8 +796,8 @@ void J3DModelLoader_v21::readMaterialTable_v21(J3DMaterialBlock_v21 const* i_blo factory.create(NULL, i, i_flags); } for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = - ((uintptr_t)mpMaterialTable->mMaterialNodePointer >> 4) + factory.getMaterialID(i); + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = + MATERIAL_ID(mpMaterialTable->mMaterialNodePointer, factory.getMaterialID(i)); } } @@ -824,12 +830,12 @@ void J3DModelLoader::readPatchedMaterial(J3DMaterialBlock const* i_block, u32 i_ } mpMaterialTable->mMaterialNodePointer = JKR_NEW_ARRAY(J3DMaterial*, mpMaterialTable->mMaterialNum); J3D_ASSERT_ALLOCMEM(1260, mpMaterialTable->mMaterialNodePointer); - mpMaterialTable->field_0x10 = NULL; + mpMaterialTable->mMaterial = NULL; for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { mpMaterialTable->mMaterialNodePointer[i] = factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_PATCHED, i, i_flags); - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = - ((uintptr_t)mpMaterialTable->mMaterialNodePointer >> 4) + factory.getMaterialID(i); + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = + MATERIAL_ID(mpMaterialTable->mMaterialNodePointer, factory.getMaterialID(i)); } } @@ -850,14 +856,14 @@ void J3DModelLoader::readMaterialDL(J3DMaterialDLBlock const* i_block, u32 i_fla } mpMaterialTable->mMaterialNodePointer = JKR_NEW_ARRAY(J3DMaterial*, mpMaterialTable->mMaterialNum); J3D_ASSERT_ALLOCMEM(1320, mpMaterialTable->mMaterialNodePointer); - mpMaterialTable->field_0x10 = NULL; + mpMaterialTable->mMaterial = NULL; for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { flags = i_flags; mpMaterialTable->mMaterialNodePointer[i] = factory.create(NULL, J3DMaterialFactory::MATERIAL_TYPE_LOCKED, i, flags); } for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { - mpMaterialTable->mMaterialNodePointer[i]->mDiffFlag = 0xc0000000; + mpMaterialTable->mMaterialNodePointer[i]->mMaterialID = 0xC0000000; } } else { for (u16 i = 0; i < mpMaterialTable->mMaterialNum; i++) { diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index ec98820b7b..42ac8075c7 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -1824,11 +1824,24 @@ static u16 const l_drawlistSize[21] = { }; static u8 const l_nonSortId[9] = { - 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x09, 0x12, 0x0D, + dDlst_list_c::DB_OPA_LIST_SKY, + dDlst_list_c::DB_XLU_LIST_SKY, + dDlst_list_c::DB_LIST_P0, + dDlst_list_c::DB_XLU_LIST_BG, + dDlst_list_c::DB_OPA_LIST_DARK_BG, + dDlst_list_c::DB_XLU_LIST_DARK_BG, + dDlst_list_c::DB_OPA_LIST_DARK, + dDlst_list_c::DB_LIST_2D_SCREEN, + dDlst_list_c::DB_OPA_LIST_ITEM3D, }; static const u8 l_zSortId[6] = { - 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x11, + dDlst_list_c::DB_XLU_LIST, + dDlst_list_c::DB_XLU_LIST_DARK, + dDlst_list_c::DB_LIST_FILTER, + dDlst_list_c::DB_XLU_LIST_ITEM3D, + dDlst_list_c::DB_XLU_LIST_INVISIBLE, + dDlst_list_c::DB_LIST_Z_XLU, }; void dDlst_list_c::init() {