summaryrefslogtreecommitdiff
path: root/src/egg/gfx/eggPostEffectMaskDOF.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/egg/gfx/eggPostEffectMaskDOF.cpp')
-rw-r--r--src/egg/gfx/eggPostEffectMaskDOF.cpp195
1 files changed, 194 insertions, 1 deletions
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