Post Effect Progress. PostEffectBlurGather OK

This commit is contained in:
elijah-thomas774
2025-03-23 11:56:25 -04:00
parent da9155aa5f
commit 115d0d7065
14 changed files with 131 additions and 111 deletions
+3
View File
@@ -0,0 +1,3 @@
#include "egg/gfx/eggDrawPathBloom.h"
namespace EGG {} // namespace EGG
-3
View File
@@ -1,3 +0,0 @@
#include "egg/gfx/eggDrawPathUnk1.h"
namespace EGG {} // namespace EGG
@@ -1,8 +1,7 @@
#include "egg/gfx/eggPostEffectUnk1.h"
#include "egg/gfx/eggPostEffectBlurGather.h"
#include "common.h"
#include "egg/gfx/eggCpuTexture.h"
#include "egg/gfx/eggDrawGX.h"
#include "egg/gfx/eggGXUtility.h"
#include "nw4r/math/math_types.h"
#include "rvl/GX/GXAttr.h"
@@ -12,20 +11,16 @@
namespace EGG {
PostEffectUnk1::PostEffectUnk1() {
// NONMATCHING
PostEffectBlurGather::PostEffectBlurGather() {
field_0x2C = 1;
field_0x2D = 1;
field_0x30 = 0.5f;
for (int i = 0; i < ARRAY_LENGTH(field_0x34); i++) {
field_0x34[i].field_0x00 = nullptr;
field_0x34[i].field_0x08 = DrawGX::WHITE;
field_0x34[i].field_0x0C = 1.0f;
field_0x34[i].field_0x10 = 0;
}
mBlurGatherData[0].reset();
mBlurGatherData[1].reset();
mBlurGatherData[2].reset();
}
void PostEffectUnk1::setMaterialInternal() {
void PostEffectBlurGather::setMaterialInternal() {
u8 hasExtraStage = (mpCapTexture != nullptr && (field_0x2D & 1) == 0) ? 1 : 0;
u8 numStages = field_0x2C + hasExtraStage * 2;
setMatColorChannel();
@@ -37,7 +32,7 @@ void PostEffectUnk1::setMaterialInternal() {
int texMtxIdx = GXUtility::getTexMtxID(i);
GXSetTexCoordGen2(static_cast<GXTexCoordID>(i), GX_TG_MTX2x4, GX_TG_TEX0, texMtxIdx, 0, 0x7D);
if (i < field_0x2C) {
field_0x34[i].field_0x00->load(field_0x34[i].mTexMapId);
mBlurGatherData[i].mpCapTexture->load(mBlurGatherData[i].mTexMapId);
} else {
loadTextureInternal();
}
@@ -50,13 +45,13 @@ void PostEffectUnk1::setMaterialInternal() {
GXSetNumTevStages(numStages);
for (int i = 0; i < numStages; i++) {
Stage &k = field_0x34[i];
BlurGatherData &k = mBlurGatherData[i];
GXTevStageID stage = static_cast<GXTevStageID>(i);
GXSetTevDirect(stage);
GXSetTevSwapMode(stage, GX_TEV_SWAP0, GX_TEV_SWAP0);
if (i < field_0x2C) {
GXColor scaledColor;
scaleColor(scaledColor, k.field_0x08, false, k.field_0x0C);
scaleColor(scaledColor, k.mColor, false, k.mColorScale);
GXSetTevKColorSel(stage, static_cast<GXTevKColorSel>(GX_TEV_KCSEL_K0 + i));
GXSetTevKAlphaSel(stage, static_cast<GXTevKAlphaSel>(GX_TEV_KASEL_K0_A + i));
+2 -2
View File
@@ -19,8 +19,8 @@ void PostEffectMask::setMaterialInternal() {
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);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX_IDENT, false, GX_DUALMTX_IDENT);
GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX_IDENT, false, GX_DUALMTX_IDENT);
setMatInd();
GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA);
GXSetTevDirect(GX_TEVSTAGE0);
+43 -42
View File
@@ -16,33 +16,32 @@
namespace EGG {
PostEffectUnk2::PostEffectUnk2() {
// NONMATCHING
field_0x2C = 0;
field_0x30 = 0;
field_0x34 = 1;
field_0x35 = 0xFE;
field_0x36 = 7;
field_0x38 = 0.0f;
field_0x3C = 0.0f;
field_0x40 = 1.0f;
field_0x44 = 1.0f;
field_0x48 = 1.0f;
inline f32 GetColor(f32 x, u16 w) {
return nw4r::ut::Min(x / (w - 1), 1.f) * 0xFF;
}
PostEffectUnk2::PostEffectUnk2()
: // NONMATCHING
field_0x2C(0),
field_0x30(0),
field_0x34(1),
field_0x35(0xFE),
field_0x36(7),
field_0x38(0.0f, 0.0f),
field_0x40(1.0f),
field_0x44(1.0f),
field_0x48(1.0f) {
mpTexture = new CpuTexture(32, 4, GX_TF_RGBA8);
mpTexture->configure();
mpTexture->allocate(nullptr);
mpTexture->setWrapS(GX_CLAMP);
mpTexture->setWrapT(GX_CLAMP);
for (u16 y = 0; y < mpTexture->getHeight(); y++) {
for (u16 x = 0; x < mpTexture->getWidth(); x++) {
// The conversion constant 0x43000000 needs to
// be stored at the start of the function...
f32 xF = x;
f32 widF = mpTexture->getWidth() - 1;
f32 ratio = nw4r::ut::Min(xF / widF, 1.0f);
u8 val = ratio * 255.0f;
GXColor color = {val, val, val, val};
mpTexture->setColor(x, y, color);
u8 val = GetColor(x, mpTexture->getWidth());
mpTexture->setColor(x, y, (GXColor){val, val, val, val});
}
}
@@ -62,7 +61,7 @@ void PostEffectUnk2::draw(f32 width, f32 height) {
GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
nw4r::math::MTX34 mtx;
PSMTXScale(mtx, mScaleX * width, mScaleY * height, 1.0f);
PSMTXScale(mtx, width * mScaleX, height * mScaleY, 1.0f);
PSMTXTransApply(mtx, mtx, mOffsetX, mOffsetY, 0.0f);
GXLoadPosMtxImm(mtx, 0);
@@ -75,38 +74,40 @@ void PostEffectUnk2::draw(f32 width, f32 height) {
{-1.0f, 1.0f},
};
// TODO
f32 s1 = field_0x40 / mpCapTexture->getWidth();
f32 s2 = field_0x40 / mpCapTexture->getHeight();
f32 f = 0.0f;
const f32 s1 = field_0x40 / mpCapTexture->getWidth();
const f32 s2 = field_0x40 / mpCapTexture->getHeight();
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
EGG::Vector3f(0.0f, 0.0f, 0.0f);
f32 mtx[2][4];
EGG::Vector3f a(0.f, 0.f, 0.f);
f32 sin, cos;
nw4r::math::SinCosRad(&sin, &cos, f);
nw4r::math::MTX34 mtx2;
mtx2._00 = cos;
mtx2._01 = -sin;
mtx2._02 = -cos * f + sin * f + (s1 * floats1[i][j]);
mtx2._03 = f;
mtx2._10 = sin;
mtx2._11 = cos;
mtx2._12 = -sin * f - cos * f + (s2 * floats2[i][j]);
mtx2._13 = f;
GXLoadTexMtxImm(mtx2, GXUtility::getTexMtxID(j), GX_MTX_2x4);
nw4r::math::SinCosRad(&sin, &cos, a.z);
mtx[0][0] = cos;
mtx[0][1] = -sin;
mtx[0][2] = -cos * a.x + sin * a.y + a.x + (s1 * floats1[i][j]);
mtx[1][0] = sin;
mtx[1][1] = cos;
mtx[1][2] = -sin * a.x - cos * a.y + a.y + (s2 * floats2[i][j]);
mtx[1][3] = 0.f;
mtx[0][3] = 0.f;
GXLoadTexMtxImm(mtx, GXUtility::getTexMtxID(j), GX_MTX_2x4);
}
if (i == 1 && field_0x2C <= 1) {
GXSetBlendMode(GX_BM_LOGIC, GX_BL_ZERO, GX_BL_ZERO, GX_LO_OR);
}
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition2u8(0, 0);
GXPosition2f32(field_0x38, field_0x3C);
GXPosition2f32(field_0x38.x, field_0x38.y);
GXPosition2u8(1, 1);
GXPosition2f32(field_0x38, field_0x3C);
GXPosition2f32(field_0x38.x, field_0x38.y);
GXPosition2u8(2, 2);
GXPosition2f32(field_0x38, field_0x3C);
GXPosition2f32(field_0x38.x, field_0x38.y);
GXPosition2u8(3, 3);
GXPosition2f32(field_0x38, field_0x3C);
GXPosition2f32(field_0x38.x, field_0x38.y);
}
}
@@ -153,7 +154,7 @@ void PostEffectUnk2::setMaterialInternal() {
GXSetTevSwapMode(GX_TEVSTAGE3, GX_TEV_SWAP0, GX_TEV_SWAP0);
GXSetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD_NULL, GX_TEXMAP1, GX_COLOR_NULL);
if (field_0x2C == 2) {
if ((int)field_0x2C == 2) {
GXSetTevColorIn(GX_TEVSTAGE3, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevAlphaIn(GX_TEVSTAGE3, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_GREATER, field_0x35);