mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-02 01:30:00 -04:00
fixes and cleanups for j3d material
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user