diff --git a/include/JSystem/J2DGraph/J2DMatBlock.h b/include/JSystem/J2DGraph/J2DMatBlock.h index 1a036dc072e..5473a3a0c12 100644 --- a/include/JSystem/J2DGraph/J2DMatBlock.h +++ b/include/JSystem/J2DGraph/J2DMatBlock.h @@ -16,6 +16,16 @@ struct ResTLUT; struct J2DGXColorS10 : public GXColorS10 { /* 802F1B90 */ J2DGXColorS10(); + + /* + J2DGXColorS10& operator=(const GXColorS10& other) { + r = other.r; + g = other.g; + b = other.b; + a = other.a; + return *this; + } + */ }; struct J2DTevSwapModeInfo; diff --git a/include/JSystem/J2DGraph/J2DTevs.h b/include/JSystem/J2DGraph/J2DTevs.h index 6a561e95570..1fdcc0c0f9f 100644 --- a/include/JSystem/J2DGraph/J2DTevs.h +++ b/include/JSystem/J2DGraph/J2DTevs.h @@ -124,11 +124,31 @@ private: /* 0x0 */ J2DIndTexCoordScaleInfo mInfo; }; // Size: 0x2 +struct J2DIndTevStageInfo { + /* 0x0 */ u8 field_0x0; + /* 0x1 */ u8 field_0x1; + /* 0x2 */ u8 field_0x2; + /* 0x3 */ u8 field_0x3; + /* 0x4 */ u8 field_0x4; + /* 0x5 */ u8 field_0x5; + /* 0x6 */ u8 field_0x6; + /* 0x7 */ u8 field_0x7; + /* 0x8 */ int field_0x8; +}; + +inline u32 J2DCalcIndTevStage(J2DIndTevStageInfo info) { + return (info.field_0x8 << 22) | (info.field_0x7 << 21) | (info.field_0x6 << 20) | + (info.field_0x3 << 16) | (info.field_0x5 << 11) | (info.field_0x4 << 8) | + (info.field_0x2 << 4) | (info.field_0x1 << 2) | info.field_0x0; +} + class J2DIndTevStage { public: /* 802EA044 */ void load(u8); /* 802F18A0 */ J2DIndTevStage(); + void setIndTevStageInfo(const J2DIndTevStageInfo& info) { mFlags = J2DCalcIndTevStage(info); } + private: /* 0x0 */ u32 mFlags; @@ -143,24 +163,6 @@ private: GXIndTexAlphaSel getAlphaSel() const { return (GXIndTexAlphaSel)((mFlags >> 22) & 0x03); } }; -struct J2DIndTevStageInfo { - /* 0x0 */ u8 field_0x0; - /* 0x1 */ u8 field_0x1; - /* 0x2 */ u8 field_0x2; - /* 0x3 */ u8 field_0x3; - /* 0x4 */ u8 field_0x4; - /* 0x5 */ u8 field_0x5; - /* 0x6 */ u8 field_0x6; - /* 0x7 */ u8 field_0x7; - /* 0x8 */ int field_0x8; -}; - -inline u32 J2DCalcIndTevStage(J2DIndTevStageInfo info) { - return (info.field_0x8 << 22) | (info.field_0x7 << 21) | (info.field_0x6 << 20) | - (info.field_0x3 << 16) | (info.field_0x5 << 11) | (info.field_0x4 << 8) | - (info.field_0x2 << 4) | (info.field_0x1 << 2) | info.field_0x0; -} - struct J2DTexCoordInfo { /* 0x0 */ u8 mTexGenType; /* 0x1 */ u8 mTexGenSrc; @@ -191,18 +193,26 @@ struct J2DTevOrderInfo { /* 0x0 */ u8 mTexCoord; /* 0x1 */ u8 mTexMap; /* 0x2 */ u8 mColor; + /* 0x3 */ u8 field_0x3; + + J2DTevOrderInfo& operator=(const J2DTevOrderInfo& other) { + mTexCoord = other.mTexCoord; + mTexMap = other.mTexMap; + mColor = other.mColor; + return *this; + } }; class J2DTevOrder { public: /* 802F1B70 */ J2DTevOrder(); + void setTevOrderInfo(const J2DTevOrderInfo& info) {mTevOrderInfo = info; } GXChannelID getColor() const { return (GXChannelID)mTevOrderInfo.mColor; } GXTexMapID getTexMap() const { return (GXTexMapID)mTevOrderInfo.mTexMap; } GXTexCoordID getTexCoord() const { return (GXTexCoordID)mTevOrderInfo.mTexCoord; } /* 0x0 */ J2DTevOrderInfo mTevOrderInfo; - /* 0x4 */ u8 field_0x4; }; struct J2DTevStageInfo { @@ -240,6 +250,11 @@ public: /* 802F1940 */ J2DTevStage(); /* 802F19A8 */ void setTevStageInfo(J2DTevStageInfo const&); + void setStageNo(u32 param_0) { + field_0x0 = (param_0 << 1) - 0x40; + field_0x4 = (param_0 << 1) - 0x3f; + } + void setTevSwapModeInfo(const J2DTevSwapModeInfo& swapInfo) { setTexSel(swapInfo.field_0x1); setRasSel(swapInfo.field_0x0); @@ -358,10 +373,24 @@ private: /* 0x7 */ u8 field_0x7; }; +struct J2DTevSwapModeTableInfo { + /* 0x0 */ u8 field_0x0; + /* 0x1 */ u8 field_0x1; + /* 0x2 */ u8 field_0x2; + /* 0x3 */ u8 field_0x3; +}; + +inline u8 J2DCalcTevSwapTable(u8 param_0, u8 param_1, u8 param_2, u8 param_3) { + return (param_0 << 6) + (param_1 << 4) + (param_2 << 2) + param_3; +} + class J2DTevSwapModeTable { public: /* 802F1934 */ J2DTevSwapModeTable(); + void setTevSwapModeTableInfo(const J2DTevSwapModeTableInfo& info) { + field_0x0 = J2DCalcTevSwapTable(info.field_0x0, info.field_0x1, info.field_0x2, info.field_0x3); + } u8 getR() { return field_0x0 >> 6 & 3; } u8 getG() { return field_0x0 >> 4 & 3; } u8 getB() { return field_0x0 >> 2 & 3; } diff --git a/libs/JSystem/J2DGraph/J2DMatBlock.cpp b/libs/JSystem/J2DGraph/J2DMatBlock.cpp index d0f8659164e..ffe89176334 100644 --- a/libs/JSystem/J2DGraph/J2DMatBlock.cpp +++ b/libs/JSystem/J2DGraph/J2DMatBlock.cpp @@ -358,11 +358,11 @@ extern "C" extern void* __vt__11J2DIndBlock[14]; extern "C" extern GXColor j2dDefaultColInfo; extern "C" extern J2DTevOrderInfo j2dDefaultTevOrderInfoNull; extern "C" extern u16 j2dDefaultIndTexOrderNull[1 + 1 /* padding */]; -extern "C" extern u8 j2dDefaultTevColor[8]; +extern "C" extern J2DGXColorS10 j2dDefaultTevColor; extern "C" extern u8 j2dDefaultIndTexCoordScaleInfo[2 + 2 /* padding */]; -extern "C" extern u32 j2dDefaultTevKColor; +extern "C" extern GXColor j2dDefaultTevKColor; extern "C" extern J2DTevSwapModeInfo j2dDefaultTevSwapMode; -extern "C" extern u32 j2dDefaultTevSwapModeTable; +extern "C" extern J2DTevSwapModeTableInfo j2dDefaultTevSwapModeTable; extern "C" extern u8 data_804561A4; extern "C" extern J2DColorChanInfo j2dDefaultColorChanInfo; extern "C" extern u8 data_804561AC; @@ -771,6 +771,29 @@ J2DTevBlock1::~J2DTevBlock1() { } /* 802EBA50-802EBC0C 2E6390 01BC+00 1/0 0/0 0/0 .text initialize__12J2DTevBlock1Fv */ +// inlines +#ifdef NONMATCHING +void J2DTevBlock1::initialize() { + mTexNo[0] = -1; + mFontNo = -1; + mTevOrder[0].setTevOrderInfo(j2dDefaultTevOrderInfoNull); + for (int i = 0; i < 4; i++) { + mTevColor[i] = j2dDefaultTevColor; + } + mTevStage[0].setStageNo(0); + for (int i = 0; i < 4; i++) { + mTevKColor[i] = j2dDefaultTevKColor; + } + mTevKColorSel[0] = -1; + mTevKAlphaSel[0] = -1; + for (int i = 0; i < 4; i++) { + mTevSwapModeTable[i].setTevSwapModeTableInfo(j2dDefaultTevSwapModeTable); + } + mIndTevStage[0].setIndTevStageInfo(j2dDefaultIndTevStageInfo); + mPalette[0] = NULL; + mFont = NULL; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -780,6 +803,7 @@ extern "C" asm void initialize__12J2DTevBlock1Fv() { #include "asm/JSystem/J2DGraph/J2DMatBlock/initialize__12J2DTevBlock1Fv.s" } #pragma pop +#endif /* 802EBC0C-802EBCC0 2E654C 00B4+00 1/0 0/0 0/0 .text prepareTexture__12J2DTevBlock1FUc */ @@ -1526,6 +1550,42 @@ J2DTevBlock4::~J2DTevBlock4() { } /* 802EDAC4-802EDD34 2E8404 0270+00 1/0 0/0 0/0 .text initialize__12J2DTevBlock4Fv */ +// inlines +#ifdef NONMATCHING +void J2DTevBlock4::initialize() { + for (int i = 0; i < 4; i++) { + mTexNo[i] = -1; + } + mFontNo = -1; + for (int i = 0; i < 4; i++) { + mTevOrder[i].setTevOrderInfo(j2dDefaultTevOrderInfoNull); + } + for (int i = 0; i < 4; i++) { + mTevColor[i] = j2dDefaultTevColor; + } + mTevStageNum = 1; + for (int i = 0; i < 4; i++) { + mTevStage[i].setStageNo(i); + } + for (int i = 0; i < 4; i++) { + mTevKColor[i] = j2dDefaultTevKColor; + } + for (int i = 0; i < 4; i++) { + mTevKColorSel[i] = -1; + mTevKAlphaSel[i] = -1; + } + for (int i = 0; i < 4; i++) { + mTevSwapModeTable[i].setTevSwapModeTableInfo(j2dDefaultTevSwapModeTable); + } + for (int i = 0; i < 4; i++) { + mIndTevStage[i].setIndTevStageInfo(j2dDefaultIndTevStageInfo); + } + for (int i = 0; i < 4; i++) { + mPalette[i] = NULL; + } + mFont = NULL; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1535,6 +1595,7 @@ extern "C" asm void initialize__12J2DTevBlock4Fv() { #include "asm/JSystem/J2DGraph/J2DMatBlock/initialize__12J2DTevBlock4Fv.s" } #pragma pop +#endif /* 802EDD34-802EDE04 2E8674 00D0+00 1/0 0/0 0/0 .text prepareTexture__12J2DTevBlock4FUc */