diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 029195de..9c7b55a7 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -2314,6 +2314,10 @@ egg/gfx/eggPostEffectMask.cpp: egg/gfx/eggPostEffectMaskDOF.cpp: .text start:0x804B0F60 end:0x804B1BE8 + .rodata start:0x804FBD88 end:0x804FBDA0 + .data start:0x8056F1F0 end:0x8056F20C + .sdata2 start:0x8057F7D0 end:0x8057F80C + .sbss2 start:0x8057FFC8 end:0x8057FFCC egg/gfx/eggPostEffectSimple.cpp: .text start:0x804B1BF0 end:0x804B1E58 diff --git a/configure.py b/configure.py index 83c05073..79cd5a4e 100644 --- a/configure.py +++ b/configure.py @@ -889,7 +889,7 @@ config.libs = [ Object(NonMatching, "egg/gfx/eggLightTexture.cpp"), Object(NonMatching, "egg/gfx/eggLightTextureMgr.cpp"), Object(NonMatching, "egg/gfx/eggModelEx.cpp"), - Object(NonMatching, "egg/gfx/eggPostEffectBase.cpp"), + Object(Matching, "egg/gfx/eggPostEffectBase.cpp"), Object(NonMatching, "egg/gfx/eggPostEffectBlur.cpp"), Object(Matching, "egg/gfx/eggPostEffectBlurGather.cpp"), Object(NonMatching, "egg/gfx/eggPostEffectUnk2.cpp"), # Unknown diff --git a/include/egg/gfx/eggPostEffectBase.h b/include/egg/gfx/eggPostEffectBase.h index 84a533c9..0e940200 100644 --- a/include/egg/gfx/eggPostEffectBase.h +++ b/include/egg/gfx/eggPostEffectBase.h @@ -2,7 +2,9 @@ #define EGG_POST_EFFECT_BASE_H #include "common.h" -#include "egg/egg_types.h" +#include "egg/gfx/eggCapTexture.h" +#include "egg/gfx/eggScreen.h" +#include "egg/math/eggMath.h" #include "nw4r/math/math_types.h" #include "rvl/GX/GXTypes.h" @@ -10,6 +12,10 @@ namespace EGG { class PostEffectBase { public: + struct CapTextureWrapper { + CapTexture *mpTex; + GXTexMapID mTexMapID; + }; void setField_0x00(u32 val) { field_0x00 = val; } @@ -17,16 +23,14 @@ public: static void setProjection(const EGG::Screen &screen); protected: - u32 field_0x00; // at 0x0 - CapTexture *mpCapTexture; // at 0x4 - GXTexMapID mTexMapId; // at 0x8 - CapTexture *mpCapTexture2; // at 0xC - GXTexMapID mTexMapId2; // at 0x10 - f32 mOffsetX; // at 0x14 - f32 mOffsetY; // at 0x18 - f32 mScaleX; // at 0x1C - f32 mScaleY; // at 0x20 - f32 mRotation; // at 0x24 + u32 field_0x00; // at 0x0 + CapTextureWrapper mTex1; // at 0x4 + CapTextureWrapper mTex2; // at 0xC + f32 mOffsetX; // at 0x14 + f32 mOffsetY; // at 0x18 + f32 mScaleX; // at 0x1C + f32 mScaleY; // at 0x20 + f32 mRotation; // at 0x24 PostEffectBase(); virtual ~PostEffectBase() {} // at 0x8 diff --git a/include/egg/gfx/eggPostEffectBlur.h b/include/egg/gfx/eggPostEffectBlur.h index 103a55af..35db7a39 100644 --- a/include/egg/gfx/eggPostEffectBlur.h +++ b/include/egg/gfx/eggPostEffectBlur.h @@ -15,11 +15,11 @@ class PostEffectBlur : public PostEffectBase { /* 0x08 */ f32 field_0x08; /* 0x0C */ f32 field_0x0C; - void init(GXColor clr) { + void init(const GXColor &clr) { field_0x00 = 16; field_0x01 = clr; - field_0x08 = 1.0f; - field_0x0C = 0.0f; + field_0x08 = 0.0f; + field_0x0C = 1.0f; } }; @@ -40,7 +40,7 @@ public: void setStage0Color(GXColor clr) { field_0x38[0].field_0x01 = clr; } - + void setStage0F(f32 f) { field_0x38[0].field_0x0C = f; } diff --git a/include/egg/gfx/eggPostEffectMaskDOF.h b/include/egg/gfx/eggPostEffectMaskDOF.h index cf6398f6..5faca35a 100644 --- a/include/egg/gfx/eggPostEffectMaskDOF.h +++ b/include/egg/gfx/eggPostEffectMaskDOF.h @@ -1,6 +1,39 @@ #ifndef EGG_POST_EFFECT_MASK_DOF_H #define EGG_POST_EFFECT_MASK_DOF_H -namespace EGG {} // namespace EGG +#include "egg/gfx/eggCpuTexture.h" +#include "egg/gfx/eggPostEffectBase.h" +#include "egg/math/eggVector.h" +#include "rvl/GX/GXTypes.h" +namespace EGG { + +class PostEffectMaskDOF : public PostEffectBase { +public: + PostEffectMaskDOF(); + + void setUpGradation(); + virtual void draw(f32 width, f32 height) override; + virtual void setMaterialInternal() override; + virtual ~PostEffectMaskDOF() {} + + const GXColor &getNearColor(); + const GXColor &getFarColor(); + const GXColor &getCenterColor(); + +private: + /* 0x2C */ u8 field_0x2C; + /* 0x30 */ CpuTexture *mpCpuTexArr[3]; + /* 0x3C */ CpuTexture *mpCpuTex; + /* 0x40 */ u8 _40[4]; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ f32 field_0x48; + /* 0x4C */ f32 field_0x4C; + /* 0x50 */ Vector2f field_0x50; + /* 0x58 */ u8 _58[4]; + /* 0x5C */ int mCpuTexArrIdx; + /* 0x60 */ int field_0x60; +}; + +} // namespace EGG #endif diff --git a/src/egg/gfx/eggPostEffectBase.cpp b/src/egg/gfx/eggPostEffectBase.cpp index bf824907..2b2993d7 100644 --- a/src/egg/gfx/eggPostEffectBase.cpp +++ b/src/egg/gfx/eggPostEffectBase.cpp @@ -1,9 +1,9 @@ #include "egg/gfx/eggPostEffectBase.h" #include "common.h" +#include "egg/gfx/eggCapTexture.h" #include "egg/gfx/eggDrawGX.h" #include "egg/gfx/eggScreen.h" -#include "egg/gfx/eggCapTexture.h" #include "egg/math/eggVector.h" #include "math.h" #include "nw4r/math/math_triangular.h" @@ -17,18 +17,15 @@ namespace EGG { -PostEffectBase::PostEffectBase() { - field_0x00 = 0; - mpCapTexture = nullptr; - mTexMapId = GX_TEXMAP0; - mpCapTexture2 = nullptr; - mTexMapId2 = GX_TEXMAP0; - mOffsetX = 0.0f; - mOffsetY = 0.0f; - mScaleX = 1.0f; - mScaleY = 1.0f; - mRotation = 0.0f; -} +PostEffectBase::PostEffectBase() + : field_0x00(0), + mTex1((CapTextureWrapper){nullptr, GX_TEXMAP0}), + mTex2((CapTextureWrapper){nullptr, GX_TEXMAP0}), + mOffsetX(0.0f), + mOffsetY(0.0f), + mScaleX(1.0f), + mScaleY(1.0f), + mRotation(0.0f) {} void PostEffectBase::draw(f32 width, f32 height) { setMaterialInternal(); @@ -37,7 +34,7 @@ void PostEffectBase::draw(f32 width, f32 height) { } void PostEffectBase::fn_804AED20() { - draw(mpCapTexture->getWidth(), mpCapTexture->getHeight()); + draw(mTex1.mpTex->getWidth(), mTex1.mpTex->getHeight()); } void PostEffectBase::setVtxState() { @@ -55,9 +52,9 @@ void PostEffectBase::drawScreenInternal(f32 offsetX, f32 offsetY, f32 width, f32 } void PostEffectBase::loadTextureInternal() { - mpCapTexture->load(mTexMapId); - if (mpCapTexture2 != nullptr) { - mpCapTexture2->load(mTexMapId2); + mTex1.mpTex->load(mTex1.mTexMapID); + if (mTex2.mpTex != nullptr) { + mTex2.mpTex->load(mTex2.mTexMapID); } } diff --git a/src/egg/gfx/eggPostEffectBlur.cpp b/src/egg/gfx/eggPostEffectBlur.cpp index 13dfad93..d94e0692 100644 --- a/src/egg/gfx/eggPostEffectBlur.cpp +++ b/src/egg/gfx/eggPostEffectBlur.cpp @@ -4,6 +4,8 @@ #include "egg/gfx/eggCapTexture.h" #include "egg/gfx/eggDrawGX.h" #include "egg/gfx/eggGXUtility.h" +#include "egg/math/eggMath.h" +#include "egg/math/eggVector.h" #include "math.h" #include "nw4r/math/math_triangular.h" #include "nw4r/math/math_types.h" @@ -16,15 +18,12 @@ namespace EGG { -PostEffectBlur::PostEffectBlur() { - // NONMATCHING - static const GXColor c = {0xD7, 0xD7, 0xD7, 0xD7}; - field_0x2C = 1; - field_0x30 = 1.0f; - field_0x34 = 1.0f; - for (int i = 0; i < ARRAY_LENGTH(field_0x38); i++) { - field_0x38[i].init(c); - } +PostEffectBlur::PostEffectBlur() : field_0x2C(1), field_0x30(1.0f), field_0x34(1.0f) { + const GXColor clr = (GXColor){0xD7, 0xD7, 0xD7, 0xD7}; + field_0x38[0].init(clr); + field_0x38[1].init(clr); + field_0x38[2].init(clr); + field_0x38[3].init(clr); } void PostEffectBlur::draw(f32 width, f32 height) { @@ -34,12 +33,11 @@ void PostEffectBlur::draw(f32 width, f32 height) { setMatInd(); setMatPE(); setVtxState(); - f32 f1 = 1.0f / mpCapTexture->getWidth(); - f32 f2 = 1.0f / mpCapTexture->getHeight(); + f32 f1 = 1.0f / mTex1.mpTex->getWidth(); + f32 f2 = 1.0f / mTex1.mpTex->getHeight(); for (u8 i = 0; i < field_0x2C; i++) { - // Regswap - int maxNum = field_0x38[i].field_0x00 - 1; - for (u8 b = 0; b <= maxNum / 8; b++) { + int maxNum = (field_0x38[i].field_0x00 - 1) / 8; + for (u8 b = 0; b <= maxNum; b++) { drawInternal(i, b, f1, f2); drawScreenInternal(mOffsetX, mOffsetY, width * mScaleX, height * mScaleY); DrawGX::SetBlendMode(DrawGX::BLEND_2); @@ -50,17 +48,13 @@ void PostEffectBlur::draw(f32 width, f32 height) { void PostEffectBlur::drawInternal(u8 kernelIdx, u8 p2, f32 f1, f32 f2) { // NONMATCHING nw4r::math::MTX34 mtx; - Stage &k = field_0x38[kernelIdx]; + const Stage &k = field_0x38[kernelIdx]; - // Some regswaps and instruction swaps only at the start of the function - f32 unk_00 = k.field_0x00; + f32 f4 = k.field_0x0C * f1; + f32 f3 = k.field_0x0C * f2; + f32 rad1 = k.field_0x08 - mRotation * Math::pi(); int unk_00_scale = (p2 & 0x1F) * 8; - - f32 rad1 = (k.field_0x08 - M_PI * mRotation); - f32 abc = (2.0f * M_PI / unk_00); - - f32 f3 = k.field_0x0C * f1; - f32 f4 = k.field_0x0C * f2; + f32 abc = (2.f * Math::pi() / k.field_0x00); u8 numTexGens = k.field_0x00 - unk_00_scale; if (numTexGens > 8) { @@ -76,12 +70,11 @@ void PostEffectBlur::drawInternal(u8 kernelIdx, u8 p2, f32 f1, f32 f2) { nw4r::math::SinCosRad(&sin, &cos, rad1 + abc * unk_00_scale); nw4r::math::MTX34 m( // clang-format off - 1.0f, 0.0f, cos * f3, 0.0f, - 0.0f, 1.0f, sin * f4, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f + 1.0f, 0.0f, cos * f4, 0.0f, + 0.0f, 1.0f, sin * f3, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f // clang-format on ); - // OK from here PSMTXConcat(m, mtx, m); GXLoadTexMtxImm(m, texMtxId, GX_MTX_2x4); unk_00_scale++; @@ -115,7 +108,7 @@ void PostEffectBlur::drawInternal(u8 kernelIdx, u8 p2, f32 f1, f32 f2) { GXSetTevKColorSel(stage, GX_TEV_KCSEL_K0); GXSetTevKAlphaSel(stage, GX_TEV_KASEL_K0_A); - GXSetTevOrder(stage, static_cast(id), mTexMapId, GX_COLOR_NULL); + GXSetTevOrder(stage, static_cast(id), mTex1.mTexMapID, GX_COLOR_NULL); GXSetTevColorIn(stage, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, a1); GXSetTevAlphaIn(stage, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, a2); diff --git a/src/egg/gfx/eggPostEffectBlurGather.cpp b/src/egg/gfx/eggPostEffectBlurGather.cpp index 0f01e6e1..0269966b 100644 --- a/src/egg/gfx/eggPostEffectBlurGather.cpp +++ b/src/egg/gfx/eggPostEffectBlurGather.cpp @@ -21,7 +21,7 @@ PostEffectBlurGather::PostEffectBlurGather() { } void PostEffectBlurGather::setMaterialInternal() { - u8 hasExtraStage = (mpCapTexture != nullptr && (field_0x2D & 1) == 0) ? 1 : 0; + u8 hasExtraStage = (mTex1.mpTex != nullptr && (field_0x2D & 1) == 0) ? 1 : 0; u8 numStages = field_0x2C + hasExtraStage * 2; setMatColorChannel(); nw4r::math::MTX34 mtx; @@ -70,7 +70,7 @@ void PostEffectBlurGather::setMaterialInternal() { GXSetTevKColorSel(stage, GX_TEV_KCSEL_K2); GXSetTevKAlphaSel(stage, GX_TEV_KASEL_K2_A); GXSetTevKColor(GX_KCOLOR2, c); - GXSetTevOrder(stage, static_cast(i), mTexMapId, GX_COLOR_NULL); + GXSetTevOrder(stage, static_cast(i), mTex1.mTexMapID, GX_COLOR_NULL); GXSetTevColorIn(stage, GX_CC_KONST, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); GXSetTevColorOp(stage, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_4, 1, GX_TEVPREV); GXSetTevAlphaIn(stage, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); diff --git a/src/egg/gfx/eggPostEffectMask.cpp b/src/egg/gfx/eggPostEffectMask.cpp index 06424a66..a5819a9a 100644 --- a/src/egg/gfx/eggPostEffectMask.cpp +++ b/src/egg/gfx/eggPostEffectMask.cpp @@ -12,7 +12,7 @@ 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; + bool hasTex2 = mTex2.mpTex != nullptr; loadTextureInternal(); GXColor resColor; scaleColor(resColor, mColor, false, field_0x34); @@ -30,7 +30,7 @@ void PostEffectMask::setMaterialInternal() { GXTevScale scale = field_0x2C == 0 ? GetTevScale() : GX_CS_SCALE_1; GXColor c = resColor; - GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, mTex1.mTexMapID, GX_COLOR_NULL); GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0); GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A); GXSetTevKColor(GX_KCOLOR0, c); @@ -43,7 +43,7 @@ void PostEffectMask::setMaterialInternal() { case 0: { if (hasTex2) { GXSetNumTevStages(2); - GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, mTexMapId2, GX_COLOR_NULL); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, mTex2.mTexMapID, 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); @@ -59,12 +59,12 @@ void PostEffectMask::setMaterialInternal() { if (hasTex2) { GXSetNumTevStages(3); scale = GetTevScale(); - GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, mTex1.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); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD1, mTex2.mTexMapID, 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); @@ -73,7 +73,7 @@ void PostEffectMask::setMaterialInternal() { } else { GXSetNumTevStages(2); scale = GetTevScale(); - GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, mTex1.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); diff --git a/src/egg/gfx/eggPostEffectMaskDOF.cpp b/src/egg/gfx/eggPostEffectMaskDOF.cpp index 9bd54d28..7e9bc43a 100644 --- a/src/egg/gfx/eggPostEffectMaskDOF.cpp +++ b/src/egg/gfx/eggPostEffectMaskDOF.cpp @@ -1,3 +1,196 @@ #include "egg/gfx/eggPostEffectMaskDOF.h" -namespace EGG {} // namespace EGG +#include "common.h" +#include "egg/gfx/eggCpuTexture.h" +#include "nw4r/math/math_types.h" +#include "rvl/GX/GXGeometry.h" +#include "rvl/GX/GXTransform.h" +#include "rvl/GX/GXTypes.h" +#include "rvl/MTX/mtx.h" + +namespace EGG { + +static const GXColor sColorNear = (GXColor){0x00, 0xFF, 0x00, 0xFF}; +static const GXColor sColorFar = (GXColor){0xFF, 0x00, 0x00, 0x00}; +static const GXColor sColorCenter = (GXColor){0x00, 0x00, 0x00, 0x00}; + +PostEffectMaskDOF::PostEffectMaskDOF() + : field_0x2C(8), + field_0x44(0.5), + field_0x48(0.f), + field_0x4C(1.f), + field_0x50(0.f, 0.f), + mCpuTexArrIdx(2), + field_0x60(2) { + for (int i = 0; i < 3; i++) { + mpCpuTexArr[i] = new CpuTexture(64, 2, GX_TF_RGBA8); + mpCpuTexArr[i]->configure(); + mpCpuTexArr[i]->allocate(nullptr); + mpCpuTexArr[i]->setWrapS(GX_CLAMP); + mpCpuTexArr[i]->setWrapT(GX_CLAMP); + } + + mpCpuTex = new CpuTexture(64, 64, GX_TF_RGBA8); + mpCpuTex->configure(); + mpCpuTex->allocate(nullptr); + mpCpuTex->setWrapS(GX_CLAMP); + mpCpuTex->setWrapT(GX_CLAMP); + setUpGradation(); + field_0x00 = 0; +} + +void PostEffectMaskDOF::setUpGradation() {} + +void PostEffectMaskDOF::draw(f32 width, f32 height) { + setMaterialInternal(); + setVtxState(); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_TEX_ST, GX_F32, 0); + GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT); + nw4r::math::MTX34 mtx; + PSMTXScale(mtx, width * mScaleX, height * mScaleY, 1.f); + PSMTXTransApply(mtx, mtx, mOffsetX, mOffsetY, 0.f); + GXLoadPosMtxImm(mtx, GX_PNMTX0); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition2u8(0, 0); + GXPosition2f32(field_0x50.x, field_0x50.y); + GXPosition2u8(1, 1); + GXPosition2f32(field_0x50.x, field_0x50.y); + GXPosition2u8(2, 2); + GXPosition2f32(field_0x50.x, field_0x50.y); + GXPosition2u8(3, 3); + GXPosition2f32(field_0x50.x, field_0x50.y); + GXSetTexCoordScaleManually(GX_TEXCOORD1, 0, 0x40, 0); + GXSetTexCoordBias(GX_TEXCOORD1, 0, 0); +} + +void PostEffectMaskDOF::setMaterialInternal() { + loadTextureInternal(); + setMatColorChannel(); + GXSetNumTexGens(2); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0, false, GX_DUALMTX_IDENT); + GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_TEXMTX_IDENT, false, GX_DUALMTX_IDENT); + nw4r::math::MTX34 baseTexMtx; + getBaseTexMtx(&baseTexMtx); + GXLoadTexMtxImm(baseTexMtx, GX_TEXMTX0, GX_MTX_2x4); + GXSetNumIndStages(1); + GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD0, mTex1.mTexMapID); + GXSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1); + + CpuTexture *pCpuTex = mpCpuTexArr[mCpuTexArrIdx]; + switch (field_0x60) { + case 0: { + GXSetNumTevStages(1); + GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP2, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + GXSetTevIndirect( + GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_ITF_8, GX_ITB_NONE, GX_ITM_0, GX_ITW_OFF, GX_ITW_OFF, false, false, + GX_ITBA_OFF + ); + + s8 scaleExp = 0; + f32 fVar2 = scaleExp + 1; + f32 fVar3 = 1.f / (field_0x4C - field_0x48); + + f32 fVar1 = fVar3 / fVar2; + + while (fVar1 > (1023.f / 1024.f)) { + fVar1 /= 2.f; + fVar2 *= 2.f; + + scaleExp++; + } + while (0.f < fVar1 && fVar1 < 0.5f) { + fVar1 *= 2.f; + fVar2 /= 2.f; + + scaleExp--; + } + f32 indTexMtx[2][3] = { + {fVar1 / 256.f, fVar1, 0.f}, + { 0.f, 0.f, 0.f} + }; + GXSetIndTexMtx(GX_ITM_0, indTexMtx, scaleExp - 2); + field_0x50.x = -(field_0x44 * fVar1 * fVar2) + 0.5f; + if (field_0x2C & 8) { + field_0x50.x = (s32)(field_0x50.x * 128.f) / 128.f; + } + field_0x50.y = 0.f; + GXSetTexCoordScaleManually(GX_TEXCOORD1, true, 0x40, 0); + GXSetTexCoordBias(GX_TEXCOORD1, 0, 0); + } break; + case 1: { + pCpuTex = mpCpuTex; + GXSetNumTevStages(2); + GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); + GXSetTevDirect(GX_TEVSTAGE0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP2, GX_COLOR_NULL); + GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD_NULL, GX_TEXMAP2, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + GXSetTevIndirect( + GX_TEVSTAGE1, GX_INDTEXSTAGE0, GX_ITF_8, GX_ITB_NONE, GX_ITM_0, GX_ITW_0, GX_ITW_0, true, false, + GX_ITBA_OFF + ); + field_0x50.y = field_0x4C; + + f32 val = 1023.f / 1024.f; + f32 indTexMtx[2][3] = { + {val / 256.f, val, 0.f}, + { 0.f, 0.f, 0.f} + }; + + GXSetIndTexMtx(GX_ITM_0, indTexMtx, 8); + + int unk = 1024; + field_0x50.x = -field_0x44 + 0.5f / unk; + + GXSetTexCoordScaleManually(GX_TEXCOORD1, GX_TEXCOORD1, 0, 0x40); + GXSetTexCoordBias(GX_TEXCOORD1, 0, 0); + } break; + case 2: { + GXSetNumTevStages(1); + GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); + GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP2, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV); + GXSetTevIndirect( + GX_TEVSTAGE0, GX_INDTEXSTAGE0, GX_ITF_8, GX_ITB_NONE, GX_ITM_0, GX_ITW_0, GX_ITW_0, false, false, + GX_ITBA_OFF + ); + + f32 indTexMtx[2][3] = { + {0.f, 0.5f, 0.f}, + {0.f, 0.f, 0.f} + }; + GXSetIndTexMtx(GX_ITM_0, indTexMtx, -1); + + field_0x50.y = 0.f; + field_0x50.x = 0.f; + } break; + } + pCpuTex->load(GX_TEXMAP2); + setMatPE(); +} + +const GXColor &PostEffectMaskDOF::getNearColor() { + return sColorNear; +} +const GXColor &PostEffectMaskDOF::getFarColor() { + return sColorFar; +} +const GXColor &PostEffectMaskDOF::getCenterColor() { + return sColorCenter; +} + +} // namespace EGG diff --git a/src/egg/gfx/eggPostEffectSimple.cpp b/src/egg/gfx/eggPostEffectSimple.cpp index 24c18b9f..c6525a9a 100644 --- a/src/egg/gfx/eggPostEffectSimple.cpp +++ b/src/egg/gfx/eggPostEffectSimple.cpp @@ -29,7 +29,7 @@ void PostEffectSimple::setMaterialInternal() { GXSetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_K0); GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A); GXSetTevKColor(GX_KCOLOR0, c); - GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, mTexMapId, GX_COLOR_NULL); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, mTex1.mTexMapID, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, GX_CC_ZERO); GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, field_0x34, 1, GX_TEVPREV); switch (field_0x38) { diff --git a/src/egg/gfx/eggPostEffectUnk2.cpp b/src/egg/gfx/eggPostEffectUnk2.cpp index abf57b73..ffa43714 100644 --- a/src/egg/gfx/eggPostEffectUnk2.cpp +++ b/src/egg/gfx/eggPostEffectUnk2.cpp @@ -74,8 +74,8 @@ void PostEffectUnk2::draw(f32 width, f32 height) { {-1.0f, 1.0f}, }; - const f32 s1 = field_0x40 / mpCapTexture->getWidth(); - const f32 s2 = field_0x40 / mpCapTexture->getHeight(); + const f32 s1 = field_0x40 / mTex1.mpTex->getWidth(); + const f32 s2 = field_0x40 / mTex1.mpTex->getHeight(); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { f32 mtx[2][4]; @@ -120,9 +120,9 @@ void PostEffectUnk2::setMaterialInternal() { GXSetTexCoordGen2(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX0, 0x1e, 0, 0x7d); GXSetTexCoordGen2(GX_TEXCOORD3, GX_TG_MTX2x4, GX_TG_TEX0, 0x21, 0, 0x7d); GXSetNumIndStages(3); - GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD0, mTexMapId); - GXSetIndTexOrder(GX_INDTEXSTAGE1, GX_TEXCOORD2, mTexMapId); - GXSetIndTexOrder(GX_INDTEXSTAGE2, GX_TEXCOORD3, mTexMapId); + GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD0, mTex1.mTexMapID); + GXSetIndTexOrder(GX_INDTEXSTAGE1, GX_TEXCOORD2, mTex1.mTexMapID); + GXSetIndTexOrder(GX_INDTEXSTAGE2, GX_TEXCOORD3, mTex1.mTexMapID); setMatPE(); mpTexture->load(GX_TEXMAP1);