From d1fb79fed836a738d017c66b9ac7bd645339ab18 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sun, 14 Jan 2024 15:17:37 -0800 Subject: [PATCH] d_kankyo_rain work --- include/d/d_kankyo.h | 2 +- include/d/d_kankyo_wether.h | 7 +- src/d/d_kankyo_rain.cpp | 205 ++++++++++++++++++++++++++++++++---- 3 files changed, 190 insertions(+), 24 deletions(-) diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index c647c8e7f..034f52dc0 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -237,7 +237,7 @@ public: /* 0x9F8 */ dKankyo_housi_Packet* mpHousiPacket; /* 0x9FC */ u8 mMoyaInitialized; /* 0x9FD */ u8 mMoyaMode; - /* 0xA00 */ int mMoyaCount; + /* 0xA00 */ s32 mMoyaCount; /* 0xA04 */ dKankyo_cloud_Packet* mpMoyaPacket; /* 0xA08 */ u8 mVrkumoStatus; /* 0xA0C */ int mVrkumoCount; diff --git a/include/d/d_kankyo_wether.h b/include/d/d_kankyo_wether.h index 7ee084982..90031f510 100644 --- a/include/d/d_kankyo_wether.h +++ b/include/d/d_kankyo_wether.h @@ -182,14 +182,14 @@ struct CLOUD_EFF { CLOUD_EFF(); ~CLOUD_EFF(); - /* 0x00 */ u8 mStatus; + /* 0x00 */ s8 mStatus; /* 0x04 */ cXyz mPos; /* 0x10 */ cXyz mBasePos; /* 0x1C */ cXyz mPntWindVel; /* 0x28 */ cXyz mVelRndm; /* 0x34 */ f32 field_0x34; /* 0x38 */ f32 mWindSpeed; - /* 0x3C */ s16 mAnimCounter; + /* 0x3C */ u16 mAnimCounter; /* 0x40 */ f32 mAlpha; /* 0x44 */ f32 mSize; /* 0x48 */ f32 mInitialSize; @@ -203,7 +203,7 @@ public: virtual ~dKankyo_cloud_Packet(); /* 0x0010 */ u8* mpTexture; - /* 0x0014 */ int mCount; + /* 0x0014 */ s32 mCount; /* 0x0018 */ CLOUD_EFF mEff[100]; }; @@ -363,6 +363,7 @@ void squal_proc(); void dKyw_pntwind_set(WIND_INFLUENCE*); void dKyw_pntwind_cut(WIND_INFLUENCE*); void dKyw_pwind_cylinder_set(WIND_INFLUENCE*); +cXyz dKyw_pntwind_get_vecpow(cXyz* pPos); void dKyw_evt_wind_set(s16 i_windX, s16 i_windY); void dKyw_evt_wind_set_go(); void dKyw_get_AllWind_vec(cXyz* param_0, cXyz* i_direction, f32* i_power); diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index 48b91e970..6b94ac855 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -1080,6 +1080,171 @@ void wave_move() { /* 80091964-80092294 .text cloud_shadow_move__Fv */ void cloud_shadow_move() { /* Nonmatching */ + dKankyo_cloud_Packet* pPkt = dKy_getEnvlight().mpMoyaPacket; + camera_class* pCamera = (camera_class*)dComIfGp_getCamera(0); + Mtx camMtx; + cXyz windVecPow = dKyw_get_wind_vecpow(); + cXyz center; + cXyz pos; + cXyz pntwind; + cXyz velRndm; + + if (dComIfGd_getView() != NULL) { + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + } else { + return; + } + + if (pPkt->mCount <= dKy_getEnvlight().mMoyaCount) + pPkt->mCount = dKy_getEnvlight().mMoyaCount; + + if (pPkt->mCount == 0) + return; + + dKy_set_eyevect_calc2(pCamera, ¢er, 1500.0f, 1500.0f); + + for (s32 i = 0; i < pPkt->mCount; i++) { + switch (pPkt->mEff[i].mStatus) { + case 0: + pPkt->mEff[i].mInitialSize = 400.0f + cM_rndFX(80.0f); + pPkt->mEff[i].mSize = pPkt->mEff[i].mInitialSize; + pPkt->mEff[i].mBasePos.set(center); + pPkt->mEff[i].mPos.x = cM_rndFX(2000.0f); + pPkt->mEff[i].mPos.y = cM_rndFX(2000.0f); + pPkt->mEff[i].mPos.z = cM_rndFX(2000.0f); + pPkt->mEff[i].mWindSpeed = 0.7f + cM_rndF(0.3f); + pPkt->mEff[i].mAlpha = 0.0; + pPkt->mEff[i].mAnimCounter = cM_rndF(65535.0f); + pPkt->mEff[i].mVelRndm.x = cM_rndFX(360.0f); + pPkt->mEff[i].mVelRndm.y = cM_rndFX(360.0f); + pPkt->mEff[i].mVelRndm.z = cM_rndFX(360.0f); + pPkt->mEff[i].mPntWindVel.x = 0.0f; + pPkt->mEff[i].mPntWindVel.y = 0.0f; + pPkt->mEff[i].mPntWindVel.z = 0.0f; + pPkt->mEff[i].mStatus++; + break; + case 1: + case 2: + { + pos.x = pPkt->mEff[i].mBasePos.x + pPkt->mEff[i].mPos.x; + pos.y = pPkt->mEff[i].mBasePos.y + pPkt->mEff[i].mPos.y; + pos.z = pPkt->mEff[i].mBasePos.z + pPkt->mEff[i].mPos.z; + pPkt->mEff[i].mAnimCounter += 120; + cLib_chaseF(&pPkt->mEff[i].field_0x34, pPkt->mEff[i].mWindSpeed, 7.0f); + if (dKy_getEnvlight().mMoyaMode & 1) { + if (strcmp(dComIfGp_getStartStageName(), "M_DragB") != 0 || dKy_getEnvlight().mbVrboxInvisible) { + if (dKy_getEnvlight().mMoyaMode == 1) { + pPkt->mEff[i].mPos.y += 20.0f; + } + } else { + pPkt->mEff[i].mPos.y += 5.0f; + } + } + + f32 speed; + if (dKy_getEnvlight().mMoyaMode == 1) { + speed = 10.0f; + } else { + speed = 40.0f; + } + + pPkt->mEff[i].mPos.x += windVecPow.x * speed * pPkt->mEff[i].mWindSpeed; + pPkt->mEff[i].mPos.y += windVecPow.y * speed * pPkt->mEff[i].mWindSpeed; + pPkt->mEff[i].mPos.z += windVecPow.z * speed * pPkt->mEff[i].mWindSpeed; + pntwind = dKyw_pntwind_get_vecpow(&pos); + if (pPkt->mEff[i].mPntWindVel.x < 30.0f) + pPkt->mEff[i].mPntWindVel.x += pntwind.x * 9.0f; + if (pPkt->mEff[i].mPntWindVel.y < 30.0f) + pPkt->mEff[i].mPntWindVel.y += pntwind.y * 9.0f; + if (pPkt->mEff[i].mPntWindVel.z < 30.0f) + pPkt->mEff[i].mPntWindVel.z += pntwind.z * 9.0f; + + cLib_addCalc(&pPkt->mEff[i].mPntWindVel.x, 0.0f, 0.2f, 0.1f, 0.00001f); + cLib_addCalc(&pPkt->mEff[i].mPntWindVel.y, 0.0f, 0.2f, 0.1f, 0.00001f); + cLib_addCalc(&pPkt->mEff[i].mPntWindVel.z, 0.0f, 0.2f, 0.1f, 0.00001f); + + pPkt->mEff[i].mPos.x += pPkt->mEff[i].mPntWindVel.x; + pPkt->mEff[i].mPos.y += pPkt->mEff[i].mPntWindVel.y; + pPkt->mEff[i].mPos.z += pPkt->mEff[i].mPntWindVel.z; + + // botched comparison? + strcmp(dComIfGp_getStartStageName(), "kaze"); + + if (strcmp(dComIfGp_getStartStageName(), "Adanmae") == 0) { + speed = 20.0f; + } else { + speed = 8.0f; + } + + velRndm.x = (pPkt->mEff[i].mVelRndm.x / 360.0f - 0.5f) * speed; + velRndm.y = (pPkt->mEff[i].mVelRndm.y / 360.0f - 0.5f) * speed; + velRndm.z = (pPkt->mEff[i].mVelRndm.z / 360.0f - 0.5f) * speed; + + pPkt->mEff[i].mPos.x += velRndm.x; + pPkt->mEff[i].mPos.y += velRndm.y; + pPkt->mEff[i].mPos.z += velRndm.z; + + pos.x = pPkt->mEff[i].mBasePos.x + pPkt->mEff[i].mPos.x; + pos.y = pPkt->mEff[i].mBasePos.y + pPkt->mEff[i].mPos.y; + pos.z = pPkt->mEff[i].mBasePos.z + pPkt->mEff[i].mPos.z; + + if (pos.abs(center) > 2000.0f) { + pPkt->mEff[i].mBasePos.set(center); + + if (pos.abs(center) > 2200.0f) { + pPkt->mEff[i].mPos.x = cM_rndFX(2000.0f); + pPkt->mEff[i].mPos.y = cM_rndFX(2000.0f); + pPkt->mEff[i].mPos.z = cM_rndFX(2000.0f); + } else { + cLib_addCalc(&pPkt->mEff[i].mAlpha, 0.0f, 0.1f, 0.01f, 0.001f); + if (pPkt->mEff[i].mAlpha < 0.001f) { + get_vectle_calc(&pos, ¢er, &pntwind); + pntwind.x += cM_rndF(0.5f); + pntwind.y += cM_rndF(0.5f); + pntwind.z += cM_rndF(0.5f); + pPkt->mEff[i].mPos.x = pntwind.x * 2000.0f; + pPkt->mEff[i].mPos.y = pntwind.y * 2000.0f; + pPkt->mEff[i].mPos.z = pntwind.z * 2000.0f; + } + } + + pPkt->mEff[i].mAlpha = 0.0f; + } + } + break; + case 3: + pPkt->mEff[i].mStatus = 0; + break; + } + + pos.x = pPkt->mEff[i].mBasePos.x + pPkt->mEff[i].mPos.x; + pos.y = pPkt->mEff[i].mBasePos.y + pPkt->mEff[i].mPos.y; + pos.z = pPkt->mEff[i].mBasePos.z + pPkt->mEff[i].mPos.z; + + pPkt->mEff[i].mSize = pPkt->mEff[i].mInitialSize + ((pos.abs(pCamera->mLookat.mEye) - 1000.0f) / 2000.0f) * 1.5f * pPkt->mEff[i].mInitialSize + (40.0f * cM_ssin(pPkt->mEff[i].mAnimCounter)); + + f32 distCenter = pos.abs(center); + if (distCenter < 0.0f) + distCenter = 0.0f; + + f32 alphaTarget = 1.0f - distCenter / 1000.0f; + f32 maxAlpha = 0.035f; + if (dKy_getEnvlight().mMoyaMode == 3) { + maxAlpha = 0.06f; + } else if (dKy_getEnvlight().mMoyaMode == 4) { + maxAlpha = 0.05f; + } + maxAlpha *= 1.2f; + + if (i > dKy_getEnvlight().mMoyaCount - 1) { + alphaTarget = 0.0f; + if (pPkt->mEff[i].mAlpha < 0.001f && i == pPkt->mCount - 1) { + pPkt->mCount--; + } + } + + cLib_addCalc(&pPkt->mEff[i].mAlpha, alphaTarget * maxAlpha, 0.1f, 0.1f, 0.000000001f); + } } /* 80092294-80092310 .text light_at_hit_check__FP4cXyz */ @@ -1972,9 +2137,9 @@ void drawWave(Mtx drawMtx, u8** pImg) { Mtx rotMtx; cXyz pos[4]; cXyz windvec; + cXyz p; cXyz vp; cXyz lp; - cXyz p; cXyz dummy; cXyz tilt; GXColor dif, amb; @@ -2028,8 +2193,7 @@ void drawWave(Mtx drawMtx, u8** pImg) { GXLoadPosMtxImm(drawMtx, GX_PNMTX0); GXSetCurrentMtx(GX_PNMTX0); - s32 counter = 0; - for (s32 i = 0; i < dKy_getEnvlight().mWaveChan.mWaveCount; i++, counter += 31) { + for (s32 i = 0; i < dKy_getEnvlight().mWaveChan.mWaveCount; i++) { p.x = pPkt->mEff[i].mBasePos.x + pPkt->mEff[i].mPos.x; p.y = pPkt->mEff[i].mBasePos.y + pPkt->mEff[i].mPos.y; p.z = pPkt->mEff[i].mBasePos.z + pPkt->mEff[i].mPos.z; @@ -2038,21 +2202,22 @@ void drawWave(Mtx drawMtx, u8** pImg) { if (wave <= 0.0f) continue; - f32 scale = dKy_getEnvlight().mWaveChan.mWaveScale * pPkt->mEff[i].mScale; + f32 scale = dKy_getEnvlight().mWaveChan.mWaveScale * pPkt->mEff[i].mScale * wave; + f32 scaleBottom = dKy_getEnvlight().mWaveChan.mWaveScaleBottom * scale; f32 strength = pPkt->mEff[i].mStrengthEnv; - f32 height = wave * scale * strength; - f32 width = dKy_getEnvlight().mWaveChan.mWaveScaleBottom * scale * (strength - height * counter * 0.000015f); - if (height <= 0.01f) + f32 height = strength * scale; + f32 width = scaleBottom * (strength - 0.000015f * (i * 32) * height); + if (height <= 0.0f) continue; GXLoadTexObj(&texObj, GX_TEXMAP0); - amb.a = pPkt->mEff[i].mAlpha; + amb.a = pPkt->mEff[i].mAlpha * 255.0f; GXSetTevKColor(GX_KCOLOR3, amb); if (pPkt->mSkewDir < 0.0f) { - vp.x = -width + pPkt->mSkewDir * width * -(pPkt->mEff[i].mSpeed * 1.2f); + vp.x = -width + width * -(pPkt->mEff[i].mSpeed * 1.2f) * pPkt->mSkewWidth; } else { - vp.x = -width - pPkt->mSkewDir * width * -(pPkt->mEff[i].mSpeed * 1.2f); + vp.x = -width - width * -(pPkt->mEff[i].mSpeed * 1.2f) * pPkt->mSkewWidth; } vp.y = height; vp.z = 0.0f; @@ -2062,9 +2227,9 @@ void drawWave(Mtx drawMtx, u8** pImg) { pos[0].z = p.z + lp.z; if (pPkt->mSkewDir < 0.0f) { - vp.x = width + pPkt->mSkewDir * width * -(pPkt->mEff[i].mSpeed * 1.2f); + vp.x = width + width * -(pPkt->mEff[i].mSpeed * 1.2f) * pPkt->mSkewWidth; } else { - vp.x = width - pPkt->mSkewDir * width * -(pPkt->mEff[i].mSpeed * 1.2f); + vp.x = width - width * -(pPkt->mEff[i].mSpeed * 1.2f) * pPkt->mSkewWidth; } vp.y = height; vp.z = 0.0f; @@ -2081,7 +2246,7 @@ void drawWave(Mtx drawMtx, u8** pImg) { pos[2].y = p.y + lp.y; pos[2].z = p.z + lp.z; - vp.x = width; + vp.x = -width; vp.y = 0.0f; vp.z = 0.0f; MTXMultVec(camMtx, &vp, &lp); @@ -2089,14 +2254,14 @@ void drawWave(Mtx drawMtx, u8** pImg) { pos[3].y = p.y + lp.y; pos[3].z = p.z + lp.z; - static const cXyz add_table[4] = { - cXyz(0.0f, 0.0f, 0.0f), - cXyz(800.0f, 0.0f, 400.0f), - cXyz(600.0f, 0.0f, 200.0f), - cXyz(200.0f, 0.0f, 800.0f), - }; - for (s32 j = 0; j < 1; j++) { + static const cXyz add_table[4] = { + cXyz(0.0f, 0.0f, 0.0f), + cXyz(800.0f, 0.0f, 400.0f), + cXyz(600.0f, 0.0f, 200.0f), + cXyz(200.0f, 0.0f, 800.0f), + }; + GXBegin(GX_QUADS, GX_VTXFMT0, 4); const cXyz & addv = add_table[j]; f32 addX = addv.x, addY = addv.y, addZ = addv.z;