1#include <lib/egg/core/eggColorFader.h>
3#include <revolution/GX.h>
7ColorFader::ColorFader(
float x,
float y,
float w,
float h, nw4r::ut::Color color,
8 Fader::EStatus initialStatus)
13 mDims(x, y, x + w, y + h) {
15 setStatus(initialStatus);
16 mFlag.setBit(ColorFader::SIGNAL_ON_FADE_OUT);
19void ColorFader::setFrame(u16 frame) {
20 EGG_ASSERT(frame != 0);
25 mCurrColor.r = color.r;
26 mCurrColor.g = color.g;
27 mCurrColor.b = color.b;
31void ColorFader::setStatus(Fader::EStatus status) {
32 if (status == Fader::OPAQUE) {
33 mStatus = Fader::OPAQUE;
35 }
else if (status == Fader::HIDDEN) {
36 mStatus = Fader::HIDDEN;
41bool ColorFader::fadeIn() {
42 bool start = mStatus == Fader::OPAQUE;
44 mStatus = Fader::FADE_IN;
51bool ColorFader::fadeOut() {
52 bool start = mStatus == Fader::HIDDEN;
54 mStatus = Fader::FADE_OUT;
61bool ColorFader::calc() {
64 if (mStatus == Fader::HIDDEN) {
66 }
else if (mStatus == Fader::OPAQUE) {
68 }
else if (mStatus == Fader::FADE_IN) {
69 u16 endFrame = mFrameCount;
70 u16 currFrame = mFrame++;
72 if (currFrame > endFrame) {
73 mStatus = Fader::HIDDEN;
74 result = mFlag.onBit(ColorFader::SIGNAL_ON_FADE_IN);
78 mCurrColor.a = 255 - (currFrame * 255 / mFrameCount);
79 }
else if (mStatus == Fader::FADE_OUT) {
80 u16 endFrame = mFrameCount;
81 u16 currFrame = mFrame++;
83 if (currFrame > endFrame) {
84 if (currFrame > endFrame + 1) {
85 mStatus = Fader::OPAQUE;
86 result = mFlag.onBit(ColorFader::SIGNAL_ON_FADE_OUT);
89 endFrame = mFrameCount;
93 mCurrColor.a = currFrame * 255 / endFrame;
99void ColorFader::draw() {
100 if (mCurrColor.a == 0) {
105 C_MTXOrtho(projMtx, mDims.top, mDims.bottom, mDims.left, mDims.right, 0.0f, 1.0f);
106 GXSetProjection(projMtx, GX_ORTHOGRAPHIC);
108 GXSetViewport(mDims.left, mDims.top, mDims.GetWidth(), mDims.GetHeight(), 0.0f, 1.0f);
109 GXSetScissor(mDims.left, mDims.top, mDims.GetWidth(), mDims.GetHeight());
112 PSMTXIdentity(posMtx);
113 GXLoadPosMtxImm(posMtx, 0);
117 GXInvalidateVtxCache();
119 GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
120 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
123 GXSetChanMatColor(GX_COLOR0A0, mCurrColor);
124 GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
127 GXSetNumIndStages(0);
128 __GXSetIndirectMask(0);
130 GXSetNumTevStages(1);
131 GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
132 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
134 if (mCurrColor.a == 255) {
135 GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET);
137 GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
142 GXSetZMode(0, GX_NEVER, 0);
143 GXSetCullMode(GX_CULL_BACK);
145 GXBegin(GX_QUADS, GX_VTXFMT0, 4);
147 GXPosition3f32(mDims.left, mDims.top, 0.0f);
148 GXPosition3f32(mDims.right, mDims.top, 0.0f);
149 GXPosition3f32(mDims.right, mDims.bottom, 0.0f);
150 GXPosition3f32(mDims.left, mDims.bottom, 0.0f);