diff --git a/libs/JSystem/include/JSystem/J3DGraphBase/J3DMatBlock.h b/libs/JSystem/include/JSystem/J3DGraphBase/J3DMatBlock.h index a959609f45..7463562c3e 100644 --- a/libs/JSystem/include/JSystem/J3DGraphBase/J3DMatBlock.h +++ b/libs/JSystem/include/JSystem/J3DGraphBase/J3DMatBlock.h @@ -1755,6 +1755,16 @@ class J3DIndBlockNull : public J3DIndBlock { virtual ~J3DIndBlockNull() {} }; +#ifdef DUSK_TPHD +struct PolygonOffset { + BE(f32) mFrontOffset; + BE(f32) mFrontScale; + BE(f32) mBackOffset; + BE(f32) mBackScale; + BE(f32) mClamp; +}; +#endif + /** * @ingroup jsystem-j3d * @@ -1787,6 +1797,10 @@ class J3DPEBlock { virtual void setDither(u8 const*) {} virtual void setDither(u8) {} virtual u8 getDither() const { return 0; } +#ifdef DUSK_TPHD + virtual void setPolygonOffset(const PolygonOffset&) {} + virtual PolygonOffset* getPolygonOffset() { return NULL; } +#endif virtual u32 getFogOffset() const { return 0; } virtual void setFogOffset(u32) {} virtual ~J3DPEBlock() {} @@ -1950,12 +1964,25 @@ class J3DPEBlockFull : public J3DPEBlock { virtual void setFogOffset(u32 fogOffset) { mFogOffset = fogOffset; } virtual ~J3DPEBlockFull() {} +#ifdef DUSK_TPHD + virtual void setPolygonOffset(const PolygonOffset& offset) { + mPolygonOffset = offset; + } + + virtual PolygonOffset* getPolygonOffset() { + return &mPolygonOffset; + } +#endif + /* 0x04 */ J3DFog mFog; /* 0x30 */ J3DAlphaComp mAlphaComp; /* 0x34 */ J3DBlend mBlend; /* 0x38 */ J3DZMode mZMode; /* 0x3A */ u8 mZCompLoc; /* 0x3B */ u8 mDither; +#ifdef DUSK_TPHD + PolygonOffset mPolygonOffset; +#endif /* 0x3C */ u32 mFogOffset; }; // Size: 0x40 diff --git a/libs/JSystem/include/JSystem/J3DGraphLoader/J3DMaterialFactory.h b/libs/JSystem/include/JSystem/J3DGraphLoader/J3DMaterialFactory.h index 2820ca1e90..47e9b3e7d1 100644 --- a/libs/JSystem/include/JSystem/J3DGraphLoader/J3DMaterialFactory.h +++ b/libs/JSystem/include/JSystem/J3DGraphLoader/J3DMaterialFactory.h @@ -46,6 +46,13 @@ struct J3DMaterialInitData { /* 0x14A */ BE(u16) mNBTScaleIdx; }; // size 0x14C + +#ifdef DUSK_TPHD +struct J3DMaterialInitData_MAT4 : public J3DMaterialInitData { + /* 0x14C */ BE(u16) mPolygonOffsetIdx; +}; // size 0x14E +#endif + /** * @ingroup jsystem-j3d * @@ -85,33 +92,6 @@ struct J3DDisplayListInit { /* 0x4 */ BE(u32) field_0x4; }; // size 8 -#if DUSK_TPHD -// MAT4 material-entry blocks have 2 trailing bytes per entry compared to MAT3. -// This strided view skips over the extras at indexing time, leaving the -// in-memory data untouched. -class J3DMaterialInitDataView { -public: - J3DMaterialInitDataView() : mpData(NULL), mStride(sizeof(J3DMaterialInitData)) {} - - void set(const void* data, u32 stride) { - mpData = (u8*)data; - mStride = stride; - } - - J3DMaterialInitData& operator[](int idx) { - return *(J3DMaterialInitData*)(mpData + (idx * mStride)); - } - - J3DMaterialInitData& operator[](int idx) const { - return *(J3DMaterialInitData*)(mpData + (idx * mStride)); - } - -private: - u8* mpData; - u32 mStride; -}; -#endif - struct J3DTexCoord2Info; class J3DCurrentMtxInfo; @@ -170,11 +150,26 @@ class J3DMaterialFactory { J3DNBTScale newNBTScale(int) const; u16 getMaterialID(int idx) const { return mpMaterialID[idx]; } +#ifdef DUSK_TPHD + u8 getMaterialMode(int idx) const { return getMatInitData(idx)->mMaterialMode; } +#else u8 getMaterialMode(int idx) const { return mpMaterialInitData[mpMaterialID[idx]].mMaterialMode; } +#endif +#if DUSK_TPHD + const PolygonOffset newPolygonOffset(int) const; + + J3DMaterialInitData* getMatInitData(int idx) const { + static const u32 sInitDataSizes[] = {0, 0, 0x138, 0x14C, 0x14E}; + + return (J3DMaterialInitData*)((u8*)mpMaterialInitData + sInitDataSizes[mBlockType] * getMaterialID(idx)); + } + + u16 mBlockType; +#endif /* 0x00 */ u16 mMaterialNum; #if DUSK_TPHD - /* 0x04 */ J3DMaterialInitDataView mpMaterialInitData; + /* 0x04 */ void* mpMaterialInitData; #else /* 0x04 */ J3DMaterialInitData* mpMaterialInitData; #endif @@ -206,6 +201,9 @@ class J3DMaterialFactory { /* 0x6C */ u8* mpZCompLoc; /* 0x70 */ u8* mpDither; /* 0x74 */ J3DNBTScaleInfo* mpNBTScaleInfo; +#ifdef DUSK_TPHD + PolygonOffset* mpPolygonOffsets; +#endif /* 0x78 */ J3DDisplayListInit* mpDisplayListInit; /* 0x7C */ J3DPatchingInfo* mpPatchingInfo; /* 0x80 */ J3DCurrentMtxInfo* mpCurrentMtxInfo; diff --git a/libs/JSystem/include/JSystem/J3DGraphLoader/J3DModelLoader.h b/libs/JSystem/include/JSystem/J3DGraphLoader/J3DModelLoader.h index 6c856f1a3d..3b4627a9c7 100644 --- a/libs/JSystem/include/JSystem/J3DGraphLoader/J3DModelLoader.h +++ b/libs/JSystem/include/JSystem/J3DGraphLoader/J3DModelLoader.h @@ -169,6 +169,12 @@ struct J3DMaterialBlock_v21 : public J3DModelBlock { /* 0x74 */ OFFSET_PTR_V0 mpNBTScaleInfo; }; +#ifdef DUSK_TPHD +struct J3DMaterialBlock_MAT4 : public J3DMaterialBlock { + /* 0x84 */ OFFSET_PTR_V0 mpPolygonOffsets; +}; +#endif + /** * @ingroup jsystem-j3d * diff --git a/libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory.cpp b/libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory.cpp index 5aabde57aa..94bd257797 100644 --- a/libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory.cpp +++ b/libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory.cpp @@ -12,16 +12,11 @@ #include "dusk/logging.h" J3DMaterialFactory::J3DMaterialFactory(J3DMaterialBlock const& i_block) { +#ifdef DUSK_TPHD + mBlockType = (i_block.mBlockType & 0xFF) - 0x30; // get number at last byte of block name +#endif mMaterialNum = i_block.mMaterialNum; -#if DUSK_TPHD - u32 material_init_data_size = sizeof(J3DMaterialInitData); - if (i_block.mBlockType == 'MAT4') { - material_init_data_size += sizeof(u16); - } - mpMaterialInitData.set(JSUConvertOffsetToPtr(&i_block, i_block.mpMaterialInitData), material_init_data_size); -#else mpMaterialInitData = JSUConvertOffsetToPtr(&i_block, i_block.mpMaterialInitData); -#endif mpMaterialID = JSUConvertOffsetToPtr(&i_block, i_block.mpMaterialID); if (i_block.mpIndInitData != (uintptr_t)NULL && (uintptr_t)i_block.mpIndInitData - (uintptr_t)i_block.mpNameTable > 4) { mpIndInitData = JSUConvertOffsetToPtr(&i_block, i_block.mpIndInitData); @@ -54,6 +49,11 @@ J3DMaterialFactory::J3DMaterialFactory(J3DMaterialBlock const& i_block) { mpZCompLoc = JSUConvertOffsetToPtr(&i_block, i_block.mpZCompLoc); mpDither = JSUConvertOffsetToPtr(&i_block, i_block.mpDither); mpNBTScaleInfo = JSUConvertOffsetToPtr(&i_block, i_block.mpNBTScaleInfo); +#ifdef DUSK_TPHD + if(mBlockType >= 4) { + mpPolygonOffsets = JSUConvertOffsetToPtr(&i_block, reinterpret_cast(i_block).mpPolygonOffsets); + } +#endif mpDisplayListInit = NULL; mpPatchingInfo = NULL; mpCurrentMtxInfo = NULL; @@ -62,11 +62,7 @@ J3DMaterialFactory::J3DMaterialFactory(J3DMaterialBlock const& i_block) { J3DMaterialFactory::J3DMaterialFactory(J3DMaterialDLBlock const& i_block) { mMaterialNum = i_block.mMaterialNum; -#if DUSK_TPHD - mpMaterialInitData.set(NULL, sizeof(J3DMaterialInitData)); -#else mpMaterialInitData = NULL; -#endif mpDisplayListInit = JSUConvertOffsetToPtr(&i_block, i_block.mpDisplayListInit); mpPatchingInfo = JSUConvertOffsetToPtr(&i_block, i_block.mpPatchingInfo); mpCurrentMtxInfo = JSUConvertOffsetToPtr(&i_block, i_block.mpCurrentMtxInfo); @@ -86,7 +82,11 @@ u16 J3DMaterialFactory::countUniqueMaterials() { } u32 J3DMaterialFactory::countTexGens(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTexGenNumIdx != 0xff) { return mpTexGenNum[mtl_init_data->mTexGenNumIdx]; } @@ -94,7 +94,11 @@ u32 J3DMaterialFactory::countTexGens(int i_idx) const { } u32 J3DMaterialFactory::countStages(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif u32 count1 = 0; u32 count2 = 0; if (mtl_init_data->mTevStageNumIdx != 0xff) { @@ -169,6 +173,9 @@ J3DMaterial* J3DMaterialFactory::createNormalMaterial(J3DMaterial* i_material, i i_material->mPEBlock->setZMode(newZMode(i_idx)); i_material->mPEBlock->setZCompLoc(newZCompLoc(i_idx)); i_material->mPEBlock->setDither(newDither(i_idx)); +#ifdef DUSK_TPHD + i_material->mPEBlock->setPolygonOffset(newPolygonOffset(i_idx)); +#endif i_material->mTevBlock->setTevStageNum(newTevStageNum(i_idx)); for (u8 i = 0; i < tex_num; i++) { i_material->mTevBlock->setTexNo(i, newTexNo(i_idx, i)); @@ -177,7 +184,11 @@ J3DMaterial* J3DMaterialFactory::createNormalMaterial(J3DMaterial* i_material, i i_material->mTevBlock->setTevOrder(i, newTevOrder(i_idx, i)); } for (u8 i = 0; i < tev_stage_num_max; i++) { +#ifdef DUSK_TPHD + J3DMaterialInitData* material_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif i_material->mTevBlock->setTevStage(i, newTevStage(i_idx, i)); if (material_init_data->mTevSwapModeIdx[i] != 0xffff) { i_material->mTevBlock->getTevStage(i)->setTexSel( @@ -212,7 +223,11 @@ J3DMaterial* J3DMaterialFactory::createNormalMaterial(J3DMaterial* i_material, i for (u8 i = 0; i < 8; i++) { i_material->mTexGenBlock->setTexMtx(i, newTexMtx(i_idx, i)); } - J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#ifdef DUSK_TPHD + J3DMaterialInitData* material_init_data = getMatInitData(i_idx); +#else + J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif for (u8 i = 0; i < tev_stage_num_max; i++) { if (material_init_data->mTevKColorSel[i] != 0xff) { i_material->mTevBlock->setTevKColorSel(i, material_init_data->mTevKColorSel[i]); @@ -285,7 +300,11 @@ J3DMaterial* J3DMaterialFactory::createPatchedMaterial(J3DMaterial* i_material, i_material->mTevBlock->setTevColor(i, newTevColor(i_idx, i)); } for (u8 i = 0; i < tev_stage_num; i++) { +#ifdef DUSK_TPHD + J3DMaterialInitData* material_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* material_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif i_material->mTevBlock->setTevStage(i, newTevStage(i_idx, i)); if (material_init_data->mTevSwapModeIdx[i] != 0xffff) { i_material->mTevBlock->getTevStage(i)->setTexSel( @@ -294,7 +313,11 @@ J3DMaterial* J3DMaterialFactory::createPatchedMaterial(J3DMaterial* i_material, mpTevSwapModeInfo[material_init_data->mTevSwapModeIdx[i]].mRasSel); } } - J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#ifdef DUSK_TPHD + J3DMaterialInitData* init_data = getMatInitData(i_idx); +#else + J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif for (u8 i = 0; i < tev_stage_num; i++) { if (init_data->mTevKColorSel[i] != 0xff) { i_material->mTevBlock->setTevKColorSel(i, init_data->mTevKColorSel[i]); @@ -435,7 +458,11 @@ u32 J3DMaterialFactory::calcSizeNormalMaterial(J3DMaterial* i_material, int i_id size += J3DMaterial::calcSizeTevBlock((u16)tev_stage_num_max); size += J3DMaterial::calcSizeIndBlock(ind_flag); size += J3DMaterial::calcSizePEBlock(pe_flag, getMaterialMode(i_idx)); +#ifdef DUSK_TPHD + J3DMaterialInitData* init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif for (u32 i = 0; i < 8; i++) { if (init_data->mTexMtxIdx[i] != 0xffff) { size += sizeof(J3DTexMtx); @@ -456,7 +483,11 @@ u32 J3DMaterialFactory::calcSizePatchedMaterial(J3DMaterial* i_material, int i_i size += sizeof(J3DTevBlockPatched); size += J3DMaterial::calcSizeIndBlock(ind_flag); size += J3DMaterial::calcSizePEBlock(0x10000000, getMaterialMode(i_idx)); +#ifdef DUSK_TPHD + J3DMaterialInitData* init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif for (u32 i = 0; i < 8; i++) { if (init_data->mTexMtxIdx[i] != 0xffff) { size += sizeof(J3DTexMtx); @@ -486,7 +517,11 @@ J3DGXColor J3DMaterialFactory::newMatColor(int i_idx, int i_no) const { #else J3DGXColor dflt = GXColor{0xff, 0xff, 0xff, 0xff}; #endif +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mMatColorIdx[i_no] != 0xffff) { return (GXColor) mpMatColor[mtl_init_data->mMatColorIdx[i_no]]; } else { @@ -495,7 +530,11 @@ J3DGXColor J3DMaterialFactory::newMatColor(int i_idx, int i_no) const { } const u8 J3DMaterialFactory::newColorChanNum(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mColorChanNumIdx != 0xff) { return mpColorChanNum[mtl_init_data->mColorChanNumIdx]; } else { @@ -505,7 +544,11 @@ const u8 J3DMaterialFactory::newColorChanNum(int i_idx) const { J3DColorChan J3DMaterialFactory::newColorChan(int i_idx, int i_no) const { u32 r29 = 0; +#ifdef DUSK_TPHD + J3DMaterialInitData* init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (init_data->mColorChanIdx[i_no] != 0xffff) { return J3DColorChan(mpColorChanInfo[init_data->mColorChanIdx[i_no]]); } else { @@ -519,7 +562,11 @@ J3DGXColor J3DMaterialFactory::newAmbColor(int i_idx, int i_no) const { #else J3DGXColor dflt = GXColor{0x32, 0x32, 0x32, 0x32}; #endif +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mAmbColorIdx[i_no] != 0xffff) { return (GXColor) mpAmbColor[mtl_init_data->mAmbColorIdx[i_no]]; } else { @@ -529,7 +576,11 @@ J3DGXColor J3DMaterialFactory::newAmbColor(int i_idx, int i_no) const { u32 J3DMaterialFactory::newTexGenNum(int i_idx) const { u32 r30 = 0; +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTexGenNumIdx != 0xff) { return mpTexGenNum[mtl_init_data->mTexGenNumIdx]; } else { @@ -538,7 +589,11 @@ u32 J3DMaterialFactory::newTexGenNum(int i_idx) const { } J3DTexCoord J3DMaterialFactory::newTexCoord(int i_idx, int i_no) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTexCoordIdx[i_no] != 0xffff) { return J3DTexCoord(mpTexCoordInfo[mtl_init_data->mTexCoordIdx[i_no]]); } else { @@ -548,7 +603,11 @@ J3DTexCoord J3DMaterialFactory::newTexCoord(int i_idx, int i_no) const { J3DTexMtx* J3DMaterialFactory::newTexMtx(int i_idx, int i_no) const { J3DTexMtx* tex_mtx = NULL; +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTexMtxIdx[i_no] != 0xffff) { #if TARGET_LITTLE_ENDIAN auto tex_mtx_info = mpTexMtxInfo[mtl_init_data->mTexMtxIdx[i_no]]; @@ -570,7 +629,11 @@ J3DTexMtx* J3DMaterialFactory::newTexMtx(int i_idx, int i_no) const { u8 J3DMaterialFactory::newCullMode(int i_idx) const { u32 r30 = 0; +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mCullModeIdx != 0xff) { return mpCullMode[mtl_init_data->mCullModeIdx]; } else { @@ -579,7 +642,11 @@ u8 J3DMaterialFactory::newCullMode(int i_idx) const { } u16 J3DMaterialFactory::newTexNo(int i_idx, int i_no) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTexNoIdx[i_no] != 0xffff) { return mpTexNo[mtl_init_data->mTexNoIdx[i_no]]; } else { @@ -588,7 +655,11 @@ u16 J3DMaterialFactory::newTexNo(int i_idx, int i_no) const { } J3DTevOrder J3DMaterialFactory::newTevOrder(int i_idx, int i_no) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTevOrderIdx[i_no] != 0xffff) { return J3DTevOrder(mpTevOrderInfo[mtl_init_data->mTevOrderIdx[i_no]]); } else { @@ -599,7 +670,11 @@ J3DTevOrder J3DMaterialFactory::newTevOrder(int i_idx, int i_no) const { J3DGXColorS10 J3DMaterialFactory::newTevColor(int i_idx, int i_no) const { GXColorS10 _dflt = {0, 0, 0, 0}; J3DGXColorS10 dflt = _dflt; +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTevColorIdx[i_no] != 0xffff) { return (GXColorS10) mpTevColor[mtl_init_data->mTevColorIdx[i_no]]; } else { @@ -613,7 +688,11 @@ J3DGXColor J3DMaterialFactory::newTevKColor(int i_idx, int i_no) const { #else J3DGXColor dflt = GXColor{0xff, 0xff, 0xff, 0xff}; #endif +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTevKColorIdx[i_no] != 0xffff) { return (GXColor) mpTevKColor[mtl_init_data->mTevKColorIdx[i_no]]; } else { @@ -622,7 +701,11 @@ J3DGXColor J3DMaterialFactory::newTevKColor(int i_idx, int i_no) const { } const u8 J3DMaterialFactory::newTevStageNum(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTevStageNumIdx != 0xff) { return mpTevStageNum[mtl_init_data->mTevStageNumIdx]; } else { @@ -631,7 +714,11 @@ const u8 J3DMaterialFactory::newTevStageNum(int i_idx) const { } J3DTevStage J3DMaterialFactory::newTevStage(int i_idx, int i_no) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTevStageIdx[i_no] != 0xffff) { return J3DTevStage(mpTevStageInfo[mtl_init_data->mTevStageIdx[i_no]]); } else { @@ -640,7 +727,11 @@ J3DTevStage J3DMaterialFactory::newTevStage(int i_idx, int i_no) const { } J3DTevSwapModeTable J3DMaterialFactory::newTevSwapModeTable(int i_idx, int i_no) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mTevSwapModeTableIdx[i_no] != 0xffff) { return J3DTevSwapModeTable(mpTevSwapModeTableInfo[mtl_init_data->mTevSwapModeTableIdx[i_no]]); } else { @@ -701,7 +792,11 @@ J3DIndTexCoordScale J3DMaterialFactory::newIndTexCoordScale(int i_idx, int i_no) J3DFog J3DMaterialFactory::newFog(int i_idx) const { J3DFog fog; +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mFogIdx != 0xffff) { #if TARGET_LITTLE_ENDIAN J3DFogInfo fogInfo = mpFogInfo[mtl_init_data->mFogIdx]; @@ -721,7 +816,11 @@ J3DFog J3DMaterialFactory::newFog(int i_idx) const { } J3DAlphaComp J3DMaterialFactory::newAlphaComp(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mAlphaCompIdx != 0xffff) { return J3DAlphaComp(mpAlphaCompInfo[mtl_init_data->mAlphaCompIdx]); } else { @@ -730,7 +829,11 @@ J3DAlphaComp J3DMaterialFactory::newAlphaComp(int i_idx) const { } J3DBlend J3DMaterialFactory::newBlend(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mBlendIdx != 0xffff) { return J3DBlend(mpBlendInfo[mtl_init_data->mBlendIdx]); } else { @@ -740,7 +843,11 @@ J3DBlend J3DMaterialFactory::newBlend(int i_idx) const { J3DZMode J3DMaterialFactory::newZMode(int i_idx) const { u32 r29 = 0; +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mZModeIdx != 0xff) { return J3DZMode(mpZModeInfo[mtl_init_data->mZModeIdx]); } else { @@ -749,7 +856,11 @@ J3DZMode J3DMaterialFactory::newZMode(int i_idx) const { } const u8 J3DMaterialFactory::newZCompLoc(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mZCompLocIdx != 0xff){ return mpZCompLoc[mtl_init_data->mZCompLocIdx]; } else { @@ -758,7 +869,11 @@ const u8 J3DMaterialFactory::newZCompLoc(int i_idx) const { } const u8 J3DMaterialFactory::newDither(int i_idx) const { +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mDitherIdx != 0xff){ return mpDither[mtl_init_data->mDitherIdx]; } else { @@ -766,9 +881,24 @@ const u8 J3DMaterialFactory::newDither(int i_idx) const { } } +#ifdef DUSK_TPHD +const PolygonOffset J3DMaterialFactory::newPolygonOffset(int i_idx) const { + J3DMaterialInitData_MAT4* mtl_init_data = (J3DMaterialInitData_MAT4*)getMatInitData(i_idx); + if (mBlockType >= 4 && mtl_init_data->mPolygonOffsetIdx != 0xffff){ + return mpPolygonOffsets[mtl_init_data->mPolygonOffsetIdx]; + } else { + return PolygonOffset{0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; + } +} +#endif + J3DNBTScale J3DMaterialFactory::newNBTScale(int i_idx) const { J3DNBTScale dflt(j3dDefaultNBTScaleInfo); +#ifdef DUSK_TPHD + J3DMaterialInitData* mtl_init_data = getMatInitData(i_idx); +#else J3DMaterialInitData* mtl_init_data = &mpMaterialInitData[mpMaterialID[i_idx]]; +#endif if (mtl_init_data->mNBTScaleIdx != 0xffff) { return J3DNBTScale(mpNBTScaleInfo[mtl_init_data->mNBTScaleIdx]); } else { diff --git a/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp b/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp index a5409cd137..9841c103a9 100644 --- a/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp +++ b/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp @@ -104,7 +104,7 @@ J3DModelData* J3DModelLoader::load(void const* i_data, u32 i_flags) { break; case 'MAT3': #if DUSK_TPHD - case 'MAT4': // TODO: Real MAT4 support + case 'MAT4': #endif readMaterial((J3DMaterialBlock*)block, (s32)i_flags); break; @@ -151,7 +151,7 @@ J3DMaterialTable* J3DModelLoader::loadMaterialTable(void const* i_data) { switch (block->mBlockType) { case 'MAT3': #if DUSK_TPHD - case 'MAT4': // TODO: Real MAT4 support + case 'MAT4': #endif readMaterialTable((J3DMaterialBlock*)block, flags); break; @@ -219,7 +219,7 @@ J3DModelData* J3DModelLoader::loadBinaryDisplayList(void const* i_data, u32 i_fl break; case 'MAT3': #if DUSK_TPHD - case 'MAT4': // TODO: Real MAT4 support + case 'MAT4': #endif flags = 0x50100000; flags |= (i_flags & 0x3000000); diff --git a/libs/JSystem/src/J3DGraphLoader/J3DModelLoaderCalcSize.cpp b/libs/JSystem/src/J3DGraphLoader/J3DModelLoaderCalcSize.cpp index eea522eb72..da562293d4 100644 --- a/libs/JSystem/src/J3DGraphLoader/J3DModelLoaderCalcSize.cpp +++ b/libs/JSystem/src/J3DGraphLoader/J3DModelLoaderCalcSize.cpp @@ -16,7 +16,6 @@ u16 J3DModelLoader::countMaterialNum(const void* stream) { const J3DModelBlock* block = header->mBlocks; for (int i = 0; i < header->mBlockNum; i++) { - // TODO: Real MAT4 support if (block->mBlockType == 'MAT3' || block->mBlockType == 'MAT4') { const J3DMaterialBlock* materialBlock = (const J3DMaterialBlock*)block; return materialBlock->mMaterialNum; @@ -47,7 +46,6 @@ u32 J3DModelLoader::calcLoadSize(void const* stream, u32 flags_) { break; case 'MAT3': case 'MAT4': - // TODO: Real MAT4 support size += calcSizeMaterial((const J3DMaterialBlock*)nextBlock, flags); break; case 'SHP1': @@ -90,7 +88,6 @@ u32 J3DModelLoader::calcLoadMaterialTableSize(const void* stream) { switch (nextBlock->mBlockType) { case 'MAT3': case 'MAT4': - // TODO: Real MAT4 support size += calcSizeMaterialTable((const J3DMaterialBlock*)nextBlock, flags); break; case 'TEX1': @@ -142,7 +139,6 @@ u32 J3DModelLoader::calcLoadBinaryDisplayListSize(const void* stream, u32 flags) break; case 'MAT3': case 'MAT4': { - // TODO: Real MAT4 support u32 flags2 = (J3DMLF_21 | J3DMLF_Material_PE_Full | J3DMLF_Material_Color_LightOn); flags2 |= (u32)flags & (J3DMLF_Material_UseIndirect | J3DMLF_26); mpMaterialBlock = (const J3DMaterialBlock*)nextBlock;