diff options
| author | robojumper <robojumper@gmail.com> | 2024-06-16 11:56:52 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-06-16 11:56:52 +0200 |
| commit | 22edfeae16eedf3d5c65f219212ff5bf2675ae66 (patch) | |
| tree | dddda004b144e4b1d915577c788b130f9d290860 /src | |
| parent | a1871d7d9470915899b981491e25bc2269cc8e19 (diff) | |
m_faders
Diffstat (limited to 'src')
| -rw-r--r-- | src/m/m_color_fader.cpp | 105 | ||||
| -rw-r--r-- | src/m/m_fader.cpp | 36 | ||||
| -rw-r--r-- | src/m/m_fader_base.cpp | 68 |
3 files changed, 209 insertions, 0 deletions
diff --git a/src/m/m_color_fader.cpp b/src/m/m_color_fader.cpp new file mode 100644 index 00000000..66a03b35 --- /dev/null +++ b/src/m/m_color_fader.cpp @@ -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(); +} diff --git a/src/m/m_fader.cpp b/src/m/m_fader.cpp new file mode 100644 index 00000000..8f88a4ab --- /dev/null +++ b/src/m/m_fader.cpp @@ -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; +} diff --git a/src/m/m_fader_base.cpp b/src/m/m_fader_base.cpp new file mode 100644 index 00000000..ae5c182b --- /dev/null +++ b/src/m/m_fader_base.cpp @@ -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; +} |
