diff options
| author | Luke Street <luke@street.dev> | 2026-03-01 15:35:36 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-01 14:35:36 -0800 |
| commit | 9649319ec4926457ef85e6094f8207474c977c2d (patch) | |
| tree | 1c5cd4c7cc4c1aee03f28921213da47f2775444d /libs/JSystem/src/J3DGraphBase/J3DMatBlock.cpp | |
| parent | 6e149819e13b1f70ecbf8a4c66b030c17ffed2bb (diff) | |
Reorganize library code into `libs/` (#3119)
* Reorganize files into libs/{dolphin,JSystem,PowerPC_EABI_Support,revolution,TRK_MINNOW_DOLPHIN}
* Update configure.py and project.py for new libs structure
* Refactor `#include <dolphin/x.h>` -> `<x.h>`
* Remove `__REVOLUTION_SDK__` forwards from dolphin
* Fix dolphin/ references in revolution
* Wrap `#include <dolphin.h>` in `!__REVOLUTION_SDK__`
* Always build TRK against dolphin headers
* Resolve revolution SDK header resolution issues
Diffstat (limited to 'libs/JSystem/src/J3DGraphBase/J3DMatBlock.cpp')
| -rw-r--r-- | libs/JSystem/src/J3DGraphBase/J3DMatBlock.cpp | 2019 |
1 files changed, 2019 insertions, 0 deletions
diff --git a/libs/JSystem/src/J3DGraphBase/J3DMatBlock.cpp b/libs/JSystem/src/J3DGraphBase/J3DMatBlock.cpp new file mode 100644 index 0000000000..004189a89b --- /dev/null +++ b/libs/JSystem/src/J3DGraphBase/J3DMatBlock.cpp @@ -0,0 +1,2019 @@ +#include "JSystem/JSystem.h" // IWYU pragma: keep + +#include "JSystem/J3DGraphBase/J3DMatBlock.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" +#include "JSystem/J3DGraphBase/J3DSys.h" +#include "JSystem/J3DGraphBase/J3DTransform.h" +#include "global.h" +#include <cstring> + +inline void loadMatColors(const J3DGXColor* color) { + J3DGDWriteXFCmdHdr(0x100C, 2); + J3DGDWrite_u32(*(u32*)color); + J3DGDWrite_u32(*(u32*)(color + 1)); +} + +inline void loadAmbColors(const J3DGXColor* color) { + J3DGDWriteXFCmdHdr(0x100A, 2); + J3DGDWrite_u32(*(u32*)color); + J3DGDWrite_u32(*(u32*)(color + 1)); +} + +inline void loadTexCoordScale(GXTexCoordID coord, const J3DTexCoordScaleInfo& info) { + J3DGDSetTexCoordScale2(coord, info.field_0x00, info.field_0x04 == 1, 0, info.field_0x02, info.field_0x06 == 1, 0); +} + +inline void loadTevColor(u32 reg, const J3DGXColorS10& color) { + J3DGDSetTevColorS10(GXTevRegID(reg + 1), color); +} + +inline void loadTevKColor(u32 reg, const J3DGXColor& color) { + J3DGDSetTevKColor(GXTevKColorID(reg), color); +} + +void J3DColorBlockLightOff::initialize() { + mColorChanNum = 0; + for (int i = 0; i < ARRAY_SIZE(mMatColor); i++) { + mMatColor[i] = j3dDefaultColInfo; + } + mMatColorOffset = 0; + mColorChanOffset = 0; +} + +void J3DColorBlockAmbientOn::initialize() { + mColorChanNum = 0; + for (int i = 0; i < ARRAY_SIZE(mMatColor); i++) { + mMatColor[i] = j3dDefaultColInfo; + } + for (int i = 0; i < ARRAY_SIZE(mAmbColor); i++) { + mAmbColor[i] = j3dDefaultAmbInfo; + } + mMatColorOffset = 0; + mColorChanOffset = 0; +} + +void J3DColorBlockLightOn::initialize() { + mColorChanNum = 0; + for (int i = 0; i < ARRAY_SIZE(mMatColor); i++) { + mMatColor[i] = j3dDefaultColInfo; + } + for (int i = 0; i < ARRAY_SIZE(mAmbColor); i++) { + mAmbColor[i] = j3dDefaultAmbInfo; + } + for (int i = 0; i < ARRAY_SIZE(mLight); i++) { + mLight[i] = NULL; + } + mMatColorOffset = 0; + mColorChanOffset = 0; +} + +void J3DTexGenBlockPatched::initialize() { + mTexGenNum = 0; + for (int i = 0; i < 8; i++) + mTexMtx[i] = NULL; + mTexMtxOffset = 0; +} + +void J3DTexGenBlock4::initialize() { + mTexGenNum = 0; + for (int i = 0; i < 4; i++) + mTexMtx[i] = NULL; + mTexMtxOffset = 0; +} + +void J3DTexGenBlockBasic::initialize() { + mTexGenNum = 0; + for (int i = 0; i < 8; i++) + mTexMtx[i] = NULL; + mTexMtxOffset = 0; +} + +void J3DTevBlockNull::initialize() { + mTexNoOffset = 0; +} + +void J3DTevBlockPatched::initialize() { + for (int i = 0; i < ARRAY_SIZE(mTexNo); i++) { + mTexNo[i] = 0xFFFF; + } + for (int i = 0; i < ARRAY_SIZEU(mTevStage); i++) { + mTevStage[i].setStageNo(i); + } + for (int i = 0; i < 3; i++) { + mTevColor[i] = j3dDefaultTevColor; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColor); i++) { + mTevKColor[i] = j3dDefaultTevKColor; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColorSel); i++) { + mTevKColorSel[i] = GX_TEV_KCSEL_K0; + } + + mTevStageNum = 1; + mTexNoOffset = 0; + mTevRegOffset = 0; +} + +void J3DTevBlock1::initialize() { + mTexNo[0] = 0xFFFF; + mTevStage[0].setStageNo(0); + mTexNoOffset = 0; +} + +void J3DTevBlock2::initialize() { + mTexNo[0] = 0xFFFF; + mTexNo[1] = 0xFFFF; + mTevStageNum = 1; + + mTevStage[0].setStageNo(0); + mTevStage[1].setStageNo(1); + mTevKColorSel[0] = GX_TEV_KCSEL_K0; + mTevKColorSel[1] = GX_TEV_KCSEL_K0; + mTevKAlphaSel[0] = GX_TEV_KASEL_K0_A; + mTevKAlphaSel[1] = GX_TEV_KASEL_K0_A; + + for (int i = 0; i < 3; i++) { + mTevColor[i] = j3dDefaultTevColor; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColor); i++) { + mTevKColor[i] = j3dDefaultTevKColor; + } + + mTexNoOffset = 0; + mTevRegOffset = 0; +} + +void J3DTevBlock4::initialize() { + mTexNo[0] = 0xFFFF; + mTexNo[1] = 0xFFFF; + mTexNo[2] = 0xFFFF; + mTexNo[3] = 0xFFFF; + mTevStageNum = 1; + + mTevStage[0].setStageNo(0); + mTevStage[1].setStageNo(1); + mTevStage[2].setStageNo(2); + mTevStage[3].setStageNo(3); + + mTevKColorSel[0] = GX_TEV_KCSEL_K0; + mTevKColorSel[1] = GX_TEV_KCSEL_K0; + mTevKColorSel[2] = GX_TEV_KCSEL_K0; + mTevKColorSel[3] = GX_TEV_KCSEL_K0; + mTevKAlphaSel[0] = GX_TEV_KASEL_K0_A; + mTevKAlphaSel[1] = GX_TEV_KASEL_K0_A; + mTevKAlphaSel[2] = GX_TEV_KASEL_K0_A; + mTevKAlphaSel[3] = GX_TEV_KASEL_K0_A; + + for (int i = 0; i < 3; i++) { + mTevColor[i] = j3dDefaultTevColor; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColor); i++) { + mTevKColor[i] = j3dDefaultTevKColor; + } + + mTexNoOffset = 0; + mTevRegOffset = 0; +} + +void J3DTevBlock16::initialize() { + for (int i = 0; i < ARRAY_SIZE(mTexNo); i++) { + mTexNo[i] = 0xFFFF; + } + + mTevStageNum = 1; + + for (int i = 0; i < 3; i++) { + mTevColor[i] = j3dDefaultTevColor; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColor); i++) { + mTevKColor[i] = j3dDefaultTevKColor; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColorSel); i++) { + mTevKColorSel[i] = GX_TEV_KCSEL_K0; + } + for (int i = 0; i < ARRAY_SIZE(mTevKColorSel); i++) { + mTevKAlphaSel[i] = GX_TEV_KASEL_K0_A; + } + for (int i = 0; i < ARRAY_SIZEU(mTevStage); i++) { + mTevStage[i].setStageNo(i); + } + + mTexNoOffset = 0; + mTevRegOffset = 0; +} + +void J3DIndBlockFull::initialize() { + mIndTexStageNum = 0; +} + +void J3DPEBlockFogOff::initialize() { + mAlphaComp = 0xFFFF; + mZMode = 0xFFFF; + mZCompLoc = 0xFF; + mDither = 1; +} + +void J3DPEBlockFull::initialize() { + mAlphaComp = 0xFFFF; + mZMode = 0xFFFF; + mZCompLoc = 0xFF; + mDither = 1; + mFogOffset = 0; +} + +s32 J3DColorBlockLightOff::countDLSize() { + return 34; +} + +s32 J3DColorBlockAmbientOn::countDLSize() { + return 47; +} + +s32 J3DColorBlockLightOn::countDLSize() { + return 623; +} + +s32 J3DTexGenBlockPatched::countDLSize() { + return 424; +} + +s32 J3DTexGenBlock4::countDLSize() { + return 254; +} + +s32 J3DTexGenBlockBasic::countDLSize() { + return 498; +} + +s32 J3DTevBlockPatched::countDLSize() { + return 560; +} + +s32 J3DTevBlock1::countDLSize() { + return 105; +} + +s32 J3DTevBlock2::countDLSize() { + return 335; +} + +s32 J3DTevBlock4::countDLSize() { + return 580; +} + +s32 J3DTevBlock16::countDLSize() { + return 1000; +} + +s32 J3DIndBlockFull::countDLSize() { + return 140; +} + +s32 J3DPEBlockOpa::countDLSize() { + return 30; +} + +s32 J3DPEBlockTexEdge::countDLSize() { + return 30; +} + +s32 J3DPEBlockXlu::countDLSize() { + return 30; +} + +s32 J3DPEBlockFogOff::countDLSize() { + return 30; +} + +s32 J3DPEBlockFull::countDLSize() { + return 85; +} + +static u32 SizeOfLoadMatColors = 13; + +static u32 SizeOfLoadAmbColors = 13; + +static u32 SizeOfLoadColorChans = 21; + +static u32 SizeOfJ3DColorBlockLightOffLoad = SizeOfLoadMatColors + SizeOfLoadColorChans; + +void J3DColorBlockLightOff::load() { + GDOverflowCheck(SizeOfJ3DColorBlockLightOffLoad); + mMatColorOffset = GDGetCurrOffset(); + loadMatColors(mMatColor); + mColorChanOffset = GDGetCurrOffset(); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); +} + +static u32 SizeOfJ3DColorBlockAmbientOnLoad = SizeOfLoadMatColors + SizeOfLoadAmbColors + SizeOfLoadColorChans; + +void J3DColorBlockAmbientOn::load() { + GDOverflowCheck(SizeOfJ3DColorBlockAmbientOnLoad); + mMatColorOffset = GDGetCurrOffset(); + loadMatColors(mMatColor); + loadAmbColors(mAmbColor); + mColorChanOffset = GDGetCurrOffset(); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); +} + +void J3DColorBlockLightOn::load() { + GDOverflowCheck(SizeOfJ3DColorBlockAmbientOnLoad); + mMatColorOffset = GDGetCurrOffset(); + loadMatColors(mMatColor); + loadAmbColors(mAmbColor); + mColorChanOffset = GDGetCurrOffset(); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); + + for (u32 i = 0; i < 8; i++) { + if (mLight[i] != NULL) { + mLight[i]->load(i); + } + } +} + +void J3DColorBlockLightOff::patch() { + patchMatColor(); + patchLight(); +} + +void J3DColorBlockLightOff::patchMatColor() { + GDSetCurrOffset(mMatColorOffset); + void* start = GDGetCurrPointer(); + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DColorBlockLightOff::patchLight() { + GDSetCurrOffset(mColorChanOffset); + void* start = GDGetCurrPointer(); + GDOverflowCheck(SizeOfLoadColorChans); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DColorBlockLightOn::patch() { + patchMatColor(); + patchLight(); +} + +void J3DColorBlockLightOn::patchMatColor() { + GDSetCurrOffset(mMatColorOffset); + void* start = GDGetCurrPointer(); + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DColorBlockLightOn::patchLight() { + GDSetCurrOffset(mColorChanOffset); + void* start = GDGetCurrPointer(); + GDOverflowCheck(SizeOfLoadColorChans); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); + + for (u32 i = 0; i < 8; i++) { + if (mLight[i] != NULL) { + mLight[i]->load(i); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DColorBlockLightOff::diff(u32 diffFlags) { + if (diffFlags & J3DDiffFlag_MatColor) + diffMatColor(); + + if (diffFlags & J3DDiffFlag_ColorChan) + diffColorChan(); +} + +void J3DColorBlockLightOff::diffMatColor() { + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); +} + +void J3DColorBlockLightOff::diffColorChan() { + GDOverflowCheck(SizeOfLoadColorChans); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); +} + +void J3DColorBlockLightOn::diff(u32 diffFlags) { + if (diffFlags & J3DDiffFlag_AmbColor) + diffAmbColor(); + + if (diffFlags & J3DDiffFlag_MatColor) + diffMatColor(); + + if (diffFlags & J3DDiffFlag_ColorChan) + diffColorChan(); + + s32 lightObjNum = getDiffFlag_LightObjNum(diffFlags); + if (lightObjNum != 0) + diffLightObj(lightObjNum); +} + +void J3DColorBlockLightOn::diffAmbColor() { + GDOverflowCheck(SizeOfLoadAmbColors); + loadAmbColors(mAmbColor); +} + +void J3DColorBlockLightOn::diffMatColor() { + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); +} + +void J3DColorBlockLightOn::diffColorChan() { + GDOverflowCheck(SizeOfLoadColorChans); + J3DGDWriteXFCmdHdr(XF_REG_COLOR0CNTRL_ID, 4); + mColorChan[0].load(); + mColorChan[2].load(); + mColorChan[1].load(); + mColorChan[3].load(); +} + +void J3DColorBlockLightOn::diffLightObj(u32 lightObjNum) { + for (u32 i = 0; i < lightObjNum; i ++) { + if (mLight[i] != NULL) { + mLight[i]->load(i); + } + } +} + +void J3DTexGenBlock4::load() { + mTexMtxOffset = GDGetCurrOffset(); + for (u32 i = 0; i < 4; i++) { + if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) { + mTexMtx[i]->load(i); + } + } + + if (mTexGenNum != 0) { + loadTexCoordGens(mTexGenNum, mTexCoord); + } +} + +void J3DTexGenBlockBasic::load() { + mTexMtxOffset = GDGetCurrOffset(); + for (u32 i = 0; i < 8; i++) { + if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) { + mTexMtx[i]->load(i); + } + } + + if (mTexGenNum != 0) { + loadTexCoordGens(mTexGenNum, mTexCoord); + } +} + +void J3DTexGenBlockPatched::patch() { + GDSetCurrOffset(mTexMtxOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 8; i++) { + if (mTexMtx[i]) { + mTexMtx[i]->load(i); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTexGenBlock4::patch() { + GDSetCurrOffset(mTexMtxOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 4; i++) { + if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) { + mTexMtx[i]->load(i); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTexGenBlockBasic::patch() { + GDSetCurrOffset(mTexMtxOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 8; i++) { + if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) { + mTexMtx[i]->load(i); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTexGenBlockPatched::diff(u32 diffFlags) { + if (getDiffFlag_TexGenNum(diffFlags)) { + diffTexMtx(); + + if (diffFlags & J3DDiffFlag_TexGen) { + diffTexGen(); + } + } +} + +void J3DTexGenBlockPatched::diffTexMtx() { + for (u32 i = 0; i < ARRAY_SIZEU(mTexMtx); ++i) { + if (mTexMtx[i] != NULL) { + mTexMtx[i]->load(i); + } + } +} + +void J3DTexGenBlockPatched::diffTexGen() { + if (mTexGenNum > 0) { + loadTexCoordGens(mTexGenNum, mTexCoord); + } +} + +void J3DTevBlock1::load() { + mTexNoOffset = GDGetCurrOffset(); + GDOverflowCheck(0x69); + + if (mTexNo[0] != 0xffff) { + loadTexNo(0, mTexNo[0]); + } + + J3DGDSetTevOrder( + GX_TEVSTAGE0, + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[0].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[0].getTevOrderInfo().mColorChan), + GX_TEXCOORD_NULL, + GX_TEXMAP_NULL, + GX_COLOR_NULL + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + J3DSys::sTexCoordScaleTable[mTevOrder[0].getTevOrderInfo().mTexMap & 7] + ); + + mTevStage[0].load(0); + mIndTevStage[0].load(0); +} + +void J3DTevBlock2::load() { + u32 tevStageNum = mTevStageNum; + mTexNoOffset = GDGetCurrOffset(); + + for (u32 i = 0; i < 2; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + J3DGDSetTevOrder( + GX_TEVSTAGE0, + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[0].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[0].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + J3DSys::sTexCoordScaleTable[mTevOrder[0].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[1].getTevOrderInfo().mTexMap & 7] + ); + + mTevRegOffset = GDGetCurrOffset(); + + for (u32 i = 0; i < 3; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < 4; i++) { + loadTevKColor(i, mTevKColor[i]); + } + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + mIndTevStage[i].load(i); + } + + for (u32 i = 0; i < 16; i += 4) { + J3DGDSetTevKonstantSel_SwapModeTable( + GXTevStageID(i), + GXTevKColorSel(mTevKColorSel[0]), + GXTevKAlphaSel(mTevKAlphaSel[0]), + GXTevKColorSel(mTevKColorSel[1]), + GXTevKAlphaSel(mTevKAlphaSel[1]), + GXTevColorChan(mTevSwapModeTable[i / 4].getR()), + GXTevColorChan(mTevSwapModeTable[i / 4].getG()) + ); + + J3DGDSetTevKonstantSel_SwapModeTable( + GXTevStageID(i + 2), + GXTevKColorSel(mTevKColorSel[0]), + GXTevKAlphaSel(mTevKAlphaSel[0]), + GXTevKColorSel(mTevKColorSel[1]), + GXTevKAlphaSel(mTevKAlphaSel[1]), + GXTevColorChan(mTevSwapModeTable[i / 4].getB()), + GXTevColorChan(mTevSwapModeTable[i / 4].getA()) + ); + } +} + +void J3DTevBlock4::load() { + u32 tevStageNum = mTevStageNum; + mTexNoOffset = GDGetCurrOffset(); + + for (u32 i = 0; i < 4; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + for (u32 i = 0; i < tevStageNum; i += 2) { + J3DGDSetTevOrder( + GXTevStageID(i), + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i + 1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i + 1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } + + mTevRegOffset = GDGetCurrOffset(); + + for (u32 i = 0; i < 3; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < 4; i++) { + loadTevKColor(i, mTevKColor[i]); + } + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + mIndTevStage[i].load(i); + } + + for (u32 i = 0; i < 16; i += 4) { + J3DGDSetTevKonstantSel_SwapModeTable( + GXTevStageID(i), + GXTevKColorSel(mTevKColorSel[0]), + GXTevKAlphaSel(mTevKAlphaSel[0]), + GXTevKColorSel(mTevKColorSel[1]), + GXTevKAlphaSel(mTevKAlphaSel[1]), + GXTevColorChan(mTevSwapModeTable[i / 4].getR()), + GXTevColorChan(mTevSwapModeTable[i / 4].getG()) + ); + + J3DGDSetTevKonstantSel_SwapModeTable( + GXTevStageID(i + 2), + GXTevKColorSel(mTevKColorSel[2]), + GXTevKAlphaSel(mTevKAlphaSel[2]), + GXTevKColorSel(mTevKColorSel[3]), + GXTevKAlphaSel(mTevKAlphaSel[3]), + GXTevColorChan(mTevSwapModeTable[i / 4].getB()), + GXTevColorChan(mTevSwapModeTable[i / 4].getA()) + ); + } +} + +void J3DTevBlock16::load() { + u32 tevStageNum = mTevStageNum; + mTexNoOffset = GDGetCurrOffset(); + + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + for (u32 i = 0; i < tevStageNum; i += 2) { + J3DGDSetTevOrder( + GXTevStageID(i), + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i + 1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i + 1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } + + mTevRegOffset = GDGetCurrOffset(); + + for (u32 i = 0; i < 3; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < 4; i++) { + loadTevKColor(i, mTevKColor[i]); + } + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + mIndTevStage[i].load(i); + } + + for (u32 i = 0; i < 16; i += 4) { + J3DGDSetTevKonstantSel_SwapModeTable( + GXTevStageID(i), + GXTevKColorSel(mTevKColorSel[i]), + GXTevKAlphaSel(mTevKAlphaSel[i]), + GXTevKColorSel(mTevKColorSel[i + 1]), + GXTevKAlphaSel(mTevKAlphaSel[i + 1]), + GXTevColorChan(mTevSwapModeTable[i / 4].getR()), + GXTevColorChan(mTevSwapModeTable[i / 4].getG()) + ); + + J3DGDSetTevKonstantSel_SwapModeTable( + GXTevStageID(i + 2), + GXTevKColorSel(mTevKColorSel[i + 2]), + GXTevKAlphaSel(mTevKAlphaSel[i + 2]), + GXTevKColorSel(mTevKColorSel[i + 3]), + GXTevKAlphaSel(mTevKAlphaSel[i + 3]), + GXTevColorChan(mTevSwapModeTable[i / 4].getB()), + GXTevColorChan(mTevSwapModeTable[i / 4].getA()) + ); + } +} + + +void J3DTevBlockPatched::patchTexNo() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlockPatched::patchTevReg() { + GDSetCurrOffset(mTevRegOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlockPatched::patchTexNoAndTexCoordScale() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + for (u32 i = 0; i < tevStageNum; i += 2) { + J3DGDSetTevOrder( + GXTevStageID(i), + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i + 1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i + 1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlockPatched::patch() { + patchTexNo(); + patchTevReg(); +} + +void J3DTevBlock1::patchTexNo() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + if (mTexNo[0] != 0xFFFF) { + loadTexNo(0, mTexNo[0]); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock1::patchTevReg() {} + +void J3DTevBlock1::patchTexNoAndTexCoordScale() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + if (mTexNo[0] != 0xffff) { + loadTexNo(0, mTexNo[0]); + } + + J3DGDSetTevOrder( + GX_TEVSTAGE0, + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[0].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[0].getTevOrderInfo().mColorChan), + GX_TEXCOORD_NULL, + GX_TEXMAP_NULL, + GX_COLOR_NULL + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + J3DSys::sTexCoordScaleTable[mTevOrder[0].getTevOrderInfo().mTexMap & 7] + ); + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock1::patch() { + patchTexNo(); +} + +void J3DTevBlock2::patchTexNo() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 2; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock2::patchTevReg() { + GDSetCurrOffset(mTevRegOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock2::patchTexNoAndTexCoordScale() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 2; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + J3DGDSetTevOrder( + GX_TEVSTAGE0, + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[0].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[0].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + J3DSys::sTexCoordScaleTable[mTevOrder[0].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[1].getTevOrderInfo().mTexMap & 7] + ); + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock2::patch() { + patchTexNo(); + patchTevReg(); +} + +void J3DTevBlock4::patchTexNo() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 4; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock4::patchTevReg() { + GDSetCurrOffset(mTevRegOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock4::patchTexNoAndTexCoordScale() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < 4; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + for (u32 i = 0; i < tevStageNum; i += 2) { + J3DGDSetTevOrder( + GXTevStageID(i), + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i + 1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i + 1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} +void J3DTevBlock4::patch() { + patchTexNo(); + patchTevReg(); +} + +void J3DTevBlock16::patchTexNo() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock16::patchTevReg() { + GDSetCurrOffset(mTevRegOffset); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock16::patchTexNoAndTexCoordScale() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xffff) { + loadTexNo(i, mTexNo[i]); + } + } + + for (u32 i = 0; i < tevStageNum; i += 2) { + J3DGDSetTevOrder( + GXTevStageID(i), + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i].getTevOrderInfo().mColorChan), + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord), + GXTexMapID(mTevOrder[i + 1].getTevOrderInfo().mTexMap), + GXChannelID(mTevOrder[i + 1].getTevOrderInfo().mColorChan) + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock16::patch() { + patchTexNo(); + patchTevReg(); +} + +void J3DTevBlock::diff(u32 diffFlags) { + if (getDiffFlag_TexNoNum(diffFlags)) { + diffTexNo(); + } + + if (diffFlags & J3DDiffFlag_TexCoordScale) { + diffTexCoordScale(); + } + + if (getDiffFlag_TevStageNum(diffFlags)) { + diffTevStage(); + + if (diffFlags & J3DDiffFlag_TevStageIndirect) { + diffTevStageIndirect(); + } + } + + if (diffFlags & J3DDiffFlag_TevReg) { + diffTevReg(); + } +} + +void J3DTevBlockPatched::diffTexNo() { + for (u32 i = 0; i < ARRAY_SIZEU(mTexNo); i++) { + if (mTexNo[i] != 0xFFFF) { + loadTexNo(i, mTexNo[i]); + } + } +} + +void J3DTevBlockPatched::diffTevStage() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + } +} + +void J3DTevBlockPatched::diffTevStageIndirect() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mIndTevStage[i].load(i); + } +} + +void J3DTevBlockPatched::diffTevReg() { + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } +} + +void J3DTevBlockPatched::diffTexCoordScale() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i += 2) { + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } +} + +void J3DTevBlock1::diffTexNo() { + if (mTexNo[0] != 0xFFFF) { + loadTexNo(0, mTexNo[0]); + } +} + +void J3DTevBlock1::diffTevReg() {} + +void J3DTevBlock1::diffTevStage() { + mTevStage[0].load(0); +} + +void J3DTevBlock1::diffTevStageIndirect() { + mIndTevStage[0].load(0); +} + +void J3DTevBlock1::diffTexCoordScale() { + loadTexCoordScale( + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + J3DSys::sTexCoordScaleTable[mTevOrder[0].getTevOrderInfo().mTexMap & 7] + ); +} + +void J3DTevBlock2::diffTexNo() { + for (u32 i = 0; i < ARRAY_SIZEU(mTexNo); i++) { + if (mTexNo[i] != 0xFFFF) { + loadTexNo(i, mTexNo[i]); + } + } +} + +void J3DTevBlock2::diffTevReg() { + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } +} + +void J3DTevBlock2::diffTevStage() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + } +} + +void J3DTevBlock2::diffTevStageIndirect() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mIndTevStage[i].load(i); + } +} + +void J3DTevBlock2::diffTexCoordScale() { + loadTexCoordScale( + GXTexCoordID(mTevOrder[0].getTevOrderInfo().mTexCoord), + J3DSys::sTexCoordScaleTable[mTevOrder[0].getTevOrderInfo().mTexMap & 7] + ); + loadTexCoordScale( + GXTexCoordID(mTevOrder[1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[1].getTevOrderInfo().mTexMap & 7] + ); +} + +void J3DTevBlock4::diffTexNo() { + for (u32 i = 0; i < ARRAY_SIZEU(mTexNo); i++) { + if (mTexNo[i] != 0xFFFF) { + loadTexNo(i, mTexNo[i]); + } + } +} + +void J3DTevBlock4::diffTevReg() { + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } +} + +void J3DTevBlock4::diffTevStage() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + } +} + +void J3DTevBlock4::diffTevStageIndirect() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mIndTevStage[i].load(i); + } +} + +void J3DTevBlock4::diffTexCoordScale() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i += 2) { + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } +} +void J3DTevBlock16::diffTexNo() { + for (u32 i = 0; i < ARRAY_SIZEU(mTexNo); i++) { + if (mTexNo[i] != 0xFFFF) { + loadTexNo(i, mTexNo[i]); + } + } +} + +void J3DTevBlock16::diffTevReg() { + for (u32 i = 0; i < ARRAY_SIZEU(mTevColor) - 1; i++) { + loadTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < ARRAY_SIZEU(mTevKColor); i++) { + loadTevKColor(i, mTevKColor[i]); + } +} + +void J3DTevBlock16::diffTevStage() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mTevStage[i].load(i); + } +} + +void J3DTevBlock16::diffTevStageIndirect() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i++) { + mIndTevStage[i].load(i); + } +} + +void J3DTevBlock16::diffTexCoordScale() { + u32 tevStageNum = mTevStageNum; + for (u32 i = 0; i < tevStageNum; i += 2) { + loadTexCoordScale( + GXTexCoordID(mTevOrder[i].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo().mTexMap & 7] + ); + loadTexCoordScale( + GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo().mTexCoord & 7), + J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo().mTexMap & 7] + ); + } +} + +void J3DTevBlock16::ptrToIndex() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + u32 offs = 0; + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xFFFF) { + GDSetCurrOffset(mTexNoOffset + offs); + patchTexNo_PtrToIdx(i, mTexNo[i]); + + ResTIMG* img = j3dSys.getTexture()->getResTIMG(mTexNo[i]); + J3D_ASSERT_NULLPTR(2088, img != NULL); + + offs += 0x14; + if (img->indexTexture == 1) { + offs += 0x23; + } + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlockPatched::ptrToIndex() { + GDSetCurrOffset(mTexNoOffset); + void* start = GDGetCurrPointer(); + + u32 offs = 0; + for (u32 i = 0; i < 8; i++) { + if (mTexNo[i] != 0xFFFF) { + GDSetCurrOffset(mTexNoOffset + offs); + patchTexNo_PtrToIdx(i, mTexNo[i]); + + ResTIMG* img = j3dSys.getTexture()->getResTIMG(mTexNo[i]); + J3D_ASSERT_NULLPTR(2129, img != NULL); + + offs += 0x14; + if (img->indexTexture == 1) { + offs += 0x23; + } + } + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DTevBlock::indexToPtr_private(u32 offs) { + GDSetCurrOffset(offs); + void* start = GDGetCurrPointer(); + + for (u32 i = 0; ; i++) { + void* pDL = GDGetCurrPointer(); + if (!isTexNoReg(pDL)) { + break; + } + + u16 texNoReg = getTexNoReg(pDL); + loadTexNo(i, texNoReg); + } + + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DIndBlockFull::load() { + int indTexStageNum = mIndTexStageNum; + for (u32 i = 0; i < indTexStageNum; i++) { + mIndTexMtx[i].load(i); + } + + for (u32 i = 0; i < indTexStageNum; i += 2) { + J3DGDSetIndTexCoordScale( + GXIndTexStageID(i), + (GXIndTexScale)mIndTexCoordScale[i].getScaleS(), + (GXIndTexScale)mIndTexCoordScale[i].getScaleT(), + (GXIndTexScale)mIndTexCoordScale[i + 1].getScaleS(), + (GXIndTexScale)mIndTexCoordScale[i + 1].getScaleT() + ); + } + + loadTexCoordScale((GXTexCoordID)mIndTexOrder[0].getCoord(), J3DSys::sTexCoordScaleTable[mIndTexOrder[0].getMap() & 7]); + loadTexCoordScale((GXTexCoordID)mIndTexOrder[1].getCoord(), J3DSys::sTexCoordScaleTable[mIndTexOrder[1].getMap() & 7]); + loadTexCoordScale((GXTexCoordID)mIndTexOrder[2].getCoord(), J3DSys::sTexCoordScaleTable[mIndTexOrder[2].getMap() & 7]); + loadTexCoordScale((GXTexCoordID)mIndTexOrder[3].getCoord(), J3DSys::sTexCoordScaleTable[mIndTexOrder[3].getMap() & 7]); + + J3DGDSetIndTexOrder( + indTexStageNum, + (GXTexCoordID)mIndTexOrder[0].getCoord(), + (GXTexMapID)mIndTexOrder[0].getMap(), + (GXTexCoordID)mIndTexOrder[1].getCoord(), + (GXTexMapID)mIndTexOrder[1].getMap(), + (GXTexCoordID)mIndTexOrder[2].getCoord(), + (GXTexMapID)mIndTexOrder[2].getMap(), + (GXTexCoordID)mIndTexOrder[3].getCoord(), + (GXTexMapID)mIndTexOrder[3].getMap() + ); +} + +void J3DIndBlockFull::diff(u32 diffFlags) { + if (diffFlags & J3DDiffFlag_TevStageIndirect) { + u32 indTexStageNum = mIndTexStageNum; + mIndTexMtx[0].load(0); + + J3DGDSetIndTexCoordScale( + GX_INDTEXSTAGE0, + (GXIndTexScale)mIndTexCoordScale[0].getScaleS(), + (GXIndTexScale)mIndTexCoordScale[0].getScaleT(), + (GXIndTexScale)mIndTexCoordScale[1].getScaleS(), + (GXIndTexScale)mIndTexCoordScale[1].getScaleT() + ); + + loadTexCoordScale((GXTexCoordID)mIndTexOrder[0].getCoord(), J3DSys::sTexCoordScaleTable[mIndTexOrder[0].getMap() & 7]); + + J3DGDSetIndTexOrder( + indTexStageNum, + (GXTexCoordID)mIndTexOrder[0].getCoord(), + (GXTexMapID)mIndTexOrder[0].getMap(), + (GXTexCoordID)mIndTexOrder[1].getCoord(), + (GXTexMapID)mIndTexOrder[1].getMap(), + (GXTexCoordID)mIndTexOrder[2].getCoord(), + (GXTexMapID)mIndTexOrder[2].getMap(), + (GXTexCoordID)mIndTexOrder[3].getCoord(), + (GXTexMapID)mIndTexOrder[3].getMap() + ); + } +} + +void J3DPEBlockOpa::load() { + GDOverflowCheck(0x1e); + J3DGDSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); + J3DGDSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_COPY); + J3DGDSetZMode(1, GX_LEQUAL, 1); + J3DGDSetZCompLoc(1); +} + +void J3DPEBlockTexEdge::load() { + GDOverflowCheck(0x1e); + J3DGDSetAlphaCompare(GX_GEQUAL, 0x80, GX_AOP_AND, GX_LEQUAL, 0xff); + J3DGDSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_COPY); + J3DGDSetZMode(1, GX_LEQUAL, 1); + J3DGDSetZCompLoc(0); +} + +void J3DPEBlockXlu::load() { + GDOverflowCheck(0x1e); + J3DGDSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND,GX_ALWAYS, 0); + J3DGDSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_COPY); + J3DGDSetZMode(1, GX_LEQUAL, 0); + J3DGDSetZCompLoc(1); +} + +inline void loadZCompLoc(u8 compLoc) { + J3DGDSetZCompLoc(compLoc); +} + +void J3DPEBlockFogOff::load() { + GDOverflowCheck(0x1e); + mAlphaComp.load(); + mBlend.load(mDither); + mZMode.load(); + loadZCompLoc(mZCompLoc); +} + +void J3DPEBlockFogOff::diffBlend() { + GDOverflowCheck(0xf); + mBlend.load(mDither); + mZMode.load(); +} + +void J3DPEBlockFull::load() { + mFogOffset = GDGetCurrOffset(); + GDOverflowCheck(0x55); + mFog.load(); + mAlphaComp.load(); + mBlend.load(mDither); + mZMode.load(); + loadZCompLoc(mZCompLoc); +} + +void J3DPEBlockFull::patch() { + GDSetCurrOffset(mFogOffset); + GDOverflowCheck(0x37); + void* start = GDGetCurrPointer(); + mFog.load(); + void* end = GDGetCurrPointer(); + DCStoreRange(start, (uintptr_t)end - (uintptr_t)start); +} + +void J3DPEBlockFull::diffFog() { + GDOverflowCheck(0x37); + mFog.load(); +} + +void J3DPEBlockFull::diffBlend() { + GDOverflowCheck(0xf); + mBlend.load(mDither); + mZMode.load(); +} + +void J3DPEBlockFull::diff(u32 diffFlags) { + if ((diffFlags & J3DDiffFlag_Fog)) { + diffFog(); + } + + if ((diffFlags & J3DDiffFlag_Blend)) { + diffBlend(); + } +} + +void J3DColorBlockLightOff::reset(J3DColorBlock* pBlock) { + J3D_ASSERT_NULLPTR(2434, pBlock != NULL); + mColorChanNum = pBlock->getColorChanNum(); + + for (u32 i = 0; i < ARRAY_SIZEU(mMatColor); i++) { + mMatColor[i] = *pBlock->getMatColor(i); + } + for (u32 i = 0; i < ARRAY_SIZEU(mColorChan); i++) { + mColorChan[i] = *pBlock->getColorChan(i); + } +} + +void J3DColorBlockAmbientOn::reset(J3DColorBlock* pBlock) { + J3D_ASSERT_NULLPTR(2451, pBlock != NULL); + mColorChanNum = pBlock->getColorChanNum(); + + for (u32 i = 0; i < ARRAY_SIZEU(mMatColor); i++) { + mMatColor[i] = *pBlock->getMatColor(i); + } + for (u32 i = 0; i < ARRAY_SIZEU(mColorChan); i++) { + mColorChan[i] = *pBlock->getColorChan(i); + } + for (u32 i = 0; i < ARRAY_SIZEU(mAmbColor); i++) { + if (pBlock->getAmbColor(i) != NULL) { + mAmbColor[i] = *pBlock->getAmbColor(i); + } + } +} + +void J3DColorBlockLightOn::reset(J3DColorBlock* pBlock) { + J3D_ASSERT_NULLPTR(2476, pBlock != NULL); + mColorChanNum = pBlock->getColorChanNum(); + + for (u32 i = 0; i < ARRAY_SIZEU(mMatColor); i++) { + mMatColor[i] = *pBlock->getMatColor(i); + } + for (u32 i = 0; i < ARRAY_SIZEU(mColorChan); i++) { + mColorChan[i] = *pBlock->getColorChan(i); + } + for (u32 i = 0; i < ARRAY_SIZEU(mAmbColor); i++) { + if (pBlock->getAmbColor(i) != NULL) { + mAmbColor[i] = *pBlock->getAmbColor(i); + } + } +} + +void J3DTexGenBlockPatched::reset(J3DTexGenBlock* pBlock) { + J3D_ASSERT_NULLPTR(2504, pBlock != NULL); + + mTexGenNum = pBlock->getTexGenNum(); + for (u32 i = 0; i < 8; i++) { + mTexCoord[i] = *pBlock->getTexCoord(i); + } + + for (u32 i = 0; i < 8; i++) { + if (pBlock->getTexMtx(i) != NULL) { + if (mTexMtx[i] != NULL) { + memcpy(mTexMtx[i], pBlock->getTexMtx(i), sizeof(*mTexMtx[i])); + DCStoreRange(mTexMtx[i], sizeof(*mTexMtx[i])); + } else { + OSReport("Error : TexMtx[%d] is Null.\n", i); + } + } + } +} + +void J3DTexGenBlock4::reset(J3DTexGenBlock* pBlock) { + J3D_ASSERT_NULLPTR(2537, pBlock != NULL); + + mTexGenNum = pBlock->getTexGenNum(); + for (u32 i = 0; i < 4; i++) { + mTexCoord[i] = *pBlock->getTexCoord(i); + } + + for (u32 i = 0; i < 4; i++) { + if (pBlock->getTexMtx(i) != NULL) { + if (mTexMtx[i] != NULL) { + memcpy(mTexMtx[i], pBlock->getTexMtx(i), sizeof(*mTexMtx[i])); + DCStoreRange(mTexMtx[i], sizeof(*mTexMtx[i])); + } else { + OSReport("Error : TexMtx[%d] is Null.\n", i); + } + } + } + + mNBTScale = *pBlock->getNBTScale(); +} + +void J3DTexGenBlockBasic::reset(J3DTexGenBlock* pBlock) { + J3D_ASSERT_NULLPTR(2572, pBlock != NULL); + + mTexGenNum = pBlock->getTexGenNum(); + for (u32 i = 0; i < 8; i++) { + mTexCoord[i] = *pBlock->getTexCoord(i); + } + + for (u32 i = 0; i < 8; i++) { + if (pBlock->getTexMtx(i) != NULL) { + if (mTexMtx[i] != NULL) { + memcpy(mTexMtx[i], pBlock->getTexMtx(i), sizeof(*mTexMtx[i])); + DCStoreRange(mTexMtx[i], sizeof(*mTexMtx[i])); + } else { + OSReport("Error : TexMtx[%d] is Null.\n", i); + } + } + } + + mNBTScale = *pBlock->getNBTScale(); +} + +void J3DTevBlockPatched::reset(J3DTevBlock* pBlock) { + J3D_ASSERT_NULLPTR(2608, pBlock != NULL); + + mTevStageNum = pBlock->getTevStageNum(); + for (u32 i = 0; i < 8; i++) { + mTexNo[i] = pBlock->getTexNo(i); + } + for (u32 i = 0; i < 4; i++) { + mTevColor[i] = *pBlock->getTevColor(i); + } + for (u32 i = 0; i < 4; i++) { + mTevKColor[i] = *pBlock->getTevKColor(i); + } + for (u32 i = 0; i < 8; i++) { + mTevStage[i] = *pBlock->getTevStage(i); + mIndTevStage[i] = *pBlock->getIndTevStage(i); + } +} + +void J3DTevBlock1::reset(J3DTevBlock* pBlock) { + J3D_ASSERT_NULLPTR(2633, pBlock != NULL); + + mTexNo[0] = pBlock->getTexNo(0); + mTevOrder[0] = *pBlock->getTevOrder(0); + mTevStage[0] = *pBlock->getTevStage(0); + mIndTevStage[0] = *pBlock->getIndTevStage(0); +} + +void J3DTevBlock2::reset(J3DTevBlock* pBlock) { + J3D_ASSERT_NULLPTR(2649, pBlock != NULL); + + mTevStageNum = pBlock->getTevStageNum(); + mTexNo[0] = pBlock->getTexNo(0); + mTexNo[1] = pBlock->getTexNo(1); + mTevStage[0] = *pBlock->getTevStage(0); + mTevStage[1] = *pBlock->getTevStage(1); + mIndTevStage[0] = *pBlock->getIndTevStage(0); + mIndTevStage[1] = *pBlock->getIndTevStage(1); + mTevOrder[0] = *pBlock->getTevOrder(0); + mTevOrder[1] = *pBlock->getTevOrder(1); + mTevKColorSel[0] = pBlock->getTevKColorSel(0); + mTevKColorSel[1] = pBlock->getTevKColorSel(1); + mTevKAlphaSel[0] = pBlock->getTevKAlphaSel(0); + mTevKAlphaSel[1] = pBlock->getTevKAlphaSel(1); + + for (u32 i = 0; i < 4; i++) { + mTevColor[i] = *pBlock->getTevColor(i); + } + for (u32 i = 0; i < 4; i++) { + mTevKColor[i] = *pBlock->getTevKColor(i); + } + for (u32 i = 0; i < 4; i++) { + mTevSwapModeTable[i] = *pBlock->getTevSwapModeTable(i); + } +} + +void J3DTevBlock4::reset(J3DTevBlock* pBlock) { + J3D_ASSERT_NULLPTR(2682, pBlock != NULL); + + mTevStageNum = pBlock->getTevStageNum(); + mTexNo[0] = pBlock->getTexNo(0); + mTexNo[1] = pBlock->getTexNo(1); + mTexNo[2] = pBlock->getTexNo(2); + mTexNo[3] = pBlock->getTexNo(3); + mTevStage[0] = *pBlock->getTevStage(0); + mTevStage[1] = *pBlock->getTevStage(1); + mTevStage[2] = *pBlock->getTevStage(2); + mTevStage[3] = *pBlock->getTevStage(3); + mIndTevStage[0] = *pBlock->getIndTevStage(0); + mIndTevStage[1] = *pBlock->getIndTevStage(1); + mIndTevStage[2] = *pBlock->getIndTevStage(2); + mIndTevStage[3] = *pBlock->getIndTevStage(3); + mTevOrder[0] = *pBlock->getTevOrder(0); + mTevOrder[1] = *pBlock->getTevOrder(1); + mTevOrder[2] = *pBlock->getTevOrder(2); + mTevOrder[3] = *pBlock->getTevOrder(3); + mTevKColorSel[0] = pBlock->getTevKColorSel(0); + mTevKColorSel[1] = pBlock->getTevKColorSel(1); + mTevKColorSel[2] = pBlock->getTevKColorSel(2); + mTevKColorSel[3] = pBlock->getTevKColorSel(3); + mTevKAlphaSel[0] = pBlock->getTevKAlphaSel(0); + mTevKAlphaSel[1] = pBlock->getTevKAlphaSel(1); + mTevKAlphaSel[2] = pBlock->getTevKAlphaSel(2); + mTevKAlphaSel[3] = pBlock->getTevKAlphaSel(3); + + for (u32 i = 0; i < 4; i++) + mTevColor[i] = *pBlock->getTevColor(i); + for (u32 i = 0; i < 4; i++) + mTevKColor[i] = *pBlock->getTevKColor(i); + for (u32 i = 0; i < 4; i++) + mTevSwapModeTable[i] = *pBlock->getTevSwapModeTable(i); +} + +void J3DTevBlock16::reset(J3DTevBlock* pBlock) { + J3D_ASSERT_NULLPTR(2728, pBlock != NULL); + + mTevStageNum = pBlock->getTevStageNum(); + for (u32 i = 0; i < 8; i++) { + mTexNo[i] = pBlock->getTexNo(i); + } + for (u32 i = 0; i < 16; i++) { + mTevOrder[i] = *pBlock->getTevOrder(i); + } + for (u32 i = 0; i < 16; i++) { + mTevStage[i] = *pBlock->getTevStage(i); + mIndTevStage[i] = *pBlock->getIndTevStage(i); + } + for (u32 i = 0; i < 4; i++) { + mTevColor[i] = *pBlock->getTevColor(i); + } + for (u32 i = 0; i < 4; i++) { + mTevKColor[i] = *pBlock->getTevKColor(i); + } + for (u32 i = 0; i < 16; i++) { + mTevKColorSel[i] = pBlock->getTevKColorSel(i); + } + for (u32 i = 0; i < 16; i++) { + mTevKAlphaSel[i] = pBlock->getTevKAlphaSel(i); + } + for (u32 i = 0; i < 4; i++) { + mTevSwapModeTable[i] = *pBlock->getTevSwapModeTable(i); + } +} + +void J3DIndBlockFull::reset(J3DIndBlock* pBlock) { + J3D_ASSERT_NULLPTR(2762, pBlock != NULL); + + mIndTexStageNum = pBlock->getIndTexStageNum(); + for (u32 i = 0; i < 4; i++) { + mIndTexOrder[i] = *pBlock->getIndTexOrder(i); + } + for (u32 i = 0; i < 3; i++) { + mIndTexMtx[i] = *pBlock->getIndTexMtx(i); + } + for (u32 i = 0; i < 4; i++) { + mIndTexCoordScale[i] = *pBlock->getIndTexCoordScale(i); + } +} + +void J3DPEBlockFogOff::reset(J3DPEBlock* pBlock) { + J3D_ASSERT_NULLPTR(2783, pBlock != NULL); + + switch (pBlock->getType()) { + case 'PEFL': + case 'PEFG': + mAlphaComp = *pBlock->getAlphaComp(); + mBlend = *pBlock->getBlend(); + mZMode = *pBlock->getZMode(); + mZCompLoc = pBlock->getZCompLoc(); + break; + } +} + +void J3DPEBlockFull::reset(J3DPEBlock* pBlock) { + J3D_ASSERT_NULLPTR(2807, pBlock != NULL); + + if (pBlock->getFog() != NULL) { + mFog.setFogInfo(pBlock->getFog()->getFogInfo()); + } + + switch (pBlock->getType()) { + case 'PEFL': + case 'PEFG': + mAlphaComp = *pBlock->getAlphaComp(); + mBlend = *pBlock->getBlend(); + mZMode = *pBlock->getZMode(); + mZCompLoc = pBlock->getZCompLoc(); + break; + } +} + +void J3DTexGenBlockPatched::calc(const Mtx modelMtx) { + Mtx viewMtx; + for (int i = 0; i < 8; i++) { + if (mTexMtx[i] != NULL) { + u32 texMtxMode = mTexMtx[i]->getTexMtxInfo().mInfo & 0x3f; + mTexCoord[i].resetTexMtxReg(); + switch (texMtxMode) { + case J3DTexMtxMode_EnvmapBasic: + case J3DTexMtxMode_EnvmapOld: + case J3DTexMtxMode_Envmap: + + if (j3dSys.checkFlag(8) == 0) { + MTXConcat(j3dSys.getViewMtx(), modelMtx, viewMtx); + } else { + MTXCopy(j3dSys.getViewMtx(), viewMtx); + } + viewMtx[0][3] = 0.0f; + viewMtx[1][3] = 0.0f; + viewMtx[2][3] = 0.0f; + mTexMtx[i]->calc(viewMtx); + break; + case J3DTexMtxMode_ProjmapBasic: + case J3DTexMtxMode_Projmap: + if (j3dSys.checkFlag(4) == 0) { + mTexMtx[i]->calc(modelMtx); + } else { + mTexMtx[i]->calc(j3dDefaultMtx); + } + break; + case J3DTexMtxMode_ViewProjmapBasic: + case J3DTexMtxMode_ViewProjmap: + if (j3dSys.checkFlag(4) == 0) { + MTXConcat(j3dSys.getViewMtx(), modelMtx, viewMtx); + mTexMtx[i]->calc( viewMtx); + } else { + mTexMtx[i]->calc(j3dSys.getViewMtx()); + } + break; + case J3DTexMtxMode_Unknown5: + case J3DTexMtxMode_EnvmapOldEffectMtx: + case J3DTexMtxMode_EnvmapEffectMtx: + if (j3dSys.checkFlag(8) == 0) { + MTXCopy(modelMtx, viewMtx); + viewMtx[0][3] = 0.0f; + viewMtx[1][3] = 0.0f; + viewMtx[2][3] = 0.0f; + mTexMtx[i]->calc(viewMtx); + } else { + mTexMtx[i]->calc(j3dDefaultMtx); + } + break; + default: + mTexMtx[i]->calc(j3dDefaultMtx); + break; + } + } + } +} + +void J3DTexGenBlockPatched::calcWithoutViewMtx(const Mtx modelMtx) { + Mtx mtx; + for (int i = 0; i < 8; i++) { + if (mTexMtx[i] != NULL) { + u32 texMtxMode = mTexMtx[i]->getTexMtxInfo().mInfo & 0x3f; + mTexCoord[i].resetTexMtxReg(); + switch (texMtxMode) { + case J3DTexMtxMode_EnvmapBasic: + case J3DTexMtxMode_EnvmapOld: + case J3DTexMtxMode_Envmap: + mTexMtx[i]->calc(j3dDefaultMtx); + break; + case J3DTexMtxMode_ProjmapBasic: + case J3DTexMtxMode_Projmap: + if (j3dSys.checkFlag(4) == 0) { + mTexMtx[i]->calc(modelMtx); + } else { + mTexMtx[i]->calc(j3dDefaultMtx); + } + break; + case J3DTexMtxMode_ViewProjmapBasic: + case J3DTexMtxMode_ViewProjmap: + mTexMtx[i]->calc(j3dDefaultMtx); + break; + case J3DTexMtxMode_Unknown5: + case J3DTexMtxMode_EnvmapOldEffectMtx: + case J3DTexMtxMode_EnvmapEffectMtx: + if (j3dSys.checkFlag(8) == 0) { + MTXCopy(modelMtx, mtx); + mtx[0][3] = 0.0f; + mtx[1][3] = 0.0f; + mtx[2][3] = 0.0f; + mTexMtx[i]->calc(mtx); + } else { + mTexMtx[i]->calc(j3dDefaultMtx); + } + break; + default: + mTexMtx[i]->calc(j3dDefaultMtx); + break; + } + } + } +} + +void J3DTexGenBlockPatched::calcPostTexMtx(const Mtx modelMtx) { + Mtx mtx1, mtx2; + for (int i = 0; i < 8; i++) { + if (mTexMtx[i] != NULL) { + u32 texMtxMode = mTexMtx[i]->getTexMtxInfo().mInfo & 0x3f; + mTexCoord[i].resetTexMtxReg(); + switch (texMtxMode) { + case J3DTexMtxMode_EnvmapBasic: + case J3DTexMtxMode_EnvmapOld: + case J3DTexMtxMode_Envmap: + mTexCoord[i].setTexMtxReg(30); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + case J3DTexMtxMode_ProjmapBasic: + case J3DTexMtxMode_Projmap: + PSMTXInverse(j3dSys.getViewMtx(), mtx1); + mTexCoord[i].setTexMtxReg(0); + mTexMtx[i]->calcPostTexMtx(mtx1); + break; + case J3DTexMtxMode_ViewProjmapBasic: + case J3DTexMtxMode_ViewProjmap: + mTexCoord[i].setTexMtxReg(0); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + case J3DTexMtxMode_Unknown5: + case J3DTexMtxMode_EnvmapOldEffectMtx: + case J3DTexMtxMode_EnvmapEffectMtx: + PSMTXInverse(j3dSys.getViewMtx(), mtx2); + mtx2[0][3] = 0.0f; + mtx2[1][3] = 0.0f; + mtx2[2][3] = 0.0f; + mTexCoord[i].setTexMtxReg(30); + mTexMtx[i]->calcPostTexMtx(mtx2); + break; + default: + mTexCoord[i].setTexMtxReg(60); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + continue; + } + } + } +} + +void J3DTexGenBlockPatched::calcPostTexMtxWithoutViewMtx(f32 const (*param_0)[4]) { + for (int i = 0; i < 8; i++) { + if (mTexMtx[i] != NULL) { + int texMtxMode = mTexMtx[i]->getTexMtxInfo().mInfo & 0x3f; + mTexCoord[i].resetTexMtxReg(); + switch (texMtxMode) { + case J3DTexMtxMode_EnvmapBasic: + case J3DTexMtxMode_EnvmapOld: + case J3DTexMtxMode_Envmap: + mTexCoord[i].setTexMtxReg(30); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + case J3DTexMtxMode_ProjmapBasic: + case J3DTexMtxMode_Projmap: + mTexCoord[i].setTexMtxReg(0); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + case J3DTexMtxMode_ViewProjmapBasic: + case J3DTexMtxMode_ViewProjmap: + mTexCoord[i].setTexMtxReg(0); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + case J3DTexMtxMode_Unknown5: + case J3DTexMtxMode_EnvmapOldEffectMtx: + case J3DTexMtxMode_EnvmapEffectMtx: + mTexCoord[i].setTexMtxReg(30); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + default: + mTexCoord[i].setTexMtxReg(60); + mTexMtx[i]->calcPostTexMtx(j3dDefaultMtx); + break; + } + } + } +} |
