NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
m_wipe_fader.cpp
1#include <dol/mLib/m_wipe_fader.hpp>
2#include <lib/rvl/sc/SC.h>
3#include <lib/rvl/vi/VI.h>
4
5mWipeFader_c::mWipeFader_c(mColor col, mFaderBase_c::EStatus status) :
6 mFaderBase_c(col, status),
7 mpTextureData(nullptr) {
8
9 PSMTXIdentity(&mTexMtx);
10 mTexWidth = 0;
11 mTexHeight = 0;
12 if (SCGetAspectRatio() == 1) {
13 // [Should just be VI_VIRTUAL_WIDTH_WIDE / VI_VIRTUAL_WIDTH_STD,
14 // but that way of calculating the constant doesn't work...]
15 mAspectRatioFactor = 1.36842095f;
16 } else {
17 mAspectRatioFactor = 1;
18 }
19}
20
21mWipeFader_c::~mWipeFader_c() {
22}
23
24void mWipeFader_c::setTexture(void *data, int width, int height) {
25 mpTextureData = data;
26 mTexWidth = width;
27 mTexHeight = height;
28}
29
31 if (status == OPAQUE) {
33 mProgress = 255;
34 } else if (status == HIDDEN) {
36 mProgress = 0;
37 }
38}
39
41 int res = mFaderBase_c::calc();
42
43 u16 currFrame = mCurrFrame;
44 u16 endFrame = mFrameCount;
45
46 if (currFrame > mFrameCount) {
47 currFrame = mFrameCount;
48 }
49
50 switch (mStatus) {
51 case OPAQUE: mProgress = 255; break;
52 case HIDDEN: mProgress = 0; break;
53 case FADE_IN: mProgress = 255 - (currFrame * 255 / endFrame); break;
54 case FADE_OUT: mProgress = (currFrame * 255 / endFrame); break;
55 }
56
57 calcMtx();
58 return res;
59}
60
62 // Scales from 0.5x to 128.0x the screen size [This seems like a terrible scaling function...?]
63 float scale = 128.0f / (256 - mProgress);
64
65 // Move to center, scale, move back
66 PSMTXTrans(&mTexMtx, 0.5f, 0.5f, 0.0f);
67
68 Mtx scaleMtx;
69 float scrW = mAspectRatioFactor * VI_VIRTUAL_WIDTH_STD;
70 float scrH = VI_VIRTUAL_HEIGHT;
71 PSMTXScale(&scaleMtx, scale, scale * scrH / scrW, 0.0f);
72 PSMTXConcat(&mTexMtx, &scaleMtx, &mTexMtx);
73
74 Mtx transMtx;
75 PSMTXTrans(&transMtx, -0.5f, -0.5f, 0.0f);
76 PSMTXConcat(&mTexMtx, &transMtx, &mTexMtx);
77}
78
80 float width = mAspectRatioFactor * VI_VIRTUAL_HALF_WIDTH_STD;
81 if (mProgress == 0) {
82 return;
83 }
84
85 Mtx44 projMtx;
86 C_MTXOrtho(&projMtx, -VI_VIRTUAL_HALF_HEIGHT, VI_VIRTUAL_HALF_HEIGHT, -width, width, 0.0, 1.0);
87 GXSetProjection(&projMtx, 1);
88
89 Mtx posMtx;
90 PSMTXIdentity(&posMtx);
91 GXLoadPosMtxImm(&posMtx, 0);
92 GXSetCurrentMtx(0);
93 if (mProgress >= 255) {
94 GXClearVtxDesc();
95 GXInvalidateVtxCache();
96
97 GXSetVtxDesc(GX_VA_POS, GX_VA_TEX0MTXIDX);
98 GXSetVtxAttrFmt(0, GX_VA_POS, 1, 4, 0);
99
100 GXSetNumChans(1);
101 GXSetChanMatColor(GX_COLOR0A0, mFaderColor);
102 GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
103
104 GXSetNumTexGens(0);
105 GXSetNumIndStages(0);
106 __GXSetIndirectMask(0);
107
108 GXSetNumTevStages(1);
109 GXSetTevOp(GX_TEVSTAGE0, 4);
110 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
111
112 GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_SET);
113
114 GXSetColorUpdate(1);
115 GXSetAlphaUpdate(1);
116 GXSetZMode(0, GX_NEVER, 0);
117 GXSetCullMode(2);
118
119 GXBegin(GX_QUADS, GX_VTXFMT0, 4);
120
121 GXPosition3f32(-width, -VI_VIRTUAL_HALF_HEIGHT, 0);
122 GXPosition3f32(width, -VI_VIRTUAL_HALF_HEIGHT, 0);
123 GXPosition3f32(width, VI_VIRTUAL_HALF_HEIGHT, 0);
124 GXPosition3f32(-width, VI_VIRTUAL_HALF_HEIGHT, 0);
125
126 GXEnd();
127 } else {
128 GXClearVtxDesc();
129 GXInvalidateVtxCache();
130
131 GXSetVtxDesc(GX_VA_POS, GX_VA_TEX0MTXIDX);
132 GXSetVtxDesc(GX_VA_TEX0, GX_VA_TEX0MTXIDX);
133 GXSetVtxAttrFmt(0, GX_VA_POS, 1, 4, 0);
134 GXSetVtxAttrFmt(0, GX_VA_TEX0, 1, 4, 0);
135
136 GXSetNumChans(0);
137 GXSetChanMatColor(GX_COLOR0A0, mFaderColor);
138 GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
139
140 GXTexObj texObj;
141 GXInitTexObj(&texObj, mpTextureData, mTexWidth, mTexHeight, GX_TF_I4, GX_CLAMP, GX_CLAMP, 0);
142 GXLoadTexObj(&texObj, GX_TEXMAP0);
143
144 Mtx texMtx;
145 PSMTXCopy(&mTexMtx, &texMtx);
146 GXLoadTexMtxImm(&texMtx, 30, GX_MTX_2x4);
147 GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 30, 0, 125);
148
149 GXSetNumTexGens(1);
150 GXSetNumIndStages(0);
151 __GXSetIndirectMask(0);
152
153 GXSetNumTevStages(1);
154 GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
155 GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_TEV_SCALE_0, 1, GX_TEVPREV);
156 GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_TEXA);
157 GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_TEV_SCALE_0, 1, GX_TEVPREV);
158 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
159
160 GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
161
162 GXSetZCompLoc(1);
163 GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
164 GXSetZMode(0, GX_NEVER, 0);
165 GXSetCullMode(2);
166
167 GXBegin(GX_QUADS, GX_VTXFMT0, 4);
168
169 GXPosition3f32(-width, -VI_VIRTUAL_HALF_HEIGHT, 0);
170 GXTexCoord2f32(0, 0);
171 GXPosition3f32(width, -VI_VIRTUAL_HALF_HEIGHT, 0);
172 GXTexCoord2f32(1, 0);
173 GXPosition3f32(width, VI_VIRTUAL_HALF_HEIGHT, 0);
174 GXTexCoord2f32(1, 1);
175 GXPosition3f32(-width, VI_VIRTUAL_HALF_HEIGHT, 0);
176 GXTexCoord2f32(0, 1);
177
178 GXEnd();
179 }
180}
Base fader implementation.
u16 mCurrFrame
The fader's current frame.
EStatus mStatus
The fader's status.
u16 mFrameCount
The fader's duration.
mColor mFaderColor
The fader's color.
EStatus
The fader's status.
@ FADE_IN
Transition from OPAQUE to HIDDEN.
@ FADE_OUT
Transition from HIDDEN to OPAQUE.
@ HIDDEN
The screen is completely unblocked.
@ OPAQUE
The screen is completely blacked out.
virtual int calc()
Calculates the fader at the current frame.
int mTexWidth
The width of the texture.
virtual void draw()
Draws the fader.
Mtx mTexMtx
The texture matrix.
int mTexHeight
The height of the texture.
virtual void setStatus(EStatus status)
Sets the fader's status.
virtual int calc()
Calculates the fader at the current frame.
float mAspectRatioFactor
How much to stretch the texture horizontally to compensate for the screen's aspect ratio.
void * mpTextureData
The texture data.
virtual void calcMtx()
Calculates the texture matrix needed for drawing the texture to the screen.
virtual void setTexture(void *data, int width, int height)
Sets the texture to use for the fader.
u8 mProgress
A value from 0 to 255 that represents the current progress of the fader.
void PSMTXScale(Mtx *mtx, float x, float y, float z)
Sets a scaling matrix with the given components.
float Mtx44[4][4]
A 4x4 matrix.
Definition mtx.h:13
void PSMTXTrans(Mtx *mtx, float x, float y, float z)
Sets a translation matrix with the given components.
void PSMTXConcat(const Mtx *a, const Mtx *b, Mtx *out)
Concatenates two matrices.
void PSMTXCopy(const Mtx *src, Mtx *dst)
Copies a matrix.
float Mtx[3][4]
A 3x4 matrix.
Definition mtx.h:12
void PSMTXIdentity(Mtx *mtx)
Sets the given matrix to the identity matrix.
A 32-bit RGBA color.
Definition m_color.hpp:6