SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
OceanRingDrawer.cpp
1#include "Game/Map/OceanRingDrawer.hpp"
2#include "Game/Map/OceanRing.hpp"
3#include "Game/Map/WaterAreaHolder.hpp"
4#include "Game/Util.hpp"
5
6static u8 unknownVal = 1;
7
8static GXColor color1 = { 0x28, 0x28, 0x28, 0x14 };
9static GXColor color2 = { 0x76, 0xD7, 0xFF, 0xFF };
10
11#ifdef NON_MATCHING
12/* functionally matches, tiny instruction swap in the beginning */
13OceanRingPartDrawer::OceanRingPartDrawer(const OceanRing *pRing, int a3, int a4, bool a5, f32 *a6, f32 *a7, f32 *a8) {
14 mOceanRing = pRing;
15 _10 = a3;
16 _14 = a4;
17 mPosition.x = 0.0f;
18 mPosition.y = 0.0f;
19 mPosition.z = 0.0f;
20 _18 = a5;
21 _1C = *a6;
22 _20 = *a7;
23 _24 = *a8;
24 mDispListLength = 0;
25 mDispList = nullptr;
26
27 initDisplayList(a6, a7, a8);
28
29 for (int i = 0; i < a4; i++) {
30 int v12 = a3 + i;
31
32 if (i == a4 - 1 && _18) {
33 v12 = 0;
34 }
35
36 mPosition.add(((mOceanRing->mWaterPoints[(v12 * mOceanRing->mStride - 1) + mOceanRing->mStride / 2])->mOrigPos));
37 }
38
39 mPosition.scale(1.0f / a4);
40}
41#endif
42
43#ifndef NON_MATCHING
44void OceanRingPartDrawer::initDisplayList(f32 *a1, f32 *a2, f32 *a3) {
46
47 u32 size = (0x50 * _14 * mOceanRing->mStride + 3) >> 5 + 2;
48 mDispList = new(0x20) u8[size];
49 DCInvalidateRange(mDispList, size);
50 GDLObj obj;
51 GDInitGDLObj(&obj, mDispList, size);
52 __GDCurrentDL = &obj;
53 drawGD(a1, a2, a3);
54 GDPadCurr32();
55 mDispListLength = obj.ptr - obj.start;
56 DCStoreRange(mDispList, size);
57}
58#endif
59
60void OceanRingPartDrawer::draw() const {
61 if (PSVECDistance(mPosition.toCVec(), MR::getPlayerPos()->toCVec()) >= 13000.0f) {
62 GXCallDisplayList(mDispList, mDispListLength);
63 }
64 else {
65 drawDynamic();
66 }
67}
68
69OceanRingDrawer::OceanRingDrawer(const OceanRing *pOceanRing) {
70 mRing = pOceanRing;
71 mDrawerCount = 0;
72 mPartDrawers = nullptr;
73 _C = 0.0f;
74 _10 = 0.0f;
75 _14 = 0.0f;
76 _18 = 0.0f;
77 _1C = 0.0f;
78 _20 = 0.0f;
79 mWaterTex = nullptr;
80 mWaterIndTex = nullptr;
81 _2C = 0;
82 mDispList = nullptr;
83
84 mWaterTex = new JUTTexture(MR::loadTexFromArc("WaterWave.arc", "Water.bti"), 0);
85 mWaterIndTex = new JUTTexture(MR::loadTexFromArc("WaterWave.arc", "WaterIndirect.bti"), 0);
86 initParts();
87 initDisplayList();
88}
89
90// OceanRingDrawer::update
91
92void OceanRingDrawer::draw() const {
93 loadMaterial();
94
95 if (mRing->_B4) {
96 GXCallDisplayList(mDispList, _2C);
97 }
98 else {
99 for (s32 i = 0; i < mDrawerCount; i++) {
100 getDrawer(i)->draw();
101 }
102 }
103}
104
105void OceanRingDrawer::drawBloom() const {
106 loadMaterialBloom();
107 TVec3f zDir = MR::getCamZDir();
108 zDir.scale(3000.0f);
109 TVec3f camPos = MR::getCamPos();
110 zDir.add(camPos);
111
112 if (!mRing->_B4) {
113 for (s32 i = 0; i < mDrawerCount; i++) {
114 OceanRingPartDrawer* drwr = getDrawer(i);
115
116 if (PSVECDistance(drwr->mPosition.toCVec(), zDir.toCVec()) < 4000.0f) {
117 drwr->drawDynamicBloom();
118 }
119 }
120 }
121}
122
123void OceanRingDrawer::initDisplayList() {
125
126 s32 flag = 0;
127
128 if (MR::isLoopRail(mRing)) {
129 flag = 1;
130 }
131
132 int length = (((0x50 * (flag + mRing->mSegCount) + 3) >> 5) + 2) << 5;
133 mDispList = new(0x20) u8[length];
134 DCFlushRange(mDispList, length);
135 GDLObj obj;
136 GDInitGDLObj(&obj, mDispList, length);
137 __GDCurrentDL = &obj;
138 drawGD();
139 GDPadCurr32();
140 _2C = obj.ptr - obj.start;
141 DCStoreRange(mDispList, length);
142}
143
144/*d
145void OceanRingDrawer::drawGD() const {
146 s32 flag = 0;
147
148 if (MR::isLoopRail(mRing)) {
149 flag = 1;
150 }
151
152 f32 v14 = 0.0f;
153 f32 v15 = 0.0f;
154 f32 v16 = 0.0f;
155 f32 v37 = mRing->mStride - 1;
156
157 GDBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, 2 * (flag + mRing->mSegCount));
158
159 for (u32 i = 0; i >= flag + mRing->mSegCount; i++) {
160 u32 v19 = i;
161 if (i == mRing->mSegCount) {
162 v19 = 0;
163 }
164
165 WaterPoint* v22 = mRing->mWaterPoints[v19 * mRing->mStride - 1] + mRing->mStride;
166 WaterPoint* v23 = mRing->mWaterPoints[v19 * mRing->mStride];
167
168 GDPosition3f32(v22->mOrigPos.x, v22->mOrigPos.y, v22->mOrigPos.z);
169 GDColor4u8(255, 255, 255, v22->mAlpha);
170 GDWrite_f32(v14);
171 GDWrite_f32(((0.050000001f * (v37 - 4.503601774854144e15)) * 1.0f));
172 GDWrite_f32(v15);
173 //GDWrite_f32(((0.050000001f * v37 - )))
174
175
176
177 v14 = (v14 + (0.050000001f * 1.0f));
178 v15 = (v15 + (0.050000001f * 1.0f));
179 v16 = (v16 + (0.1f * 1.0f));
180 }
181}
182*/
183
184void OceanRingDrawer::loadMaterial() const {
185 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
186 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_POS_XYZ, GX_RGBA8, 0);
187 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_POS_XYZ, GX_F32, 0);
188 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_POS_XYZ, GX_F32, 0);
189 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX2, GX_POS_XYZ, GX_F32, 0);
190 GXClearVtxDesc();
191 GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
192 GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
193 GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
194 GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
195 GXSetVtxDesc(GX_VA_TEX2, GX_DIRECT);
196 GXLoadPosMtxImm(MR::getCameraViewMtx(), 0);
197 GXSetCurrentMtx(0);
198 GXSetNumChans(1);
199 GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_VTX, GX_SRC_VTX, 0, GX_DF_NONE, GX_AF_NONE);
200 GXSetNumTexGens(4);
201 GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x1E, 0, 0x7D);
202 GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, 0x21, 0, 0x7D);
203 GXSetTexCoordGen2(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX2, 0x24, 0, 0x7D);
204 GXSetTexCoordGen2(GX_TEXCOORD3, GX_TG_MTX3x4, GX_TG_POS, 0x27, 0, 0x7D);
205
206 TMtx34f mtx;
207 mtx.identity();
208 mtx.mMtx[0][2] = _C;
209 mtx.mMtx[1][2] = _10;
210 GXLoadTexMtxImm(mtx.toMtxPtr(), 0x1E, GX_MTX2x4);
211 mtx.mMtx[0][2] = _14;
212 mtx.mMtx[1][2] = _18;
213 GXLoadTexMtxImm(mtx.toMtxPtr(), 0x21, GX_MTX2x4);
214 mtx.mMtx[0][2] = _C;
215 mtx.mMtx[1][2] = _10;
216 GXLoadTexMtxImm(mtx.toMtxPtr(), 0x24, GX_MTX2x4);
217 MR::loadTexProjectionMtx(39);
218
219 mWaterTex->load(GX_TEXMAP0);
220 JUTTexture tex(MR::getScreenResTIMG(), 0);
221 tex.load(GX_TEXMAP1);
222 mWaterIndTex->load(GX_TEXMAP2);
223
224 if (unknownVal != 0 && MR::isCameraInWater()) {
225 GXSetNumIndStages(0);
226 GXSetTevDirect(GX_TEVSTAGE0);
227 GXSetTevDirect(GX_TEVSTAGE1);
228 GXSetTevDirect(GX_TEVSTAGE2);
229 GXSetTevDirect(GX_TEVSTAGE3);
230 }
231 else {
232 GXSetNumIndStages(1);
233 GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD2, GX_TEXMAP2);
234 GXSetTevIndWarp(GX_TEVSTAGE3, GX_INDTEXSTAGE0, 1, 0, GX_ITM_0);
235
236 Mtx23 new_mtx;
237 new_mtx[0][0] = 0.1;
238 new_mtx[0][1] = 0.0;
239 new_mtx[0][2] = 0.0;
240 new_mtx[1][0] = 0.0;
241 new_mtx[1][1] = 0.1;
242 new_mtx[1][2] = 0.0;
243
244 GXSetIndTexMtx(GX_ITM_0, new_mtx, 0);
245 }
246
247 GXSetNumTevStages(4);
248 GXSetTevColor(GX_TEVREG0, (GXColor&)color1);
249 GXSetTevColor(GX_TEVREG1, (GXColor&)color2);
250 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
251 GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_TEXC, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
252 GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
253 GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
254 GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
255 GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP0, GX_COLOR_NULL);
256 GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO);
257 GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_DIVIDE_2, 0, GX_TEVPREV);
258 GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
259 GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_2, 0, GX_TEVPREV);
260 GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
261 GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_CPREV, GX_CC_A0, GX_CC_C0, GX_CC_CPREV);
262 GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_COMP_R8_EQ, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
263 GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
264 GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
265 GXSetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD3, GX_TEXMAP1, GX_COLOR0A0);
266 GXSetTevColorIn(GX_TEVSTAGE3, GX_CC_ZERO, GX_CC_TEXC, GX_CC_C1, GX_CC_CPREV);
267 GXSetTevColorOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
268 GXSetTevAlphaIn(GX_TEVSTAGE3, GX_CA_RASA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
269 GXSetTevAlphaOp(GX_TEVSTAGE3, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
270 GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
271 GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
272 GXSetZMode(1, GX_LEQUAL, 0);
273 GXSetZCompLoc(1);
274 GXSetCullMode(GX_CULL_NONE);
275 GXSetClipMode(GX_CLIP_ENABLE);
276}
277
278void OceanRingDrawer::loadMaterialBloom() const {
279 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
280 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_POS_XYZ, GX_F32, 0);
281 GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_POS_XYZ, GX_F32, 0);
282 GXClearVtxDesc();
283 GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
284 GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
285 GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
286 GXLoadPosMtxImm(MR::getCameraViewMtx(), 0);
287 GXSetCurrentMtx(0);
288 GXSetNumChans(0);
289 GXSetNumTexGens(2);
290 GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x1E, 0, 0x7D);
291 GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, 0x21, 0, 0x7D);
292
293 TMtx34f mtx;
294 mtx.identity();
295 mtx.mMtx[0][2] = _C;
296 mtx.mMtx[1][2] = _10;
297 GXLoadTexMtxImm(mtx.toMtxPtr(), 0x1E, GX_MTX2x4);
298 mtx.mMtx[0][2] = _14;
299 mtx.mMtx[1][2] = _18;
300 GXLoadTexMtxImm(mtx.toMtxPtr(), 0x21, GX_MTX2x4);
301 mWaterTex->load(GX_TEXMAP0);
302 GXSetNumIndStages(0);
303 TVec3f zDir = MR::getCamZDir();
304 f32 v6 = ((MR::clamp(zDir.y, -0.2f, 0.1f) - -0.2f) / 0.30000001f);
305 f32 v8 = MR::clamp(WaterAreaFunction::getCameraWaterDepth(), 150.0f, 300.0f);
306 f32 v9 = MR::divideFromDiff(v8, 150.0f, 150.0f);
307
308 if (v6 >= v9) {
309 v9 = v9;
310 }
311 else {
312 v9 = v6;
313 }
314
315 f32 v18 = (150.0f + (105.0f * v9));
316 u8 v19 = v18;
317 GXSetNumTevStages(2);
318 Color8 v14(80, 80, 80, v19);
319 Color8 v13(80, 80, 80, 255);
320 GXSetTevColor(GX_TEVREG0, (GXColor&)v14);
321 GXSetTevColor(GX_TEVREG1, (GXColor&)v13);
322 GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
323 GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_C0, GX_CC_C1);
324 GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1u, GX_TEVPREV);
325 GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA, GX_CA_A0, GX_CA_ZERO);
326 GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1u, GX_TEVPREV);
327 GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP0, GX_COLOR_NULL);
328 GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_C0, GX_CC_CPREV);
329 GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1u, GX_TEVPREV);
330 GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_A0, GX_CA_APREV);
331 GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1u, GX_TEVPREV);
332 GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
333 GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
334 GXSetZMode(1u, GX_LEQUAL, 1u);
335 GXSetZCompLoc(1u);
336 GXSetCullMode(GX_CULL_NONE);
337 GXSetClipMode(GX_CLIP_ENABLE);
338}