summaryrefslogtreecommitdiff
path: root/src/JSystem/J3DGraphBase/J3DMatBlock.cpp
diff options
context:
space:
mode:
authorJcw87 <Jcw87@users.noreply.github.com>2023-09-26 22:00:39 -0700
committerGitHub <noreply@github.com>2023-09-27 01:00:39 -0400
commit4ed4bf3bff73b461814dddf5cf2c1984a9e19eb3 (patch)
treef2eb9a6742ecffd5bbc1372fd9bbcde7b5f2f8f5 /src/JSystem/J3DGraphBase/J3DMatBlock.cpp
parent31857a4976a74e80611b02201b19accb6963df4b (diff)
J3DMatBlock (#85)
Diffstat (limited to 'src/JSystem/J3DGraphBase/J3DMatBlock.cpp')
-rw-r--r--src/JSystem/J3DGraphBase/J3DMatBlock.cpp286
1 files changed, 245 insertions, 41 deletions
diff --git a/src/JSystem/J3DGraphBase/J3DMatBlock.cpp b/src/JSystem/J3DGraphBase/J3DMatBlock.cpp
index b8481e2b..26137a80 100644
--- a/src/JSystem/J3DGraphBase/J3DMatBlock.cpp
+++ b/src/JSystem/J3DGraphBase/J3DMatBlock.cpp
@@ -6,6 +6,8 @@
#include "JSystem/J3DGraphBase/J3DTexture.h"
#include "JSystem/J3DGraphBase/J3DTransform.h"
#include "JSystem/J3DGraphBase/J3DMatBlock.h"
+#include "JSystem/J3DGraphBase/J3DSys.h"
+#include "JSystem/J3DGraphBase/J3DTevs.h"
#include "dolphin/gd/GDBase.h"
#include "dolphin/os/OSCache.h"
#include "dolphin/types.h"
@@ -30,6 +32,30 @@ static int SizeOfJ3DColorBlockLightOffLoad = SizeOfLoadMatColors + SizeOfLoadCol
static int SizeOfJ3DColorBlockAmbientOnLoad =
SizeOfLoadMatColors + SizeOfLoadAmbColors + SizeOfLoadColorChans;
+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 param_1, const J3DGXColorS10& color) {
+ J3DGDSetTevColorS10(GXTevRegID(param_1 + 1), color);
+}
+
+inline void loadTevKColor(u32 param_1, const J3DGXColor& color) {
+ J3DGDSetTevKColor(GXTevKColorID(param_1), color);
+}
+
/* 802DF794-802DF7E4 .text initialize__21J3DColorBlockLightOffFv */
void J3DColorBlockLightOff::initialize() {
mColorChanNum = 0;
@@ -307,11 +333,9 @@ s32 J3DPEBlockFull::countDLSize() {
/* 802DFED8-802E0438 .text load__21J3DColorBlockLightOffFv */
void J3DColorBlockLightOff::load() {
GDOverflowCheck(SizeOfJ3DColorBlockLightOffLoad);
- mMatColorOffset = GDGetGDLObjOffset(__GDCurrentDL);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
- mColorChanOffset = GDGetGDLObjOffset(__GDCurrentDL);
+ mMatColorOffset = GDGetCurrOffset();
+ loadMatColors((J3DGXColor*)mMatColor);
+ mColorChanOffset = GDGetCurrOffset();
J3DGDWriteXFCmdHdr(0x100E, 4);
/* Nonmatching */
}
@@ -319,14 +343,10 @@ void J3DColorBlockLightOff::load() {
/* 802E0438-802E0AC0 .text load__22J3DColorBlockAmbientOnFv */
void J3DColorBlockAmbientOn::load() {
GDOverflowCheck(SizeOfJ3DColorBlockAmbientOnLoad);
- mMatColorOffset = GDGetGDLObjOffset(__GDCurrentDL);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
- J3DGDWriteXFCmdHdr(0x100A, 2);
- J3DGDWrite_u32(*(u32*)(&mAmbColor[0]));
- J3DGDWrite_u32(*(u32*)(&mAmbColor[1]));
- mColorChanOffset = GDGetGDLObjOffset(__GDCurrentDL);
+ mMatColorOffset = GDGetCurrOffset();
+ loadMatColors((J3DGXColor*)mMatColor);
+ loadAmbColors((J3DGXColor*)mAmbColor);
+ mColorChanOffset = GDGetCurrOffset();
J3DGDWriteXFCmdHdr(0x100E, 4);
/* Nonmatching */
}
@@ -334,16 +354,17 @@ void J3DColorBlockAmbientOn::load() {
/* 802E0AC0-802E1180 .text load__20J3DColorBlockLightOnFv */
void J3DColorBlockLightOn::load() {
GDOverflowCheck(SizeOfJ3DColorBlockAmbientOnLoad);
- mMatColorOffset = GDGetGDLObjOffset(__GDCurrentDL);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
- J3DGDWriteXFCmdHdr(0x100A, 2);
- J3DGDWrite_u32(*(u32*)(&mAmbColor[0]));
- J3DGDWrite_u32(*(u32*)(&mAmbColor[1]));
- mColorChanOffset = GDGetGDLObjOffset(__GDCurrentDL);
+ mMatColorOffset = GDGetCurrOffset();
+ loadMatColors((J3DGXColor*)mMatColor);
+ loadAmbColors((J3DGXColor*)mAmbColor);
+ mColorChanOffset = GDGetCurrOffset();
J3DGDWriteXFCmdHdr(0x100E, 4);
/* Nonmatching */
+ for (u32 i = 0; i < 8; i++) {
+ if (mLight[i]) {
+ mLight[i]->load(i);
+ }
+ }
}
/* 802E1180-802E11CC .text patch__21J3DColorBlockLightOffFv */
@@ -357,16 +378,20 @@ void J3DColorBlockLightOff::patchMatColor() {
GDSetCurrOffset(mMatColorOffset);
u8* start = GDGetCurrPointer();
GDOverflowCheck(SizeOfLoadMatColors);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
+ loadMatColors((J3DGXColor*)mMatColor);
u8* end = GDGetCurrPointer();
- DCFlushRange(start, (u32)(end - start));
+ DCFlushRange(start, end - start);
}
/* 802E1378-802E17B4 .text patchLight__21J3DColorBlockLightOffFv */
void J3DColorBlockLightOff::patchLight() {
+ GDSetCurrOffset(mColorChanOffset);
+ u8* start = GDGetCurrPointer();
+ GDOverflowCheck(SizeOfLoadColorChans);
+ J3DGDWriteXFCmdHdr(0x100E, 4);
/* Nonmatching */
+ u8* end = GDGetCurrPointer();
+ DCFlushRange(start, end - start);
}
/* 802E17B4-802E1800 .text patch__20J3DColorBlockLightOnFv */
@@ -380,16 +405,26 @@ void J3DColorBlockLightOn::patchMatColor() {
GDSetCurrOffset(mMatColorOffset);
u8* start = GDGetCurrPointer();
GDOverflowCheck(SizeOfLoadMatColors);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
+ loadMatColors((J3DGXColor*)mMatColor);
u8* end = GDGetCurrPointer();
- DCFlushRange(start, (u32)(end - start));
+ DCFlushRange(start, end - start);
}
/* 802E19AC-802E1E18 .text patchLight__20J3DColorBlockLightOnFv */
void J3DColorBlockLightOn::patchLight() {
/* Nonmatching */
+ GDSetCurrOffset(mColorChanOffset);
+ u8* start = GDGetCurrPointer();
+ GDOverflowCheck(SizeOfLoadColorChans);
+ J3DGDWriteXFCmdHdr(0x100E, 4);
+ /* Nonmatching */
+ for (u32 i = 0; i < 8; i++) {
+ if (mLight[i]) {
+ mLight[i]->load(i);
+ }
+ }
+ u8* end = GDGetCurrPointer();
+ DCFlushRange(start, end - start);
}
/* 802E1E18-802E1E80 .text diff__21J3DColorBlockLightOffFUl */
@@ -403,13 +438,13 @@ void J3DColorBlockLightOff::diff(u32 flag) {
/* 802E1E80-802E1FFC .text diffMatColor__21J3DColorBlockLightOffFv */
void J3DColorBlockLightOff::diffMatColor() {
GDOverflowCheck(SizeOfLoadMatColors);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
+ loadMatColors((J3DGXColor*)mMatColor);
}
/* 802E1FFC-802E2408 .text diffLight__21J3DColorBlockLightOffFv */
void J3DColorBlockLightOff::diffLight() {
+ GDOverflowCheck(SizeOfLoadColorChans);
+ J3DGDWriteXFCmdHdr(0x100E, 4);
/* Nonmatching */
}
@@ -424,9 +459,7 @@ void J3DColorBlockLightOn::diff(u32 flag) {
/* 802E2478-802E25F4 .text diffMatColor__20J3DColorBlockLightOnFv */
void J3DColorBlockLightOn::diffMatColor() {
GDOverflowCheck(SizeOfLoadMatColors);
- J3DGDWriteXFCmdHdr(0x100C, 2);
- J3DGDWrite_u32(*(u32*)(&mMatColor[0]));
- J3DGDWrite_u32(*(u32*)(&mMatColor[1]));
+ loadMatColors((J3DGXColor*)mMatColor);
}
/* 802E25F4-802E2A38 .text diffLight__20J3DColorBlockLightOnFv */
@@ -436,27 +469,67 @@ void J3DColorBlockLightOn::diffLight() {
/* 802E2A38-802E2ACC .text load__15J3DTexGenBlock4Fv */
void J3DTexGenBlock4::load() {
- /* Nonmatching */
+ 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);
+ }
}
/* 802E2ACC-802E2B60 .text load__19J3DTexGenBlockBasicFv */
void J3DTexGenBlockBasic::load() {
- /* Nonmatching */
+ 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);
+ }
}
/* 802E2B60-802E2BF0 .text patch__21J3DTexGenBlockPatchedFv */
void J3DTexGenBlockPatched::patch() {
- /* Nonmatching */
+ GDSetCurrOffset(mTexMtxOffset);
+ u8* start = GDGetCurrPointer();
+ for (u32 i = 0; i < 8; i++) {
+ if (mTexMtx[i]) {
+ mTexMtx[i]->load(i);
+ }
+ }
+ u8* end = GDGetCurrPointer();
+ DCFlushRange(start, end - start);
}
/* 802E2BF0-802E2C8C .text patch__15J3DTexGenBlock4Fv */
void J3DTexGenBlock4::patch() {
- /* Nonmatching */
+ GDSetCurrOffset(mTexMtxOffset);
+ u8* start = GDGetCurrPointer();
+ for (u32 i = 0; i < 4; i++) {
+ if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) {
+ mTexMtx[i]->load(i);
+ }
+ }
+ u8* end = GDGetCurrPointer();
+ DCFlushRange(start, end - start);
}
/* 802E2C8C-802E2D28 .text patch__19J3DTexGenBlockBasicFv */
void J3DTexGenBlockBasic::patch() {
- /* Nonmatching */
+ GDSetCurrOffset(mTexMtxOffset);
+ u8* start = GDGetCurrPointer();
+ for (u32 i = 0; i < 8; i++) {
+ if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) {
+ mTexMtx[i]->load(i);
+ }
+ }
+ u8* end = GDGetCurrPointer();
+ DCFlushRange(start, end - start);
}
/* 802E2D28-802E2D90 .text diff__21J3DTexGenBlockPatchedFUl */
@@ -491,17 +564,148 @@ void J3DTexGenBlockPatched::diffTexGen() {
/* 802E2ED0-802E3110 .text load__12J3DTevBlock1Fv */
void J3DTevBlock1::load() {
- /* Nonmatching */
+ 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);
}
/* 802E3110-802E362C .text load__12J3DTevBlock2Fv */
void J3DTevBlock2::load() {
/* Nonmatching */
+ u8 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),
+ J3DSys::sTexCoordScaleTable[mTevOrder[1].getTevOrderInfo()->mTexMap & 7]
+ );
+ mTevRegOffset = GDGetCurrOffset();
+ for (u32 i = 0; i < 3; i++) {
+ loadTevColor(i, ((J3DGXColorS10*)mTevColor)[i]);
+ }
+ for (u32 i = 0; i < 4; i++) {
+ loadTevKColor(i, ((J3DGXColor*)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())
+ );
+ }
}
/* 802E362C-802E3B70 .text load__12J3DTevBlock4Fv */
void J3DTevBlock4::load() {
/* Nonmatching */
+ u8 tevStageNum = mTevStageNum;
+ mTexNoOffset = GDGetCurrOffset();
+ for (u32 i = 0; i < 4; i++) {
+ if (mTexNo[i] != 0xffff) {
+ loadTexNo(i, mTexNo[i]);
+ }
+ }
+ for (u32 i = 0; i < mTevStageNum; i += 2) {
+ J3DGDSetTevOrder(
+ GX_TEVSTAGE0,
+ 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),
+ J3DSys::sTexCoordScaleTable[mTevOrder[i].getTevOrderInfo()->mTexMap & 7]
+ );
+ loadTexCoordScale(
+ GXTexCoordID(mTevOrder[i + 1].getTevOrderInfo()->mTexCoord),
+ J3DSys::sTexCoordScaleTable[mTevOrder[i + 1].getTevOrderInfo()->mTexMap & 7]
+ );
+ }
+ mTevRegOffset = GDGetCurrOffset();
+ for (u32 i = 0; i < 3; i++) {
+ loadTevColor(i, ((J3DGXColorS10*)mTevColor)[i]);
+ }
+ for (u32 i = 0; i < 4; i++) {
+ loadTevKColor(i, ((J3DGXColor*)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())
+ );
+ }
}
/* 802E3B70-802E40B8 .text load__13J3DTevBlock16Fv */