fixes and cleanups for j3d material

This commit is contained in:
Jasper St. Pierre
2026-04-12 20:14:24 -07:00
parent 4f958793ba
commit 9f22f27909
9 changed files with 66 additions and 49 deletions
@@ -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;
@@ -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;
@@ -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
@@ -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;
@@ -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();
@@ -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;
}
}
+2 -2
View File
@@ -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() {
@@ -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++) {
+15 -2
View File
@@ -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() {