summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-06-16 11:56:52 +0200
committerrobojumper <robojumper@gmail.com>2024-06-16 11:56:52 +0200
commit22edfeae16eedf3d5c65f219212ff5bf2675ae66 (patch)
treedddda004b144e4b1d915577c788b130f9d290860 /src
parenta1871d7d9470915899b981491e25bc2269cc8e19 (diff)
m_faders
Diffstat (limited to 'src')
-rw-r--r--src/m/m_color_fader.cpp105
-rw-r--r--src/m/m_fader.cpp36
-rw-r--r--src/m/m_fader_base.cpp68
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;
+}