summaryrefslogtreecommitdiff
path: root/src/egg/gfx/eggDrawPathLightMap.cpp
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2025-03-22 20:47:12 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2025-03-22 20:47:12 -0400
commitf66c22cf63529120697765e05b796d401c16555f (patch)
treeaadb94a693fec186790721b40f3e6f3f61f88c2e /src/egg/gfx/eggDrawPathLightMap.cpp
parentb16089a834bbdb3a68e64d1b54824d7768be63d5 (diff)
eggDrawPathLightMap OK
Diffstat (limited to 'src/egg/gfx/eggDrawPathLightMap.cpp')
-rw-r--r--src/egg/gfx/eggDrawPathLightMap.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/egg/gfx/eggDrawPathLightMap.cpp b/src/egg/gfx/eggDrawPathLightMap.cpp
new file mode 100644
index 00000000..21a0ad6c
--- /dev/null
+++ b/src/egg/gfx/eggDrawPathLightMap.cpp
@@ -0,0 +1,194 @@
+#include "egg/gfx/eggDrawPathLightMap.h"
+
+#include "common.h"
+#include "egg/gfx/eggDrawGX.h"
+#include "egg/gfx/eggGlobalDrawState.h"
+#include "egg/gfx/eggPostEffectBase.h"
+#include "egg/gfx/eggStateGX.h"
+#include "rvl/GX/GXPixel.h"
+#include "rvl/GX/GXTypes.h"
+
+namespace EGG {
+
+DrawPathLightMap::DrawPathLightMap()
+ : field_0x18(6),
+ mAlpha(0xFF),
+ field_0x1C(0),
+ field_0x20(0),
+ field_0x24(0),
+ mpTextureBuffer_0x28(nullptr),
+ mpTextureBuffer_0x2C(nullptr),
+ mpTextureBuffer_0x30(nullptr),
+ mOldDrawFlag(0) {}
+
+void DrawPathLightMap::internalResetForDraw() {
+ freeTextureBuffers();
+ mpTextureBuffer_0x28 = nullptr;
+ mpTextureBuffer_0x2C = nullptr;
+ mpTextureBuffer_0x30 = nullptr;
+}
+
+void DrawPathLightMap::internalDraw(u16 idx) {
+ const Screen::DataEfb &efb = GlobalDrawState::getScreen().GetDataEfb();
+
+ switch (idx) {
+ case 0: {
+ if (field_0x18 & 1) {
+ mpTextureBuffer_0x30 = TextureBuffer::alloc(efb.vp.x2, efb.vp.y2, GX_TF_RGBA8);
+ mpTextureBuffer_0x30->onCapFlag(1);
+ mpTextureBuffer_0x30->onCapFlag(2);
+ mpTextureBuffer_0x30->setFilt(GX_NEAR, GX_NEAR);
+ mpTextureBuffer_0x30->capture(efb.vp.x1, efb.vp.y1, false, -1);
+ }
+ mOldDrawFlag = GlobalDrawState::getDrawFlag();
+ GlobalDrawState::onDrawFlag(0x1 | 0x2);
+ } break;
+ case 1: {
+ GlobalDrawState::setDrawFlag(mOldDrawFlag);
+ GXTexFmt fmt = GX_TF_RGBA8;
+
+ if (field_0x20 == 1) {
+ fmt = GX_TF_RGB5A3;
+ if (field_0x1C == 1) {
+ fmt = GX_TF_RGB565;
+ }
+ }
+
+ int capW = efb.vp.x1;
+ int capH = efb.vp.y1;
+
+ mpTextureBuffer_0x28 = TextureBuffer::alloc(efb.vp.x2, efb.vp.y2, fmt);
+
+ mpTextureBuffer_0x28->onCapFlag(1);
+ mpTextureBuffer_0x28->onCapFlag(2);
+ if (!(field_0x18 & 2)) {
+ mpTextureBuffer_0x28->onCapFlag(4);
+ }
+ mpTextureBuffer_0x28->setClearColor(StateGX::getClearEfb());
+
+ mpTextureBuffer_0x28->capture(capW, capH, false, -1);
+ mpTextureBuffer_0x28->setFilt(GX_NEAR, GX_NEAR);
+
+ if (mpTextureBuffer_0x30) {
+ nw4r::math::MTX34 forDL;
+
+ StateGX::ScopedColor _color(true);
+ StateGX::ScopedAlpha _alpha(true);
+ StateGX::ScopedDither _dither(false);
+
+ PostEffectBase::setProjection(GetScreen());
+
+ PSMTXScale(forDL, GetScreen().GetWidth(), GetScreen().GetHeight(), 1.0f);
+
+ mpTextureBuffer_0x30->load(GX_TEXMAP0);
+ DrawGX::BeginDrawScreen(true, true, false);
+
+ DrawGX::SetBlendMode(DrawGX::BLEND_14);
+
+ DrawGX::DrawDL16(forDL, DrawGX::WHITE);
+
+ mpTextureBuffer_0x30->free();
+ mpTextureBuffer_0x30 = nullptr;
+ }
+
+ if (field_0x18 & 2) {
+ mpTextureBuffer_0x2C = TextureBuffer::alloc(efb.vp.x2, efb.vp.y2, GX_TF_Z24X8);
+ mpTextureBuffer_0x2C->onCapFlag(4);
+
+ if (isFlag0x2()) {
+ mpTextureBuffer_0x2C->onCapFlag(0x10);
+ } else {
+ mpTextureBuffer_0x2C->offCapFlag(0x10);
+ }
+
+ mpTextureBuffer_0x2C->capture(capW, capH, false, -1);
+ mpTextureBuffer_0x2C->setFilt(GX_NEAR, GX_NEAR);
+ }
+ StateGX::invalidateTexAllGX();
+ } break;
+ case 2: {
+ if (mpTextureBuffer_0x28) {
+ if (mAlpha != 0) {
+ mpTextureBuffer_0x28->load(GX_TEXMAP0);
+
+ nw4r::math::MTX34 forDL;
+ PostEffectBase::setProjection(GetScreen());
+ PSMTXScale(forDL, GetScreen().GetWidth(), GetScreen().GetHeight(), 1.0f);
+
+ GXColor tevColor = {0xFF, 0xFF, 0xFF, mAlpha};
+
+ StateGX::ScopedColor _color(true);
+ StateGX::ScopedAlpha _alpha(false);
+ StateGX::ScopedDither _dither(true);
+
+ if (mpTextureBuffer_0x2C) {
+ mpTextureBuffer_0x2C->load(GX_TEXMAP1);
+ DrawGX::SetMat_ColorChannel(DrawGX::COLORCHAN_1);
+ DrawGX::SetMat_TexGen(DrawGX::TEXGEN_1);
+ DrawGX::SetMat_Ind();
+ GXSetTevKColor(GX_KCOLOR0, (GXColor){0});
+
+ GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA);
+ GXSetNumTevStages(2);
+ GXSetTevDirect(GX_TEVSTAGE0);
+ GXSetTevDirect(GX_TEVSTAGE1);
+ GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
+ GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0);
+
+ if (field_0x1C == 0) {
+ GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A);
+ GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
+ GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_RASC, GX_CC_ZERO);
+ GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
+ GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_TEXA, GX_CA_KONST, GX_CA_RASA, GX_CA_ZERO);
+ GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_COMP_A8_GT, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
+ } else {
+ GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A);
+ GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
+ 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_RASA);
+ GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
+ }
+
+ GXSetTevSwapMode(GX_TEVSTAGE1, GX_TEV_SWAP0, GX_TEV_SWAP0);
+ GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP1, GX_COLOR_NULL);
+ GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_CPREV);
+ 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_APREV);
+ GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
+ GXSetZTexture(GZ_ZT_REPLACE, GX_TF_Z24X8, 0);
+
+ GXSetZMode(true, field_0x1C == 0 ? GX_LEQUAL : GX_LESS, field_0x18 & 0x4 ? true : false);
+ GXSetZCompLoc(0);
+ GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
+ DrawGX::SetBlendMode(DrawGX::BLEND_0);
+ DrawGX::SetVtxState(DrawGX::VTX_TYPE_11);
+ } else {
+ DrawGX::BeginDrawScreen(true, true, false);
+ GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_K0_A);
+ GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_TEXA, GX_CA_ZERO, GX_CA_RASA, GX_CA_ZERO);
+ GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_COMP_A8_GT, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
+ }
+
+ DrawGX::DrawDL16(forDL, tevColor);
+ GXSetZTexture(GX_ZT_DISABLE, GX_TF_Z24X8, 0);
+ }
+ freeTextureBuffers();
+ }
+ } break;
+ }
+}
+
+void DrawPathLightMap::freeTextureBuffers() {
+ if (mpTextureBuffer_0x2C) {
+ mpTextureBuffer_0x2C->free();
+ mpTextureBuffer_0x2C = nullptr;
+ }
+ if (mpTextureBuffer_0x28) {
+ mpTextureBuffer_0x28->free();
+ mpTextureBuffer_0x28 = nullptr;
+ }
+}
+
+} // namespace EGG