1#include "Game/Map/OceanRingDrawer.hpp"
2#include "Game/Map/OceanRing.hpp"
3#include "Game/Map/WaterAreaHolder.hpp"
4#include "Game/Util.hpp"
6static u8 unknownVal = 1;
8static GXColor color1 = { 0x28, 0x28, 0x28, 0x14 };
9static GXColor color2 = { 0x76, 0xD7, 0xFF, 0xFF };
13OceanRingPartDrawer::OceanRingPartDrawer(
const OceanRing *pRing,
int a3,
int a4,
bool a5, f32 *a6, f32 *a7, f32 *a8) {
27 initDisplayList(a6, a7, a8);
29 for (
int i = 0; i < a4; i++) {
32 if (i == a4 - 1 && _18) {
36 mPosition.add(((mOceanRing->mWaterPoints[(v12 * mOceanRing->mStride - 1) + mOceanRing->mStride / 2])->mOrigPos));
39 mPosition.scale(1.0f / a4);
44void OceanRingPartDrawer::initDisplayList(f32 *a1, f32 *a2, f32 *a3) {
47 u32 size = (0x50 * _14 * mOceanRing->mStride + 3) >> 5 + 2;
48 mDispList =
new(0x20) u8[size];
49 DCInvalidateRange(mDispList, size);
51 GDInitGDLObj(&obj, mDispList, size);
55 mDispListLength = obj.ptr - obj.start;
56 DCStoreRange(mDispList, size);
60void OceanRingPartDrawer::draw()
const {
61 if (PSVECDistance(mPosition.toCVec(), MR::getPlayerPos()->toCVec()) >= 13000.0f) {
62 GXCallDisplayList(mDispList, mDispListLength);
69OceanRingDrawer::OceanRingDrawer(
const OceanRing *pOceanRing) {
72 mPartDrawers =
nullptr;
80 mWaterIndTex =
nullptr;
84 mWaterTex =
new JUTTexture(MR::loadTexFromArc(
"WaterWave.arc",
"Water.bti"), 0);
85 mWaterIndTex =
new JUTTexture(MR::loadTexFromArc(
"WaterWave.arc",
"WaterIndirect.bti"), 0);
92void OceanRingDrawer::draw()
const {
96 GXCallDisplayList(mDispList, _2C);
99 for (s32 i = 0; i < mDrawerCount; i++) {
100 getDrawer(i)->draw();
105void OceanRingDrawer::drawBloom()
const {
107 TVec3f zDir = MR::getCamZDir();
109 TVec3f camPos = MR::getCamPos();
113 for (s32 i = 0; i < mDrawerCount; i++) {
116 if (PSVECDistance(drwr->mPosition.toCVec(), zDir.toCVec()) < 4000.0f) {
117 drwr->drawDynamicBloom();
123void OceanRingDrawer::initDisplayList() {
128 if (MR::isLoopRail(mRing)) {
132 int length = (((0x50 * (flag + mRing->mSegCount) + 3) >> 5) + 2) << 5;
133 mDispList =
new(0x20) u8[length];
134 DCFlushRange(mDispList, length);
136 GDInitGDLObj(&obj, mDispList, length);
137 __GDCurrentDL = &obj;
140 _2C = obj.ptr - obj.start;
141 DCStoreRange(mDispList, length);
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);
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);
199 GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_VTX, GX_SRC_VTX, 0, GX_DF_NONE, GX_AF_NONE);
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);
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);
215 mtx.mMtx[1][2] = _10;
216 GXLoadTexMtxImm(mtx.toMtxPtr(), 0x24, GX_MTX2x4);
217 MR::loadTexProjectionMtx(39);
219 mWaterTex->load(GX_TEXMAP0);
220 JUTTexture tex(MR::getScreenResTIMG(), 0);
221 tex.load(GX_TEXMAP1);
222 mWaterIndTex->load(GX_TEXMAP2);
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);
232 GXSetNumIndStages(1);
233 GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD2, GX_TEXMAP2);
234 GXSetTevIndWarp(GX_TEVSTAGE3, GX_INDTEXSTAGE0, 1, 0, GX_ITM_0);
244 GXSetIndTexMtx(GX_ITM_0, new_mtx, 0);
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);
274 GXSetCullMode(GX_CULL_NONE);
275 GXSetClipMode(GX_CLIP_ENABLE);
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);
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);
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);
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);
315 f32 v18 = (150.0f + (105.0f * v9));
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);
336 GXSetCullMode(GX_CULL_NONE);
337 GXSetClipMode(GX_CLIP_ENABLE);