mirror of
https://github.com/zeldaret/ss
synced 2026-08-04 17:10:01 -04:00
Some PostEffect
This commit is contained in:
@@ -26,6 +26,7 @@ Matrix34f &LookAtCamera::getViewMatrixOld() {
|
||||
}
|
||||
|
||||
void LookAtCamera::doUpdateMatrix() {
|
||||
// NONMATCHING
|
||||
mOtherMtx.copyFrom(mViewMtx);
|
||||
EGG::Vector3f posRight = mPosition;
|
||||
posRight -= mRight;
|
||||
@@ -61,6 +62,7 @@ OrthoCamera::OrthoCamera() {
|
||||
}
|
||||
|
||||
void OrthoCamera::update_parms() {
|
||||
// NONMATCHING
|
||||
f32 z = field_0x8C;
|
||||
f32 sin = Math<f32>::sin(field_0x88);
|
||||
f32 cos = Math<f32>::cos(field_0x88);
|
||||
|
||||
@@ -132,4 +132,80 @@ void CpuTexture::allocate(Heap *pHeap) {
|
||||
alloc(pHeap);
|
||||
}
|
||||
|
||||
void CpuTexture::setColor(u16 x, u16 y, GXColor color) {
|
||||
// NONMATCHING
|
||||
switch (getFormat()) {
|
||||
case GX_TF_RGBA8:
|
||||
case GX_TF_Z24X8: {
|
||||
int offset = ((x >> 2) + (y >> 2) * (getWidth() / 4)) * 0x40 + (y & 3) * 8 + (x & 3) * 2;
|
||||
u8 *dat = static_cast<u8 *>(getBuffer()) + offset;
|
||||
dat[0] = color.a;
|
||||
dat[1] = color.r;
|
||||
dat[0x20] = color.g;
|
||||
dat[0x21] = color.b;
|
||||
break;
|
||||
}
|
||||
case GX_TF_I8:
|
||||
case GX_TF_Z8: {
|
||||
// TODO
|
||||
int offset = ((x >> 3) + (y >> 2) * (getWidth() / 8)) * 0x20 + (x & 3) * 8 + (x & 7);
|
||||
u8 *dat = static_cast<u8 *>(getBuffer()) + offset;
|
||||
dat[0] = color.r;
|
||||
break;
|
||||
}
|
||||
|
||||
case GX_TF_IA8:
|
||||
case GX_TF_Z16: {
|
||||
int offset = ((x >> 2) + (y >> 2) * (getWidth() / 4)) * 0x20 + (y & 3) * 8 + (x & 3) * 2;
|
||||
u8 *dat = static_cast<u8 *>(getBuffer()) + offset;
|
||||
dat[0] = color.a;
|
||||
dat[1] = color.r;
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
GXColor CpuTexture::getColor(u16 x, u16 y) const {
|
||||
// NONMATCHING
|
||||
GXColor c;
|
||||
switch (getFormat()) {
|
||||
case GX_TF_RGBA8:
|
||||
case GX_TF_Z24X8: {
|
||||
int offset = ((x >> 2) + (y >> 2) * (getWidth() / 4)) * 0x40 + (y & 3) * 8 + (x & 3) * 2;
|
||||
u8 *dat = static_cast<u8 *>(getBuffer()) + offset;
|
||||
c.r = dat[1];
|
||||
c.g = dat[0x20];
|
||||
c.b = dat[0x21];
|
||||
c.a = dat[0];
|
||||
break;
|
||||
}
|
||||
case GX_TF_I8:
|
||||
case GX_TF_Z8: {
|
||||
// TODO
|
||||
int offset = ((x >> 3) + (y >> 2) * (getWidth() / 8)) * 0x20 + (x & 3) * 8 + (x & 7);
|
||||
u8 *dat = static_cast<u8 *>(getBuffer()) + offset;
|
||||
c.a = dat[0];
|
||||
c.b = dat[0];
|
||||
c.g = dat[0];
|
||||
c.r = dat[0];
|
||||
break;
|
||||
}
|
||||
|
||||
case GX_TF_IA8:
|
||||
case GX_TF_Z16: {
|
||||
int offset = ((x >> 2) + (y >> 2) * (getWidth() / 4)) * 0x20 + (y & 3) * 8 + (x & 3) * 2;
|
||||
u8 *dat = static_cast<u8 *>(getBuffer()) + offset;
|
||||
// TODO
|
||||
c.a = dat[0];
|
||||
c.b = dat[1];
|
||||
c.g = dat[1];
|
||||
c.r = dat[1];
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
} // namespace EGG
|
||||
|
||||
@@ -96,7 +96,7 @@ void PostEffectBase::setBlendModeInternal() {
|
||||
}
|
||||
}
|
||||
|
||||
void PostEffectBase::fn_804AF040(GXColor &out, const GXColor &c, bool bClamp, f32 amount) {
|
||||
void PostEffectBase::scaleColor(GXColor &out, const GXColor &c, bool bClamp, f32 amount) {
|
||||
f32 fs[4];
|
||||
fs[0] = c.r * amount;
|
||||
fs[1] = c.g * amount;
|
||||
@@ -116,7 +116,7 @@ void PostEffectBase::fn_804AF040(GXColor &out, const GXColor &c, bool bClamp, f3
|
||||
}
|
||||
}
|
||||
|
||||
void PostEffectBase::fn_804AF1B0(GXColor &out, const GXColor &c1, const GXColor &c2, f32 amount) {
|
||||
void PostEffectBase::lerpColor(GXColor &out, const GXColor &c1, const GXColor &c2, f32 amount) {
|
||||
out.r = c1.r + amount * (c2.r - c1.r);
|
||||
out.g = c1.g + amount * (c2.g - c1.g);
|
||||
out.b = c1.b + amount * (c2.b - c1.b);
|
||||
|
||||
@@ -1,3 +1,131 @@
|
||||
#include "egg/gfx/eggPostEffectBlur.h"
|
||||
|
||||
namespace EGG {} // namespace EGG
|
||||
#include "common.h"
|
||||
#include "egg/gfx/eggDrawGX.h"
|
||||
#include "egg/gfx/eggGXUtility.h"
|
||||
#include "math.h"
|
||||
#include "nw4r/math/math_triangular.h"
|
||||
#include "nw4r/math/math_types.h"
|
||||
#include "rvl/GX/GXAttr.h"
|
||||
#include "rvl/GX/GXBump.h"
|
||||
#include "rvl/GX/GXTev.h"
|
||||
#include "rvl/GX/GXTransform.h"
|
||||
#include "rvl/GX/GXTypes.h"
|
||||
#include "rvl/MTX/mtx.h"
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
void PostEffectBlur::draw(f32 width, f32 height) {
|
||||
// NONMATCHING
|
||||
loadTextureInternal();
|
||||
setMatColorChannel();
|
||||
setMatInd();
|
||||
setMatPE();
|
||||
setVtxState();
|
||||
f32 f1 = 1.0f / mpCapTexture->getWidth();
|
||||
f32 f2 = 1.0f / mpCapTexture->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++) {
|
||||
drawInternal(i, b, f1, f2);
|
||||
drawScreenInternal(mOffsetX, mOffsetY, width * mScaleX, height * mScaleY);
|
||||
DrawGX::SetBlendMode(DrawGX::BLEND_2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PostEffectBlur::drawInternal(u8 kernelIdx, u8 p2, f32 f1, f32 f2) {
|
||||
// NONMATCHING
|
||||
nw4r::math::MTX34 mtx;
|
||||
Kernel &k = field_0x38[kernelIdx];
|
||||
|
||||
// Some regswaps and instruction swaps only at the start of the function
|
||||
f32 unk_00 = k.field_0x00;
|
||||
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;
|
||||
|
||||
u8 numTexGens = k.field_0x00 - unk_00_scale;
|
||||
if (numTexGens > 8) {
|
||||
numTexGens = 8;
|
||||
}
|
||||
|
||||
getBaseTexMtx(&mtx);
|
||||
GXSetNumTexGens(numTexGens);
|
||||
for (int id = 0; id < numTexGens; id++) {
|
||||
int texMtxId = GXUtility::getTexMtxID(id);
|
||||
GXSetTexCoordGen2(static_cast<GXTexCoordID>(id), GX_TG_MTX2x4, GX_TG_TEX0, texMtxId, false, 0x7D);
|
||||
f32 sin, cos;
|
||||
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
|
||||
// clang-format on
|
||||
);
|
||||
// OK from here
|
||||
PSMTXConcat(m, mtx, m);
|
||||
GXLoadTexMtxImm(m, texMtxId, GX_MTX_2x4);
|
||||
unk_00_scale++;
|
||||
}
|
||||
|
||||
bool isSmallColor = k.field_0x01.r < 0x80 && k.field_0x01.g < 0x80 && k.field_0x01.b < 0x80;
|
||||
bool isSmallAlpha = k.field_0x01.a < 0x80;
|
||||
f32 colorScale = (isSmallColor ? 2.0f : 1.0f) * field_0x30;
|
||||
f32 alphaScale = (isSmallAlpha ? 2.0f : 1.0f) * field_0x30;
|
||||
|
||||
f32 clrs[] = {
|
||||
k.field_0x01.r * colorScale,
|
||||
k.field_0x01.g * colorScale,
|
||||
k.field_0x01.b * colorScale,
|
||||
k.field_0x01.a * alphaScale,
|
||||
};
|
||||
GXColor clr;
|
||||
clr.r = clrs[0] < 255.0f ? clrs[0] : 255.0f;
|
||||
clr.g = clrs[1] < 255.0f ? clrs[1] : 255.0f;
|
||||
clr.b = clrs[2] < 255.0f ? clrs[2] : 255.0f;
|
||||
clr.a = clrs[3] < 255.0f ? clrs[3] : 255.0f;
|
||||
|
||||
GXSetTevKColor(GX_KCOLOR0, clr);
|
||||
GXSetNumTevStages(numTexGens);
|
||||
for (int id = 0; id < numTexGens; id++) {
|
||||
GXTevStageID stage = static_cast<GXTevStageID>(id);
|
||||
GXSetTevDirect(stage);
|
||||
GXSetTevSwapMode(stage, GX_TEV_SWAP0, GX_TEV_SWAP0);
|
||||
GXTevColorArg a1 = id > 0 ? GX_CC_CPREV : GX_CC_ZERO;
|
||||
GXTevAlphaArg a2 = id > 0 ? GX_CA_APREV : GX_CA_ZERO;
|
||||
|
||||
GXSetTevKColorSel(stage, GX_TEV_KCSEL_K0);
|
||||
GXSetTevKAlphaSel(stage, GX_TEV_KASEL_K0_A);
|
||||
GXSetTevOrder(stage, static_cast<GXTexCoordID>(id), 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);
|
||||
|
||||
bool isLast = stage == numTexGens - 1;
|
||||
bool colorArg = isLast;
|
||||
|
||||
GXTevScale colorScale = isSmallColor && isLast ? GX_CS_DIVIDE_2 : GX_CS_SCALE_1;
|
||||
GXTevScale alphaScale = isSmallAlpha && colorArg ? GX_CS_DIVIDE_2 : GX_CS_SCALE_1;
|
||||
GXSetTevColorOp(stage, GX_TEV_ADD, GX_TB_ZERO, colorScale, colorArg, GX_TEVPREV);
|
||||
GXSetTevAlphaOp(stage, GX_TEV_ADD, GX_TB_ZERO, alphaScale, isLast, GX_TEVPREV);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace EGG
|
||||
|
||||
@@ -15,7 +15,7 @@ void PostEffectMask::setMaterialInternal() {
|
||||
bool hasTex2 = mpCapTexture2 != nullptr;
|
||||
loadTextureInternal();
|
||||
GXColor resColor;
|
||||
fn_804AF040(resColor, mColor, false, field_0x34);
|
||||
scaleColor(resColor, mColor, false, field_0x34);
|
||||
setMatColorChannel();
|
||||
GXSetNumTexGens(2);
|
||||
|
||||
|
||||
@@ -1,3 +1,94 @@
|
||||
#include "egg/gfx/eggPostEffectUnk1.h"
|
||||
|
||||
namespace EGG {} // namespace EGG
|
||||
#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"
|
||||
#include "rvl/GX/GXTev.h"
|
||||
#include "rvl/GX/GXTransform.h"
|
||||
#include "rvl/GX/GXTypes.h"
|
||||
|
||||
namespace EGG {
|
||||
|
||||
PostEffectUnk1::PostEffectUnk1() {
|
||||
// NONMATCHING
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void PostEffectUnk1::setMaterialInternal() {
|
||||
u8 hasExtraStage = (mpCapTexture != nullptr && (field_0x2D & 1) == 0) ? 1 : 0;
|
||||
u8 numStages = field_0x2C + hasExtraStage * 2;
|
||||
setMatColorChannel();
|
||||
nw4r::math::MTX34 mtx;
|
||||
getBaseTexMtx(&mtx);
|
||||
u8 numStagesFirst = field_0x2C + hasExtraStage;
|
||||
GXSetNumTexGens(numStagesFirst);
|
||||
for (int i = 0; i < numStagesFirst; i++) {
|
||||
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);
|
||||
} else {
|
||||
loadTextureInternal();
|
||||
}
|
||||
GXLoadTexMtxImm(mtx, texMtxIdx, GX_MTX_2x4);
|
||||
}
|
||||
|
||||
f32 v = field_0x30 * 255.0f;
|
||||
GXColor c = {v, v, v, v};
|
||||
setMatInd();
|
||||
GXSetNumTevStages(numStages);
|
||||
|
||||
for (int i = 0; i < numStages; i++) {
|
||||
Kernel &k = field_0x34[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);
|
||||
|
||||
GXSetTevKColorSel(stage, static_cast<GXTevKColorSel>(GX_TEV_KCSEL_K0 + i));
|
||||
GXSetTevKAlphaSel(stage, static_cast<GXTevKAlphaSel>(GX_TEV_KASEL_K0_A + i));
|
||||
|
||||
GXSetTevKColor(static_cast<GXTevKColorID>(i), scaledColor);
|
||||
GXSetTevOrder(stage, static_cast<GXTexCoordID>(i), k.mTexMapId, GX_COLOR_NULL);
|
||||
GXSetTevColorIn(stage, GX_CC_ZERO, GX_CC_TEXC, GX_CC_KONST, stage == 0 ? GX_CC_ZERO : GX_CC_CPREV);
|
||||
GXSetTevColorOp(
|
||||
stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, i == field_0x2C - 1 ? GX_TEVREG0 : GX_TEVPREV
|
||||
);
|
||||
GXSetTevAlphaIn(stage, GX_CA_ZERO, GX_CA_TEXA, GX_CA_KONST, stage == 0 ? GX_CA_ZERO : GX_CA_APREV);
|
||||
GXSetTevAlphaOp(
|
||||
stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, i == field_0x2C - 1 ? GX_TEVREG0 : GX_TEVPREV
|
||||
);
|
||||
} else if (stage == field_0x2C) {
|
||||
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);
|
||||
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);
|
||||
GXSetTevAlphaOp(stage, GX_TEV_SUB, GX_TB_ZERO, GX_CS_SCALE_4, true, GX_TEVPREV);
|
||||
} else {
|
||||
GXSetTevOrder(stage, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
|
||||
GXSetTevColorIn(stage, GX_CC_C0, GX_CC_ZERO, GX_CC_CPREV, GX_CC_ZERO);
|
||||
GXSetTevColorOp(stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
|
||||
GXSetTevAlphaIn(stage, GX_CA_A0, GX_CA_ZERO, GX_CA_APREV, GX_CA_ZERO);
|
||||
GXSetTevAlphaOp(stage, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, true, GX_TEVPREV);
|
||||
}
|
||||
}
|
||||
setMatPE();
|
||||
}
|
||||
|
||||
} // namespace EGG
|
||||
|
||||
Reference in New Issue
Block a user