mirror of
https://github.com/zeldaret/ss
synced 2026-08-19 05:51:59 -04:00
m_faders
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
#include <m/m_color_fader.h>
|
||||
#include <rvl/SC.h>
|
||||
#include <rvl/VI.h>
|
||||
|
||||
mColorFader_c::mColorFader_c(const mColor &color, EStatus status) : mFaderBase_c(color, status) {
|
||||
mAspectRatio = SCGetAspectRatio();
|
||||
}
|
||||
|
||||
mColorFader_c::~mColorFader_c() {}
|
||||
|
||||
void mColorFader_c::setStatus(EStatus status) {
|
||||
if (status == FADED_OUT) {
|
||||
mStatus = FADED_OUT;
|
||||
mFaderColor.a = 0xff;
|
||||
} else if (status == FADED_IN) {
|
||||
mStatus = FADED_IN;
|
||||
mFaderColor.a = 0;
|
||||
}
|
||||
}
|
||||
|
||||
u8 mColorFader_c::calc() {
|
||||
u8 result = mFaderBase_c::calc();
|
||||
u16 elapsed = mElapsed;
|
||||
u16 frame = mFrame;
|
||||
if (elapsed > mFrame) {
|
||||
elapsed = frame;
|
||||
}
|
||||
|
||||
switch (mStatus) {
|
||||
case FADED_IN:
|
||||
mFaderColor.a = 0;
|
||||
break;
|
||||
case FADED_OUT:
|
||||
mFaderColor.a = 0xff;
|
||||
break;
|
||||
case FADING_IN:
|
||||
mFaderColor.a = 0xff - (elapsed * 0xff / frame);
|
||||
break;
|
||||
case FADING_OUT:
|
||||
mFaderColor.a = elapsed * 0xff / frame;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#define VI_VIRTUAL_HALF_WIDTH_WIDE (406.0f)
|
||||
#define VI_VIRTUAL_HALF_WIDTH_STD (304.0f)
|
||||
#define VI_VIRTUAL_HALF_HEIGHT (228.0f)
|
||||
|
||||
void mColorFader_c::draw() {
|
||||
f32 h = (mAspectRatio == 1) ? VI_VIRTUAL_HALF_WIDTH_WIDE : VI_VIRTUAL_HALF_WIDTH_STD;
|
||||
|
||||
if (mFaderColor.a == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Mtx44 projMtx;
|
||||
C_MTXOrtho(projMtx, -VI_VIRTUAL_HALF_HEIGHT, VI_VIRTUAL_HALF_HEIGHT, -h, h, 0, 1);
|
||||
GXSetProjection(projMtx, GX_ORTHOGRAPHIC);
|
||||
|
||||
Mtx posMtx;
|
||||
PSMTXIdentity(posMtx);
|
||||
GXLoadPosMtxImm(posMtx, 0);
|
||||
GXSetCurrentMtx(0);
|
||||
|
||||
GXClearVtxDesc();
|
||||
GXInvalidateVtxCache();
|
||||
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
||||
|
||||
GXSetNumChans(1);
|
||||
GXSetChanMatColor(GX_COLOR0A0, mFaderColor);
|
||||
GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
|
||||
|
||||
GXSetNumTexGens(0);
|
||||
GXSetNumIndStages(0);
|
||||
__GXSetIndirectMask(0);
|
||||
|
||||
GXSetNumTevStages(1);
|
||||
GXSetTevOp(GX_TEVSTAGE0, 4);
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
|
||||
|
||||
if (mFaderColor.a == 255) {
|
||||
GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET);
|
||||
} else {
|
||||
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
|
||||
}
|
||||
|
||||
GXSetColorUpdate(1);
|
||||
GXSetAlphaUpdate(1);
|
||||
GXSetZMode(0, GX_NEVER, 0);
|
||||
GXSetCullMode(GX_CULL_BACK);
|
||||
|
||||
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
||||
|
||||
GXPosition3f32(-h, -VI_VIRTUAL_HALF_HEIGHT, 0);
|
||||
GXPosition3f32(h, -VI_VIRTUAL_HALF_HEIGHT, 0);
|
||||
GXPosition3f32(h, VI_VIRTUAL_HALF_HEIGHT, 0);
|
||||
GXPosition3f32(-h, VI_VIRTUAL_HALF_HEIGHT, 0);
|
||||
|
||||
// GXEnd();
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#include <m/m_fader.h>
|
||||
|
||||
// nw4r::g3d::G3DState::Invalidate
|
||||
extern "C" void fn_8044E3B0(u32 flags);
|
||||
// m3d::resetMaterial according to NSMBW
|
||||
extern "C" void fn_802E46D0();
|
||||
|
||||
void mFader_c::draw() {
|
||||
fn_8044E3B0(0x7ff);
|
||||
fn_802E46D0();
|
||||
mpFader->draw();
|
||||
}
|
||||
|
||||
bool mFader_c::setFader(mFaderBase_c *fader) {
|
||||
if (mpFader != nullptr) {
|
||||
bool isFading = isStatus(mFaderBase_c::FADING_IN) || isStatus(mFaderBase_c::FADING_OUT);
|
||||
|
||||
if (isFading) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
mFaderBase_c::EStatus status = mpFader != nullptr ? mpFader->getStatus() : fader->getStatus();
|
||||
|
||||
mpFader = fader;
|
||||
switch (status) {
|
||||
case mFaderBase_c::FADED_OUT:
|
||||
fader->setStatus(mFaderBase_c::FADED_OUT);
|
||||
break;
|
||||
case mFaderBase_c::FADED_IN:
|
||||
fader->setStatus(mFaderBase_c::FADED_IN);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
#include <m/m_fader_base.h>
|
||||
|
||||
mFaderBase_c::mFaderBase_c(const mColor &color, EStatus status) : mFlag(0), mFrame(20), mElapsed(0) {
|
||||
setColor(color);
|
||||
mFlag |= FLAG_2;
|
||||
|
||||
switch (status) {
|
||||
case FADED_OUT:
|
||||
mStatus = FADED_OUT;
|
||||
break;
|
||||
case FADED_IN:
|
||||
mStatus = FADED_IN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mFaderBase_c::~mFaderBase_c() {}
|
||||
|
||||
void mFaderBase_c::setFrame(u16 frame) {
|
||||
mFrame = frame;
|
||||
}
|
||||
|
||||
void mFaderBase_c::setColor(const mColor &newColor) {
|
||||
mFaderColor.r = newColor.r;
|
||||
mFaderColor.g = newColor.g;
|
||||
mFaderColor.b = newColor.b;
|
||||
}
|
||||
|
||||
mFaderBase_c::EStatus mFaderBase_c::getStatus() const {
|
||||
return mStatus;
|
||||
}
|
||||
|
||||
bool mFaderBase_c::fadeIn() {
|
||||
bool canFadeIn = mStatus == FADED_OUT;
|
||||
if (canFadeIn) {
|
||||
mStatus = FADING_IN;
|
||||
mElapsed = 0;
|
||||
}
|
||||
|
||||
return canFadeIn;
|
||||
}
|
||||
|
||||
bool mFaderBase_c::fadeOut() {
|
||||
bool canFadeOut = mStatus == FADED_IN;
|
||||
if (canFadeOut) {
|
||||
mStatus = FADING_OUT;
|
||||
mElapsed = 0;
|
||||
}
|
||||
|
||||
return canFadeOut;
|
||||
}
|
||||
|
||||
u8 mFaderBase_c::calc() {
|
||||
u8 result = 0;
|
||||
if (mStatus == FADING_IN) {
|
||||
if (mElapsed++ > mFrame) {
|
||||
mStatus = FADED_IN;
|
||||
result = (mFlag & FLAG_1) != 0;
|
||||
}
|
||||
} else if (mStatus == FADING_OUT) {
|
||||
if (++mElapsed > mFrame + 1) {
|
||||
mStatus = FADED_OUT;
|
||||
result = (mFlag & FLAG_2) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user