From c0dfac79f7e054f2a6dd09563d27d3530c43e4d5 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 16 Mar 2025 23:30:51 +0100 Subject: [PATCH] PostEffectMask OK --- config/SOUE01/splits.txt | 2 + config/SOUE01/symbols.txt | 8 +-- configure.py | 2 +- include/egg/gfx/eggDrawGX.h | 10 ++-- include/egg/gfx/eggPostEffectMask.h | 26 ++++++++- src/egg/gfx/eggFog.cpp | 2 +- src/egg/gfx/eggPostEffectMask.cpp | 89 ++++++++++++++++++++++++++++- 7 files changed, 126 insertions(+), 13 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 28f699b9..cb0f5cb8 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -2282,6 +2282,8 @@ egg/gfx/eggPostEffectUnk2.cpp: egg/gfx/eggPostEffectMask.cpp: .text start:0x804B0AB0 end:0x804B0F60 + .data start:0x8056F1D0 end:0x8056F1F0 + .sdata2 start:0x8057F7C8 end:0x8057F7D0 egg/gfx/eggPostEffectMaskDOF.cpp: .text start:0x804B0F60 end:0x804B1BE8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 96287d5a..6beb34a5 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -26485,7 +26485,7 @@ scnProcDraw__Q23EGG12DrawPathBaseFUs = .text:0x804A0E60; // type:function size:0 @8@__dt__Q23EGG12DrawPathBaseFv = .text:0x804A0E80; // type:function size:0x8 @20@__dt__Q23EGG12DrawPathBaseFv = .text:0x804A0E90; // type:function size:0x8 FUN_804a0ea0 = .text:0x804A0EA0; // type:function size:0x188 -FUN_804a1030 = .text:0x804A1030; // type:function size:0x40 +__dt__Q23EGG14PostEffectMaskFv = .text:0x804A1030; // type:function size:0x40 FUN_804a1070 = .text:0x804A1070; // type:function size:0x40 FUN_804a10b0 = .text:0x804A10B0; // type:function size:0x40 FUN_804a10f0 = .text:0x804A10F0; // type:function size:0x60 @@ -26711,8 +26711,8 @@ FUN_804b00a0 = .text:0x804B00A0; // type:function size:0x1F8 FUN_804b02a0 = .text:0x804B02A0; // type:function size:0x80 FUN_804b0320 = .text:0x804B0320; // type:function size:0x2D4 FUN_804b0600 = .text:0x804B0600; // type:function size:0x4A4 -FUN_804b0ab0 = .text:0x804B0AB0; // type:function size:0x64 -FUN_804b0b20 = .text:0x804B0B20; // type:function size:0x440 +__ct__Q23EGG14PostEffectMaskFv = .text:0x804B0AB0; // type:function size:0x64 +setMaterialInternal__Q23EGG14PostEffectMaskFv = .text:0x804B0B20; // type:function size:0x440 FUN_804b0f60 = .text:0x804B0F60; // type:function size:0x160 FUN_804b10c0 = .text:0x804B10C0; // type:function size:0x330 FUN_804b13f0 = .text:0x804B13F0; // type:function size:0x174 @@ -37379,7 +37379,7 @@ __vt__Q23EGG14PostEffectBase = .data:0x8056F150; // type:object size:0x1C lbl_8056F170 = .data:0x8056F170; // type:object size:0x20 lbl_8056F190 = .data:0x8056F190; // type:object size:0x20 lbl_8056F1B0 = .data:0x8056F1B0; // type:object size:0x20 -lbl_8056F1D0 = .data:0x8056F1D0; // type:object size:0x20 +__vt__Q23EGG14PostEffectMask = .data:0x8056F1D0; // type:object size:0x1C lbl_8056F1F0 = .data:0x8056F1F0; // type:object size:0x20 lbl_8056F210 = .data:0x8056F210; // type:object size:0x20 sTVModeInfo__Q23EGG6Screen = .data:0x8056F230; // type:object size:0x24 data:2byte diff --git a/configure.py b/configure.py index 80c0611a..9e51b0f5 100644 --- a/configure.py +++ b/configure.py @@ -893,7 +893,7 @@ config.libs = [ Object(NonMatching, "egg/gfx/eggPostEffectBlur.cpp"), Object(NonMatching, "egg/gfx/eggPostEffectUnk1.cpp"), # Unknown Object(NonMatching, "egg/gfx/eggPostEffectUnk2.cpp"), # Unknown - Object(NonMatching, "egg/gfx/eggPostEffectMask.cpp"), + Object(Matching, "egg/gfx/eggPostEffectMask.cpp"), Object(NonMatching, "egg/gfx/eggPostEffectMaskDOF.cpp"), Object(NonMatching, "egg/gfx/eggPostEffectSimple.cpp"), Object(NonMatching, "egg/gfx/eggScreen.cpp"), diff --git a/include/egg/gfx/eggDrawGX.h b/include/egg/gfx/eggDrawGX.h index e72d2cf8..b7a4d10c 100644 --- a/include/egg/gfx/eggDrawGX.h +++ b/include/egg/gfx/eggDrawGX.h @@ -96,11 +96,11 @@ public: static u32 s_flag; - static GXColor BLACK; - static GXColor WHITE; - static GXColor GREEN; - static GXColor RED; - static GXColor BLUE; + static const GXColor BLACK; + static const GXColor WHITE; + static const GXColor GREEN; + static const GXColor RED; + static const GXColor BLUE; }; } // namespace EGG diff --git a/include/egg/gfx/eggPostEffectMask.h b/include/egg/gfx/eggPostEffectMask.h index 5af4ee11..97cfbf61 100644 --- a/include/egg/gfx/eggPostEffectMask.h +++ b/include/egg/gfx/eggPostEffectMask.h @@ -1,6 +1,30 @@ #ifndef EGG_POST_EFFECT_MASK_H #define EGG_POST_EFFECT_MASK_H -namespace EGG {} // namespace EGG +#include "egg/gfx/eggPostEffectBase.h" +#include "rvl/GX/GXTypes.h" + +namespace EGG { + +class PostEffectMask : public PostEffectBase { +public: + PostEffectMask(); + + virtual void setMaterialInternal() override; + + GXTevScale GetTevScale() const { + return static_cast(field_0x1BC); + } + +private: + /* 0x2C */ int field_0x2C; + /* 0x30 */ GXColor mColor; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ u8 _0x3C[0x180]; + /* 0x1BC */ u8 field_0x1BC; +}; + +} // namespace EGG #endif diff --git a/src/egg/gfx/eggFog.cpp b/src/egg/gfx/eggFog.cpp index 4669c270..06adfc12 100644 --- a/src/egg/gfx/eggFog.cpp +++ b/src/egg/gfx/eggFog.cpp @@ -23,8 +23,8 @@ Fog::Fog() { void Fog::Reset() { // TODO mColor = DrawGX::WHITE; - mNearZ = 0.0f; mFarZ = 0.0f; + mNearZ = 0.0f; mEndZ = 0.0f; mStartZ = 0.0f; mFogType = GX_FOG_NONE; diff --git a/src/egg/gfx/eggPostEffectMask.cpp b/src/egg/gfx/eggPostEffectMask.cpp index 64833345..17d6e895 100644 --- a/src/egg/gfx/eggPostEffectMask.cpp +++ b/src/egg/gfx/eggPostEffectMask.cpp @@ -1,3 +1,90 @@ #include "egg/gfx/eggPostEffectMask.h" -namespace EGG {} // namespace EGG +#include "common.h" +#include "egg/gfx/eggDrawGX.h" +#include "rvl/GX/GXAttr.h" +#include "rvl/GX/GXTev.h" +#include "rvl/GX/GXTypes.h" + +namespace EGG { + +PostEffectMask::PostEffectMask() + : mColor(DrawGX::WHITE), field_0x2C(0), field_0x34(0.0f), field_0x38(1.0f), field_0x1BC(1) {} + +void PostEffectMask::setMaterialInternal() { + bool hasTex2 = mpCapTexture2 != nullptr; + loadTextureInternal(); + GXColor resColor; + fn_804AF040(resColor, mColor, false, field_0x34); + setMatColorChannel(); + GXSetNumTexGens(2); + + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c, 0, 0x7d); + GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c, 0, 0x7d); + setMatInd(); + GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); + GXSetTevDirect(GX_TEVSTAGE0); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevDirect(GX_TEVSTAGE1); + GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXTevScale scale = field_0x2C == 0 ? GetTevScale() : GX_CS_SCALE_1; + + GXColor c = resColor; + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0); + GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A); + GXSetTevKColor(GX_KCOLOR0, c); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_KONST, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_SUB, GX_TB_ZERO, scale, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_SUB, GX_TB_ZERO, scale, 1, GX_TEVPREV); + + switch (field_0x2C) { + case 0: { + if (hasTex2) { + GXSetNumTevStages(2); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, mTexMapId2, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + field_0x00 = 0; + } else { + GXSetNumTevStages(1); + field_0x00 = 10; + } + break; + } + case 1: { + if (hasTex2) { + GXSetNumTevStages(3); + scale = GetTevScale(); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_CPREV, GX_CC_TEXA, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, scale, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD1, mTexMapId2, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + field_0x00 = 0; + } else { + GXSetNumTevStages(2); + scale = GetTevScale(); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_CPREV, GX_CC_TEXA, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, scale, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + field_0x00 = 10; + } + break; + } + } + + setMatPE(); +} + +} // namespace EGG