diff options
| author | elijah-thomas774 <elijahthomas774@gmail.com> | 2025-03-24 21:28:54 -0400 |
|---|---|---|
| committer | elijah-thomas774 <elijahthomas774@gmail.com> | 2025-03-24 21:28:54 -0400 |
| commit | a8327ffc92eed8f5901a7dce08648de36fd50f6c (patch) | |
| tree | e543512a0e93e3970aba2e1a3c22c7e49f62839d /src/egg/gfx/eggScreenEffectBlur.cpp | |
| parent | 3e7dd3283af2fda9fb4fc67768d5b6c08325fc18 (diff) | |
Im tired
Diffstat (limited to 'src/egg/gfx/eggScreenEffectBlur.cpp')
| -rw-r--r-- | src/egg/gfx/eggScreenEffectBlur.cpp | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/src/egg/gfx/eggScreenEffectBlur.cpp b/src/egg/gfx/eggScreenEffectBlur.cpp index c445b216..25b379a7 100644 --- a/src/egg/gfx/eggScreenEffectBlur.cpp +++ b/src/egg/gfx/eggScreenEffectBlur.cpp @@ -1,6 +1,7 @@ #include "egg/gfx/eggScreenEffectBlur.h" #include "common.h" +#include "egg/gfx/eggCpuTexture.h" #include "egg/gfx/eggDrawGX.h" #include "egg/gfx/eggPostEffectBase.h" #include "egg/gfx/eggPostEffectBlur.h" // IWYU pragma: keep @@ -12,6 +13,8 @@ #include "rvl/GX/GXTypes.h" #include "rvl/MTX/mtx.h" +#include <cstddef> + namespace EGG { static const GXColor sDefaultColor = {0, 0, 0, 0xFF}; @@ -41,9 +44,66 @@ ScreenEffectBlur::~ScreenEffectBlur() { delete mpUnk2; delete mpBlur; } - +static const CopyFilter copyFilter = { + {0x15, 0, 0, 0x16, 0, 0x15, 0} +}; void ScreenEffectBlur::fn_804B32B0() { - // Oh god + if (mFlag & 1) { + StateGX::invalidateTexAllGX(); + PostEffectBase::setProjection(GetScreen()); + const Screen::DataEfb &efb = GetScreen().GetDataEfb(); + u16 x1 = efb.vp.x1; + u16 y1 = efb.vp.y1; + f32 sizeX = (u16)sScreen.GetSize().x * field_0x10; + f32 sizeY = (u16)sScreen.GetSize().y * field_0x10; + u16 x2 = efb.vp.x2 * field_0x10; + u16 y2 = efb.vp.y2 * field_0x10; + + StateGX::ScopedColor _clr(true); + StateGX::ScopedAlpha _alpha(false); + StateGX::ScopedDither _dither(false); + TextureBuffer *pTex0 = NULL; + if (field_0x0C & 1) { + pTex0 = TextureBuffer::alloc(x2, y2, GX_TF_RGBA8); + pTex0->capture(x1, y1, 0, GX_TF_RGBA8); + } + TextureBuffer *pTex1 = TextureBuffer::alloc(x2, y2, GX_TF_IA8); + pTex1->setMinFilt(GX_NEAR); + pTex1->setMagFilt(GX_NEAR); + pTex1->capture(x1, y1, false, GX_TF_Z16); + + // . . . + if (field_0x0C & 2) { + TextureBuffer *pTex2 = TextureBuffer::alloc(x2, y2, GX_TF_RGBA8); + pTex2->onCapFlag(0x8); + pTex2->setCopyFilter(copyFilter); + pTex2->capture(x1, y1, false, GX_CTF_R8); + u8 val = field_0x18 * 255.f; + GXColor clr = {val, val, val, val}; + mpBlur->setStage0Color(clr); + mpBlur->setStage0F(field_0x1C); + mpBlur->mTex1 = (PostEffectBase::CapTextureWrapper){pTex2, GX_TEXMAP1}; + mpBlur->draw(sizeX * 1.0f, sizeY * 1.0f); + pTex2->free(); + } + // . . . + + mpCpuTexture = TextureBuffer::alloc(x2, y2, GX_TF_I8); + mpCpuTexture->onCapFlag(0x8); + mpCpuTexture->setCopyFilter(copyFilter); + mpCpuTexture->capture(x1, y1, false, GX_CTF_R8); + pTex1->free(); + + if (field_0x0C & 1) { + nw4r::math::MTX34 m; + PSMTXScale(m, sizeY, sizeY, 1.f); + pTex0->load(GX_TEXMAP0); + DrawGX::BeginDrawScreen(true, true, false); + DrawGX::SetBlendMode(DrawGX::BLEND_14); + DrawGX::DrawDL16(m, DrawGX::WHITE); + pTex0->free(); + } + } } void ScreenEffectBlur::fn_804B3710() { |
