mirror of
https://github.com/zeldaret/ss
synced 2026-06-05 11:18:01 -04:00
PostEffect Progress
This commit is contained in:
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<f32>::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<f32>::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<GXTexCoordID>(id), mTexMapId, GX_COLOR_NULL);
|
||||
GXSetTevOrder(stage, static_cast<GXTexCoordID>(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);
|
||||
|
||||
|
||||
@@ -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<GXTexCoordID>(i), mTexMapId, GX_COLOR_NULL);
|
||||
GXSetTevOrder(stage, static_cast<GXTexCoordID>(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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user