diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2025-11-11 01:58:46 -0800 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2025-11-11 01:58:46 -0800 |
| commit | 909a2a0dd6ff8e9829e5e0977ad82f4c03aed105 (patch) | |
| tree | e0517b6a16950df37d8d1d12a9bea66a0931620a /src/d/d_kankyo_rain.cpp | |
| parent | 80608ad27f4d9514316919b827300bfeebbde870 (diff) | |
d_kankyo_wether work
Diffstat (limited to 'src/d/d_kankyo_rain.cpp')
| -rw-r--r-- | src/d/d_kankyo_rain.cpp | 1179 |
1 files changed, 1166 insertions, 13 deletions
diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index 32741b5f..5043644a 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -700,7 +700,7 @@ void dKyr_rain_init() { g_env_light.mpRainPacket->field_0x3700 = 0.0f; g_env_light.mpRainPacket->mSibukiAlpha = 0.0f; g_env_light.mpRainPacket->mOverheadFade = 0.0f; - g_env_light.mpRainPacket->mFwd1Fade = 0.0f; + g_env_light.mpRainPacket->mFwdFade1 = 0.0f; g_env_light.mpRainPacket->mFwdFade2 = 0.0f; g_env_light.mpRainPacket->mStatus = 0; g_env_light.mpRainPacket->mCenterDelta.x = 0.0f; @@ -769,12 +769,463 @@ bool forward_overhead_bg_chk(cXyz* pPos, f32 dist) { /* 8008DAF0-8008E79C .text dKyr_rain_move__Fv */ void dKyr_rain_move() { - /* Nonmatching */ + dKankyo_rain_Packet* rain_packet; + camera_class* camera; + + rain_packet = g_env_light.mpRainPacket; + camera = (camera_class*)dComIfGp_getCamera(0); + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz spFC; + cXyz spF0; + cXyz spE4; + cXyz spD8; + cXyz spCC = dKyw_get_wind_vecpow(); + + cXyz spC0; + cXyz spB4; + cXyz spA8; + cXyz sp9C; + cXyz sp90; + + cXyz* sp3C; + f32 sp38; + BOOL sp34; + BOOL sp30; + BOOL sp2C; + u32 sp28; + BOOL sp24 = 0; + f32 sp20; + BOOL sp1C = 0; + + f32 var_f31; + f32 var_f30; + f32 var_f29; + f32 var_f28; + + sp28 = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()); + + spA8.x = 0.0f; + spA8.y = -2.5f; + spA8.z = 0.0f; + + if (rain_packet->mRainCount <= g_env_light.mRainCount) { + rain_packet->mRainCount = g_env_light.mRainCount; + } + + if (rain_packet->mRainCount != 0) { + dKyr_get_vectle_calc(&camera->mLookat.mCenter, &rain_packet->mCamCenterPos, &spB4); + + var_f30 = rain_packet->mCamEyePos.abs(camera->mLookat.mEye); + + if (var_f30 > 10.0f) { + var_f30 = (var_f30 - 10.0f) / 50.0f; + if (var_f30 > 1.0f) { + var_f30 = 1.0f; + } + } else { + var_f30 = 0.0f; + } + + rain_packet->mCamEyePos = camera->mLookat.mEye; + + var_f29 = rain_packet->mCamCenterPos.abs(camera->mLookat.mCenter); + if (var_f29 > 10.0f) { + var_f29 = (var_f29 - 10.0f) / 50.0f; + if (var_f29 > 1.0f) { + var_f29 = 1.0f; + } + } else { + var_f29 = 0.0f; + } + + cLib_addCalc(&rain_packet->mCenterDeltaMul, var_f30 * var_f29, 0.2f, 0.1f, 0.01f); + if (rain_packet->mCenterDeltaMul > 0.3f) { + rain_packet->mCenterDeltaMul = 0.3f; + } + + cLib_addCalc(&rain_packet->mCenterDelta.x, spB4.x, 0.2f, 0.1f, 0.01f); + cLib_addCalc(&rain_packet->mCenterDelta.y, spB4.y, 0.2f, 0.1f, 0.01f); + cLib_addCalc(&rain_packet->mCenterDelta.z, spB4.z, 0.2f, 0.1f, 0.01f); + rain_packet->mCamCenterPos = camera->mLookat.mCenter; + + dKy_set_eyevect_calc2(camera, &spFC, 700.0f, 600.0f); + spD8.x = spD8.y = spD8.z = 0.0f; + + sp3C = dKyw_get_wind_vec(); + sp38 = dKyw_get_wind_pow(); + + rain_packet->field_0x36cc = 0; + rain_packet->field_0x36c8 = 0; + rain_packet->mStatus = 0; + + sp34 = 0; + sp30 = 0; + sp2C = 0; + + f32 fadeMaxXZDist = 0.0f; + f32 fadeMaxY = 0.0f; + if (sp28 == dStageType_MISC_e && strcmp(dComIfGp_getStartStageName(), "Ocrogh") != 0 && strcmp(dComIfGp_getStartStageName(), "Omori") != 0) { + if (strcmp(dComIfGp_getStartStageName(), "Orichh") == 0) + fadeMaxXZDist = 2300.0f; + else + fadeMaxXZDist = 1200.0f; + + if (strcmp(dComIfGp_getStartStageName(), "Atorizk") == 0) + fadeMaxY = 1300.0f; + } + + if (sp1C == 0) { + sp34 = overhead_bg_chk(); + sp30 = forward_overhead_bg_chk(&sp9C, 700.0f); + sp2C = forward_overhead_bg_chk(&sp90, 1400.0f); + + if (sp34) { + rain_packet->mStatus |= (u8)1; + } else if (sp30) { + rain_packet->mStatus |= (u8)2; + } + } else { + sp24 = 1; + rain_packet->mStatus |= (u8)1; + sp20 = 1200.0f; + } + + if (sp34) { + cLib_addCalc(&rain_packet->mOverheadFade, 0.0f, 0.5f, 0.2f, 0.01f); + } else { + cLib_addCalc(&rain_packet->mOverheadFade, 1.0f, 0.1f, 0.1f, 0.001f); + } + + if (sp30) { + cLib_addCalc(&rain_packet->mFwdFade1, 0.0f, 0.5f, 0.2f, 0.01f); + } else { + cLib_addCalc(&rain_packet->mFwdFade1, 1.0f, 0.1f, 0.1f, 0.001f); + } + + if (sp2C) { + cLib_addCalc(&rain_packet->mFwdFade2, 0.0f, 0.5f, 0.2f, 0.01f); + } else { + cLib_addCalc(&rain_packet->mFwdFade2, 1.0f, 0.1f, 0.1f, 0.001f); + } + + for (int i = rain_packet->mRainCount - 1; i >= 0; i--) { + rain_packet->mEff[i].mBasePos.y = spFC.y; + + switch (rain_packet->mEff[i].mStatus) { + case 0: + rain_packet->mEff[i].field_0x24 = -(cM_rndF(10.0f) + 35.5f); + rain_packet->mEff[i].mTimer = 0; + rain_packet->mEff[i].mBasePos.x = spFC.x; + rain_packet->mEff[i].mBasePos.y = spFC.y; + rain_packet->mEff[i].mBasePos.z = spFC.z; + rain_packet->mEff[i].mPos.x = cM_rndFX(800.0f); + rain_packet->mEff[i].mPos.y = cM_rndF(600.0f); + rain_packet->mEff[i].mPos.z = cM_rndFX(800.0f); + rain_packet->mEff[i].mAlpha = 1.0f; + rain_packet->mEff[i].field_0x1c = cM_rndF(360.0f); + rain_packet->mEff[i].field_0x20 = cM_rndF(360.0f); + + rain_bg_chk(rain_packet, i); + rain_packet->mEff[i].mStatus++; + break; + case 1: + case 2: + case 3: + cLib_addCalc(&rain_packet->mEff[i].field_0x24, rain_packet->mEff[i].field_0x24 - cM_rndFX(0.1f), 0.5f, 0.1f, 0.01f); + + rain_packet->mEff[i].mPos.x += + 20.0f * + ((spCC.x + (10.0f * (rain_packet->mCenterDelta.x * rain_packet->mCenterDeltaMul))) + + (spA8.x + (0.08f * (f32)(i & 7)))); + + rain_packet->mEff[i].mPos.y += + ((f32)(i & 7) * -2.0f) + + (20.0f * + (spA8.y + + (spCC.y + ((rain_packet->mCenterDelta.y * rain_packet->mCenterDeltaMul) * 10.0f)))); + + rain_packet->mEff[i].mPos.z += + 20.0f * + ((spCC.z + (10.0f * (rain_packet->mCenterDelta.z * rain_packet->mCenterDeltaMul))) + + (spA8.z + (0.08f * (f32)(i & 3)))); + + spC0.x = rain_packet->mEff[i].mBasePos.x + rain_packet->mEff[i].mPos.x; + spC0.y = spFC.y; + spC0.z = rain_packet->mEff[i].mBasePos.z + rain_packet->mEff[i].mPos.z; + + f32 var_f1 = spC0.abs(spFC); + + if (rain_packet->mEff[i].mTimer == 0) { + if (var_f1 > 800.0f) { + rain_packet->mEff[i].mTimer = 10; + rain_packet->mEff[i].field_0x24 = -(cM_rndF(10.0f) + 35.5f); + rain_packet->mEff[i].mBasePos = spFC; + + if (spC0.abs(spFC) > 850.0f) { + rain_packet->mEff[i].mPos.x = cM_rndFX(800.0f); + rain_packet->mEff[i].mPos.y = cM_rndFX(800.0f); + rain_packet->mEff[i].mPos.z = cM_rndFX(800.0f); + } else { + var_f31 = cM_rndFX(40.0f); + get_vectle_calc(&spC0, &spFC, &spB4); + + rain_packet->mEff[i].mPos.x = spB4.x * (var_f31 + 800.0f); + rain_packet->mEff[i].mPos.y = spB4.y * (var_f31 + 800.0f); + rain_packet->mEff[i].mPos.z = spB4.z * (var_f31 + 800.0f); + } + + rain_packet->mEff[i].mStatus = 1; + rain_bg_chk(rain_packet, i); + } + + spC0.y = rain_packet->mEff[i].mBasePos.y + rain_packet->mEff[i].mPos.y; + if (spC0.y < rain_packet->mEff[i].field_0x30 + 20.0f) { + rain_packet->mEff[i].mBasePos = spFC; + rain_packet->mEff[i].mPos.x = cM_rndFX(800.0f); + rain_packet->mEff[i].mPos.y = 200.0f; + rain_packet->mEff[i].mPos.z = cM_rndFX(800.0f); + rain_bg_chk(rain_packet, i); + rain_packet->mEff[i].mTimer = 10; + } + } else { + rain_packet->mEff[i].mTimer--; + } + } + + spC0.x = rain_packet->mEff[i].mBasePos.x + rain_packet->mEff[i].mPos.x; + spC0.y = rain_packet->mEff[i].mBasePos.y + rain_packet->mEff[i].mPos.y; + spC0.z = rain_packet->mEff[i].mBasePos.z + rain_packet->mEff[i].mPos.z; + + if (i > g_env_light.mRainCount - 1) { + if (i == rain_packet->mRainCount - 1) { + rain_packet->mRainCount--; + } + } + + var_f31 = 1.0f; + if (sp34 || rain_packet->mOverheadFade < 1.0f) { + cXyz sp80; + f32 sp10 = 800.0f; + sp80 = spC0; + sp80.y = camera->mLookat.mEye.y; + + if (camera->mLookat.mEye.abs(sp80) < sp10) { + var_f31 *= rain_packet->mOverheadFade * 1.0f; + } + } + + if (sp30 || rain_packet->mFwdFade1 < 1.0f) { + cXyz sp74; + f32 sp0C = 550.0f; + sp74 = spC0; + sp74.y = sp9C.y; + + if (sp9C.abs(sp74) < sp0C) { + var_f31 *= rain_packet->mFwdFade1; + } + } + + if (sp2C || rain_packet->mFwdFade2 < 1.0f) { + cXyz sp68; + f32 sp08 = 550.0f; + sp68 = spC0; + sp68.y = sp90.y; + + if (sp90.abs(sp68) < sp08) { + var_f31 *= rain_packet->mFwdFade2; + } + } + + if (sp24) { + cXyz sp5C; + cXyz sp50; + sp50.x = 27453.0f; + sp50.y = spC0.y; + sp50.z = 8528.0f; + + if (spC0.y < 1300.0f || player->current.pos.y < 1100.0f) { + if (spC0.abs(sp50) > 80.0f) { + var_f31 = 0.0f; + } + } else { + if (spC0.abs(sp50) > 500.0f) { + var_f31 = 0.0f; + } + } + } + + rain_packet->mEff[i].mAlpha = var_f31 * (1.0f + cM_rndFX(0.5f)); + } + } } /* 8008E79C-8008F0BC .text dKyr_housi_move__Fv */ void dKyr_housi_move() { /* Nonmatching */ + dKankyo_housi_Packet* housi_packet = g_env_light.mpHousiPacket; + HOUSI_EFF* effect; + camera_class* camera = (camera_class*)dComIfGp_getCamera(0); + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + cXyz sp84; + cXyz sp78 = dKyw_get_wind_vecpow(); + cXyz sp6C; + cXyz sp60; + + dBgS_GndChk gndchk; + bool var_r27 = 0; + f32 var_f31 = 1.0f; + + f32 var_f30 = -100000000.0f; + + cXyz sp54; + + if (g_env_light.mHousiCount != 0 || + (g_env_light.mHousiCount == 0 && housi_packet->field_0x5ddc <= 0.0f)) + { + housi_packet->mCount = g_env_light.mHousiCount; + } + + if (g_env_light.mHousiCount != 0) { + cLib_addCalc(&housi_packet->field_0x5ddc, 1.0f, 0.2f, 0.05f, 0.01f); + } else { + cLib_addCalc(&housi_packet->field_0x5ddc, 0.0f, 0.2f, 0.05f, 0.01f); + } + + if (housi_packet->mCount == 0) { + return; + } + + dKy_set_eyevect_calc2(camera, &sp84, 800.0f, 800.0f); + dKyw_get_wind_pow(); + + for (int i = housi_packet->mCount - 1; i >= 0; i--) { + f32 var_f26 = housi_packet->field_0x5ddc; + effect = &housi_packet->mEffect[i]; + + switch (housi_packet->mEffect[i].mStatus) { + case 0: + effect->field_0x34 = cM_rndF(1.5f) + 0.2f; + effect->field_0x3c = 0; + effect->field_0x4c = cM_rndFX(65536.0f); + effect->mBasePos.x = sp84.x; + effect->mBasePos.y = sp84.y; + effect->mBasePos.z = sp84.z; + effect->mPos.x = cM_rndFX(1000.0f); + effect->mPos.y = 1000.0f; + effect->mPos.z = cM_rndFX(1000.0f); + effect->mAlpha = 0.0f; + effect->field_0x48 = 0.0f; + effect->mScale.x = cM_rndF(360.0f); + effect->mScale.y = cM_rndF(360.0f); + effect->mScale.z = cM_rndF(360.0f); + effect->mSpeed.x = 0.0f; + effect->mSpeed.y = 0.0f; + effect->mSpeed.z = 0.0f; + + if (effect->mBasePos.y + effect->mPos.y < -100149.9f) { + effect->mPos.y = (-99999.9f - effect->mBasePos.y) + 10.0f; + } + + effect->mStatus++; + break; + case 1: + case 2: + case 3: + f32 var_f24 = 2.5f; + + if (effect->mStatus != 1) { + f32 var_f23 = effect->field_0x34; + f32 temp_f0_5 = cM_fsin(effect->mScale.x); + + effect->mPos.y += var_f23 * (sp78.y * var_f24); + effect->mPos.x += var_f23 * (sp78.x * var_f24); + effect->mPos.y -= var_f23 * 0.6f; + + effect->mPos.z += var_f23 * (sp78.z * var_f24); + + effect->mPos.x += temp_f0_5 * var_f23; + effect->mPos.y += var_f23 * 0.5f * cM_fsin(effect->mScale.y); + effect->mPos.z += cM_fsin(effect->mScale.z) * var_f23; + } + + effect->mScale.x += 0.03f; + effect->mScale.y += 0.02f; + effect->mScale.z += 0.01f; + + sp6C.x = effect->mBasePos.x + effect->mPos.x; + sp6C.y = effect->mBasePos.y + effect->mPos.y; + sp6C.z = effect->mBasePos.z + effect->mPos.z; + + sp60 = dKyw_pntwind_get_vecpow(&sp6C); + + if (effect->mSpeed.x < 30.0f) { + effect->mSpeed.x += sp60.x * 9.0f; + } + + if (effect->mSpeed.y < 30.0f) { + effect->mSpeed.y += sp60.y * 9.0f; + } + + if (effect->mSpeed.z < 30.0f) { + effect->mSpeed.z += sp60.z * 9.0f; + } + + cLib_addCalc(&effect->mSpeed.x, 0.0f, 0.2f, 0.1f, 0.00001f); + cLib_addCalc(&effect->mSpeed.y, 0.0f, 0.2f, 0.1f, 0.00001f); + cLib_addCalc(&effect->mSpeed.z, 0.0f, 0.2f, 0.1f, 0.00001f); + + effect->mPos.x += effect->mSpeed.x; + effect->mPos.y += effect->mSpeed.y; + effect->mPos.z += effect->mSpeed.z; + + sp6C.x = effect->mBasePos.x + effect->mPos.x; + sp6C.y = effect->mBasePos.y + effect->mPos.y; + sp6C.z = effect->mBasePos.z + effect->mPos.z; + + f32 var_f1_4 = sp6C.abs(sp84); + + if (effect->field_0x3c == 0) { + if (var_f1_4 > 1000.0f || sp6C.y < -99979.9f) { + effect->field_0x3c = 10; + effect->mBasePos = sp84; + + if (sp6C.abs(sp84) > 1050.0f) { + effect->mPos.x = cM_rndFX(1000.0f); + effect->mPos.y = cM_rndFX(1000.0f); + effect->mPos.z = cM_rndFX(1000.0f); + } else { + f32 temp_f23 = cM_rndFX(50.0f); + get_vectle_calc(&sp6C, &sp84, &sp60); + + effect->mPos.x = sp60.x * (temp_f23 + 1000.0f); + effect->mPos.y = sp60.y * (temp_f23 + 1000.0f); + effect->mPos.z = sp60.z * (temp_f23 + 1000.0f); + } + + effect->mSpeed.x = 0.0f; + effect->mSpeed.y = 0.0f; + effect->mSpeed.z = 0.0f; + + effect->mStatus = 1; + } + } else { + effect->field_0x3c--; + } + break; + } + + sp6C.x = effect->mBasePos.x + effect->mPos.x; + sp6C.y = effect->mBasePos.y + effect->mPos.y; + sp6C.z = effect->mBasePos.z + effect->mPos.z; + + effect->field_0x4c += 600; + if (effect->field_0x4c > 30000) { + var_f26 = 0.0f; + } + + cLib_addCalc(&effect->mAlpha, var_f26, 0.5f, 0.02f, 0.00001f); + } } /* 8008F0BC-8008F23C .text dKyr_snow_init__Fv */ @@ -815,20 +1266,20 @@ void dKyr_star_init() { g_env_light.mpStarPacket = new(0x20) dKankyo_star_Packet(); if (g_env_light.mpStarPacket != NULL) { g_env_light.mpStarPacket->mpTexture = (u8*)dComIfG_getObjectRes("Always", ALWAYS_I8_TX_SNOW01); - g_env_light.mpStarPacket->mStarEff[0].mSin = 1.0f; - g_env_light.mpStarPacket->mCount = 0; + g_env_light.mpStarPacket->mEffect[0].mSin = 1.0f; + g_env_light.mpStarPacket->mEffectNum = 0; } } /* 80090D50-80090DE0 .text dKyr_star_move__Fv */ void dKyr_star_move() { dKankyo_star_Packet* pPkt = g_env_light.mpStarPacket; - pPkt->mCount = g_env_light.mStarCount; - if (pPkt->mCount != 0) { - f32 wave = std::fabsf(cM_fsin(pPkt->mStarEff[0].mAnimCounter)); - pPkt->mStarEff[0].mAnimCounter += 0.01f; - pPkt->mStarEff[0].mSin = wave; - cLib_addCalc(&pPkt->mStarEff[0].mSin, wave, 0.5f, 0.1f, 0.01f); + pPkt->mEffectNum = g_env_light.mStarCount; + if (pPkt->mEffectNum != 0) { + f32 wave = std::fabsf(cM_fsin(pPkt->mEffect[0].mAnimCounter)); + pPkt->mEffect[0].mAnimCounter += 0.01f; + pPkt->mEffect[0].mSin = wave; + cLib_addCalc(&pPkt->mEffect[0].mSin, wave, 0.5f, 0.1f, 0.01f); } } @@ -1671,6 +2122,328 @@ void dKyr_drawSun(Mtx drawMtx, cXyz* pPos, GXColor& reg0, u8** pImg) { /* 8009514C-80095E8C .text dKyr_drawLenzflare__FPA4_fP4cXyzR8GXColorPPUc */ void dKyr_drawLenzflare(Mtx drawMtx, cXyz* pPos, GXColor& color, u8** pImg) { /* Nonmatching */ + dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunlenzPacket; + dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket; + camera_class* camera = (camera_class*)dComIfGp_getCamera(0); + + Mtx camMtx; + Mtx rotMtx; + + cXyz pos[4]; + cXyz spFC; + cXyz spF0; + + Vec spE4, spD8; + + s16 spC = 0; + s16 spA = 0; + + f32 sun_visibility = sun_packet->mVisibility; + f32 spAC = 1.0f - lenz_packet->mDistFalloff; + f32 spA8 = sun_packet->mVisibility * sun_packet->mVisibility; + + if (!(sun_visibility < 0.1f)) { + dKy_set_eyevect_calc2(camera, &spFC, 8000.0f, 8000.0f); + + GXColor color_reg0; + color_reg0.r = sun_packet->mColor.r; + color_reg0.g = sun_packet->mColor.g; + color_reg0.b = sun_packet->mColor.b; + + GXColor color_reg1; + color_reg1.r = sun_packet->mColor.r; + color_reg1.g = sun_packet->mColor.g; + color_reg1.b = sun_packet->mColor.b; + + if (dComIfGd_getView() != NULL) { + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + } else { + return; + } + + GXTexObj texobj; + GXInitTexObj(&texobj, pImg[0], 64, 64, GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE); + GXInitTexObjLOD(&texobj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1); + GXLoadTexObj(&texobj, GX_TEXMAP0); + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, color_reg0); + GXSetTevColor(GX_TEVREG1, color_reg1); + GXSetNumTexGens(1); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetZCompLoc(GX_TRUE); + GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_DISABLE); + GXSetNumIndStages(0); + GXSetCullMode(GX_CULL_NONE); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + + MTXRotRad(rotMtx, 'Z', 0.0f); + MTXConcat(camMtx, rotMtx, camMtx); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + static const f32 scale_dat[] = { + 8000.0f, 10000.0f, 1600.0f, 4800.0f, 1200.0f, 5600.0f, 2400.0f, 7200.0f, + }; + + static const GXColor col_dat[] = { + {0xFF, 0xFF, 0xFF, 0xFF}, + {0xFF, 0xFF, 0xFF, 0x50}, + {0xFF, 0xFF, 0xFF, 0x5A}, + {0xFF, 0xFF, 0xFF, 0x64}, + {0xFF, 0xFF, 0xFF, 0x55}, + {0xFF, 0xFF, 0xFF, 0x5A}, + {0xFF, 0xFF, 0xFF, 0x6E}, + {0xFF, 0xFF, 0xFF, 0x5A}, + }; + + for (int i = 0; i < 8; i++) { + if (!g_env_light.mpSunlenzPacket->mbDrawLenzInSky || i == 0) { + f32 spC4 = spA8; + if (i < 2) { + color_reg0.a = spC4 * col_dat[i].a; + } else { + color_reg0.a = spC4 * col_dat[i].a * (0.8f * lenz_packet->mDistFalloff); + } + + GXSetTevColor(GX_TEVREG0, color_reg0); + + f32 var_f31; + if (i < 2) { + var_f31 = (0.04f + (0.075f * sun_visibility)) * scale_dat[i] + ((0.2f * sun_visibility * scale_dat[i]) * (1.0f - (lenz_packet->mDistFalloff * lenz_packet->mDistFalloff))); + } else { + var_f31 = 0.8f * (sun_visibility * scale_dat[i]) * (1.0f - (lenz_packet->mDistFalloff * lenz_packet->mDistFalloff * lenz_packet->mDistFalloff)); + } + + if (i == 1) { + dKyr_init_btitex(&texobj, (ResTIMG*)pImg[2]); + GXLoadTexObj(&texobj, GX_TEXMAP0); + } else if (i == 2) { + dKyr_init_btitex(&texobj, (ResTIMG*)pImg[1]); + GXLoadTexObj(&texobj, GX_TEXMAP0); + } + + spE4.x = -var_f31; + spE4.y = var_f31; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[0].x = spD8.x + pPos[i].x; + pos[0].y = spD8.y + pPos[i].y; + pos[0].z = spD8.z + pPos[i].z; + + spE4.x = var_f31; + spE4.y = var_f31; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[1].x = spD8.x + pPos[i].x; + pos[1].y = spD8.y + pPos[i].y; + pos[1].z = spD8.z + pPos[i].z; + + spE4.x = var_f31; + spE4.y = -var_f31; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[2].x = spD8.x + pPos[i].x; + pos[2].y = spD8.y + pPos[i].y; + pos[2].z = spD8.z + pPos[i].z; + + spE4.x = -var_f31; + spE4.y = -var_f31; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[3].x = spD8.x + pPos[i].x; + pos[3].y = spD8.y + pPos[i].y; + pos[3].z = spD8.z + pPos[i].z; + + s16 sp8; + if (i == 0) { + sp8 = 0xFF; + } else { + sp8 = 0x1FF; + } + + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition3f32(pos[0].x, pos[0].y, pos[0].z); + GXTexCoord2s16(0, 0); + GXPosition3f32(pos[1].x, pos[1].y, pos[1].z); + GXTexCoord2s16(sp8, 0); + GXPosition3f32(pos[2].x, pos[2].y, pos[2].z); + GXTexCoord2s16(sp8, sp8); + GXPosition3f32(pos[3].x, pos[3].y, pos[3].z); + GXTexCoord2s16(0, sp8); + GXEnd(); + } + } + + spC = -0x07F6; + spA = 0x416B; + + if (dComIfGd_getView() != NULL) { + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + } + + { + MTXRotRad(rotMtx, 'Z', 0.0f); + MTXConcat(camMtx, rotMtx, camMtx); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + + color_reg0.a = sun_packet->mVisibility * (15.0f * (spA8 * spA8 * spA8)); + GXSetTevColor(GX_TEVREG0, color_reg0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetClipMode(GX_CLIP_ENABLE); + GXSetNumIndStages(0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + for (int i = 0; i < 16; i++) { + f32 spA0; + f32 sp9C; + f32 sp98; + f32 sp94; + f32 sp90; + f32 sp8C; + f32 sp88; + f32 sp84; + f32 sp80; + f32 sp7C; + f32 sp78; + f32 sp74; + f32 sp70; + f32 sp6C; + f32 sp68; + f32 sp64; + + if (i & 1) { + sp78 = spC; + } else { + sp78 = spA; + } + + sp6C = 0.4f + (0.6f * (sun_visibility * (spAC * spAC))); + sp64 = 300.0f; + sp68 = cM_ssin(34.0f * sp78); + if (sp68 < 0.0f) { + sp68 = -sp68; + } + + sp74 = 1000.0f * (0.5f + sp68); + + spA0 = sp64 * sp6C * cM_ssin(sp78 + sp74); + sp9C = sp64 * sp6C * cM_scos(sp78 + sp74); + sp90 = sp64 * sp6C * cM_ssin(sp78 - sp74); + sp8C = sp64 * sp6C * cM_scos(sp78 - sp74); + + sp70 = (0.6f + (0.4f * sp68)) * (300.0f * sp6C * (3.0f + spAC)); + sp70 *= 1.5f * sun_visibility; + + if ((i & 3)) { + sp70 *= 0.2f; + } + + sp98 = sp70 * cM_ssin(sp78); + sp94 = sp70 * cM_scos(sp78); + spC += 0x1000; + spA += 0x1C71; + + spE4.x = sp98; + spE4.y = sp94; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + spF0.x = pPos[0].x + spD8.x; + spF0.y = pPos[0].y + spD8.y; + spF0.z = pPos[0].z + spD8.z; + + sp7C = spFC.abs(spF0); + if (sp7C < lenz_packet->field_0x88) { + lenz_packet->field_0x88 = sp7C; + } else if (sp7C > lenz_packet->field_0x8c) { + lenz_packet->field_0x8c = sp7C; + } + + sp88 = lenz_packet->field_0x88 - lenz_packet->field_0x84; + if (sp88 > 0.0f) { + sp84 = 1.0f - ((sp7C - lenz_packet->field_0x84) / sp88); + } else { + sp84 = 1.0f; + } + + switch (i & 3) { + case 0: + sp80 = 0.1f; + break; + case 1: + sp80 = 1.1f; + break; + case 2: + sp80 = 0.2f; + break; + case 3: + sp80 = 0.4f; + break; + } + + f32 spC4 = spA8; + sp98 *= sun_visibility * (spC4 + sp80); + sp94 *= sun_visibility * (spC4 + sp80); + + spE4.x = spA0; + spE4.y = sp9C; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[0].x = sun_packet->mPos[0].x + spD8.x; + pos[0].y = sun_packet->mPos[0].y + spD8.y; + pos[0].z = sun_packet->mPos[0].z + spD8.z; + + spE4.x = sp98; + spE4.y = sp94; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[1].x = sun_packet->mPos[0].x + spD8.x; + pos[1].y = sun_packet->mPos[0].y + spD8.y; + pos[1].z = sun_packet->mPos[0].z + spD8.z; + + spE4.x = sp90; + spE4.y = sp8C; + spE4.z = 0.0f; + cMtx_multVec(camMtx, &spE4, &spD8); + pos[2].x = sun_packet->mPos[0].x + spD8.x; + pos[2].y = sun_packet->mPos[0].y + spD8.y; + pos[2].z = sun_packet->mPos[0].z + spD8.z; + + GXBegin(GX_TRIANGLES, GX_VTXFMT0, 3); + GXPosition3f32(pos[0].x, pos[0].y, pos[0].z); + GXPosition3f32(pos[1].x, pos[1].y, pos[1].z); + GXPosition3f32(pos[2].x, pos[2].y, pos[2].z); + GXEnd(); + } + } + + J3DShape::resetVcdVatCache(); + } } /* 80095E8C-8009682C .text dKyr_drawRain__FPA4_fPPUc */ @@ -1766,10 +2539,10 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) { dist = 1.0f; f32 size = 2.5f + (i / 250.0f); - f32 speed = dist * 70.0f + 5.0f; - tilt.x = speed * (dummy.x + pPkt->mCenterDelta.x * pPkt->mCenterDeltaMul * 10.0f + (i & 0x07) * 0.08f + windvec.x); + f32 speed = 5.0f + (dist * 70.0f); + tilt.x = speed * (dummy.x + (0.08f * (i & 0x07)) + pPkt->mCenterDelta.x * pPkt->mCenterDeltaMul * 10.0f + windvec.x); tilt.y = speed * (dummy.y + pPkt->mCenterDelta.y * pPkt->mCenterDeltaMul + windvec.y); - tilt.z = speed * (dummy.z + pPkt->mCenterDelta.z * pPkt->mCenterDeltaMul * 10.0f + (i & 0x03) * 0.08f + windvec.z); + tilt.z = speed * (dummy.z + (0.08f * (i & 0x03)) + pPkt->mCenterDelta.z * pPkt->mCenterDeltaMul * 10.0f + windvec.z); vp.x = -1.0f * -size; vp.y = 0.0f; @@ -2108,6 +2881,175 @@ void drawPoison(Mtx drawMtx, u8** pImg) { /* 800973CC-80097AD0 .text dKyr_drawHousi__FPA4_fPPUc */ void dKyr_drawHousi(Mtx drawMtx, u8** pImg) { /* Nonmatching */ + dKankyo_housi_Packet* housi_packet = g_env_light.mpHousiPacket; + static u32 rot = 0; + + Mtx camMtx; + Mtx rotMtx; + cXyz pos[4]; + GXTexObj spDC; + cXyz spD0; + Vec spC4; + Vec spB8; + + if (housi_packet->mCount != 0) { + f32 var_f25 = 120.0f; + + GXColor color_reg0; + color_reg0.r = 0xE5; + color_reg0.g = 0xFF; + color_reg0.b = 0xC8; + color_reg0.a = var_f25; + + GXColor color_reg1; + color_reg1.r = 0x43; + color_reg1.g = 0xD2; + color_reg1.b = 0xCA; + color_reg1.a = 0xFF; + + if (dComIfGd_getView() != NULL) { + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + } else { + return; + } + + f32 temp_f26 = 1.2f; + f32 temp_f24 = 6.5f; + + for (int i = 0; i < 2; i++) { + dKyr_set_btitex(&spDC, (ResTIMG*)pImg[0]); + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, color_reg0); + GXSetTevColor(GX_TEVREG1, color_reg1); + GXSetNumTexGens(1); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + + if (i == 1) { + GXSetZMode(GX_TRUE, GX_GEQUAL, GX_FALSE); + } else { + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); + } + + GXSetCullMode(GX_CULL_NONE); + GXSetClipMode(GX_CLIP_DISABLE); + GXSetNumIndStages(0); + + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + + MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot)); + MTXConcat(camMtx, rotMtx, camMtx); + + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + for (int j = 0; j < housi_packet->mCount; j++) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + spD0.x = housi_packet->mEffect[j].mBasePos.x + housi_packet->mEffect[j].mPos.x; + spD0.y = housi_packet->mEffect[j].mBasePos.y + housi_packet->mEffect[j].mPos.y; + spD0.z = housi_packet->mEffect[j].mBasePos.z + housi_packet->mEffect[j].mPos.z; + + if (i == 1 && j == 0) { + color_reg0.r = 0; + color_reg0.g = 0; + color_reg0.b = 0; + + color_reg1.r = 0; + color_reg1.g = 0; + color_reg1.b = 0; + + GXSetTevColor(GX_TEVREG1, color_reg1); + } + + if (i == 1) { + f32 temp_f4 = 100.0f; + if (!(spD0.y > player->current.pos.y + temp_f4)) { + if (!(spD0.y < player->current.pos.y - 20.0f)) { + if (!(housi_packet->mEffect[j].mAlpha <= 0.0f)) { + color_reg0.a = + housi_packet->mEffect[j].mAlpha * 40.0f * + (1.0f - ((spD0.y - player->current.pos.y) / 100.0f)); + spD0.y = player->current.pos.y - 20.0f; + goto block_14; // probably fake match + } + } + } + } else { + color_reg0.a = housi_packet->mEffect[j].mAlpha * var_f25; + + block_14: + GXLoadTexObj(&spDC, GX_TEXMAP0); + GXSetTevColor(GX_TEVREG0, color_reg0); + + f32 var_f27 = housi_packet->mEffect[j].field_0x48 * 9.0f; + + f32 temp_f28 = (var_f27 * 0.2f) * cM_fsin(housi_packet->mEffect[j].mScale.x * 5.0f); + f32 temp_f30 = (var_f27 * 0.2f) * cM_fsin(housi_packet->mEffect[j].mScale.y * 6.0f); + + spC4.x = var_f27 - temp_f30; + spC4.y = var_f27 - temp_f28; + spC4.z = 0.0f; + MTXMultVec(camMtx, &spC4, &spB8); + pos[0].x = spD0.x + spB8.x; + pos[0].y = spD0.y + spB8.y; + pos[0].z = spD0.z + spB8.z; + + spC4.x = -var_f27 + temp_f30; + spC4.y = var_f27 - temp_f28; + spC4.z = 0.0f; + MTXMultVec(camMtx, &spC4, &spB8); + pos[1].x = spD0.x + spB8.x; + pos[1].y = spD0.y + spB8.y; + pos[1].z = spD0.z + spB8.z; + + spC4.x = -var_f27 + temp_f30; + spC4.y = -var_f27 + temp_f28; + spC4.z = 0.0f; + MTXMultVec(camMtx, &spC4, &spB8); + pos[2].x = spD0.x + spB8.x; + pos[2].y = spD0.y + spB8.y; + pos[2].z = spD0.z + spB8.z; + + spC4.x = var_f27 - temp_f30; + spC4.y = -var_f27 + temp_f28; + spC4.z = 0.0f; + MTXMultVec(camMtx, &spC4, &spB8); + pos[3].x = spD0.x + spB8.x; + pos[3].y = spD0.y + spB8.y; + pos[3].z = spD0.z + spB8.z; + + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + + s16 var_r17 = 0x1FF; + + GXPosition3f32(pos[0].x, pos[0].y, pos[0].z); + GXTexCoord2s16(0, 0); + GXPosition3f32(pos[1].x, pos[1].y, pos[1].z); + GXTexCoord2s16(var_r17, 0); + GXPosition3f32(pos[2].x, pos[2].y, pos[2].z); + GXTexCoord2s16(var_r17, var_r17); + GXPosition3f32(pos[3].x, pos[3].y, pos[3].z); + GXTexCoord2s16(0, var_r17); + GXEnd(); + } + } + } + + GXSetClipMode(GX_CLIP_ENABLE); + J3DShape::resetVcdVatCache(); + } } /* 80097AD0-800987B8 .text dKyr_drawKazanbai__FPA4_fPPUc */ @@ -2123,6 +3065,217 @@ void dKyr_drawSnow(Mtx drawMtx, u8** pImg) { /* 80098FF0-80099D38 .text dKyr_drawStar__FPA4_fPPUc */ void dKyr_drawStar(Mtx drawMtx, u8** pImg) { /* Nonmatching */ + dScnKy_env_light_c* envlight = &dKy_getEnvlight(); + dKankyo_star_Packet* star_packet = g_env_light.mpStarPacket; + camera_class* camera = (camera_class*)dComIfGp_getCamera(0); + + static u32 rot = 0; + + cXyz pos[4]; + + Mtx camMtx; + cXyz spBC; + cXyz moon_proj; + cXyz star_proj; + + Vec sp98, sp8C; + cXyz moon_pos; + + BOOL sp38 = false; + + // Cassiopeia and Orion constellation positions + static csXyz hokuto_position[] = { + csXyz(13000, 10500, -16000), + csXyz(9400, 9800, -12646), + csXyz(10200, 11800, -13525), + csXyz(10300, 13450, -13525), + csXyz(15000, 18400, -16162), + csXyz(12500, 19800, -15000), + csXyz(9179, 17200, -14404), + csXyz(9500, 9800, -12646), + csXyz(-7421, 31005, 18798), + csXyz(-10937, 28000, 15000), + csXyz(-10000, 24902, 18400), + csXyz(-9400, 22500, 15900), + csXyz(-9179, 21300, 14300), + csXyz(-10300, 22000, 21000), + csXyz(-16000, 25500, 20000), + csXyz(0, 30000, 19000), + }; + + if (star_packet->mEffectNum != 0) { + GXColor color_reg0; + color_reg0.r = 0xDC; + color_reg0.g = 0xE6; + color_reg0.b = 0xFF; + color_reg0.a = 0xFF; + + if (dComIfGd_getView() != NULL) { + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + } else { + return; + } + + mDoLib_project(&envlight->mMoonPos, &moon_proj); + + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_NONE); + GXSetNumTexGens(0); + GXSetNumTevStages(1); + GXSetTevColor(GX_TEVREG0, color_reg0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR); + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetNumIndStages(0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + + Mtx rotMtx; + MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot)); + MTXConcat(camMtx, rotMtx, camMtx); + + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + rot++; + if (rot > 719) { + rot = 0; + } + + spBC.x = camera->mLookat.mEye.x; + spBC.y = camera->mLookat.mEye.y; + spBC.z = camera->mLookat.mEye.z; + + f32 sp34 = -1.0f; + int sp30 = 0; + f32 var_f30 = 0.0f; + + if (dComIfGd_getView() != NULL) { + var_f30 = dComIfGd_getView()->mFovy / 45.0f; + if (var_f30 >= 1.0f) { + var_f30 = 1.0f; + } + var_f30 = 1.0f - var_f30; + } + + f32 temp_f27 = 0.28f * (1.0f - var_f30); + + sp98.x = 0.0f; + sp98.y = temp_f27; + sp98.z = 0.0f; + cMtx_multVec(camMtx, &sp98, &sp8C); + pos[0].x = spBC.x + sp8C.x; + pos[0].y = spBC.y + sp8C.y; + pos[0].z = spBC.z + sp8C.z; + + sp98.x = temp_f27; + sp98.y = -(0.5f * temp_f27); + sp98.z = 0.0f; + cMtx_multVec(camMtx, &sp98, &sp8C); + pos[1].x = spBC.x + sp8C.x; + pos[1].y = spBC.y + sp8C.y; + pos[1].z = spBC.z + sp8C.z; + + sp98.x = -temp_f27; + sp98.y = -(0.5f * temp_f27); + sp98.z = 0.0f; + cMtx_multVec(camMtx, &sp98, &sp8C); + pos[2].x = spBC.x + sp8C.x; + pos[2].y = spBC.y + sp8C.y; + pos[2].z = spBC.z + sp8C.z; + + int sp48 = 0; + int sp44 = 0; + f32 var_f28 = 0.0f; + + for (int i = 0; i < star_packet->mEffectNum; i++) { + f32 star_size; + cXyz star_pos; + f32 sp2C = 300.0f; + + if (i < (s32)ARRAY_SIZE(hokuto_position)) { + star_pos.x = hokuto_position[i].x; + star_pos.y = hokuto_position[i].y; + star_pos.z = hokuto_position[i].z; + + if (i <= 7) { + star_size = 190.0f + star_packet->mEffect[0].mSin; + } else { + star_size = 290.0f + star_packet->mEffect[0].mSin; + } + + star_size -= temp_f27 * (0.5f * star_size); + } else { + star_size = star_packet->mEffect[0].mSin + (0.066f * (i & 0x0F)); + if (star_size > 1.0f) + star_size = (1.0f - (star_size - 1.0f)); + + f32 temp_f29 = 1.0f - (var_f28 * (1.0f / 202.0f)); + star_pos.x = temp_f29 * (sp2C * -cM_ssin((sp48 - 0x8000))); + star_pos.y = 45.0f + var_f28; + star_pos.z = temp_f29 * (sp2C * cM_scos((sp48 - 0x8000))); + + sp48 += sp44; + sp44 += 2250; + + temp_f29 = var_f28 / 200.0f; + temp_f29 *= temp_f29 * temp_f29; + var_f28 += 1.0f + (3.0f * temp_f29); + if (var_f28 > 200.0f) { + var_f28 = (20.0f * i) / 1000.0f; + } + } + + static const GXColor star_col[] = { + /* red */ {0xFF, 0xBE, 0xC8, 0xA0}, + /* green */ {0xC8, 0xFF, 0xBE, 0x78}, + /* blue */ {0xC8, 0xBE, 0xFF, 0x50}, + /* white */ {0xFF, 0xFF, 0xFF, 0xC8}, + }; + + if (i == 6 || i == 8) + color_reg0 = star_col[1]; + else if ((i & 0x3F) == 0) + color_reg0 = star_col[(i >> 4) & 3]; + else + color_reg0 = star_col[0]; + GXSetTevColor(GX_TEVREG0, color_reg0); + + cXyz center; + cXyz sp5C; + center.x = spBC.x + star_pos.x; + center.y = spBC.y + star_pos.y; + center.z = spBC.z + star_pos.z; + + mDoLib_project(¢er, &star_proj); + + f32 moon_dist_to_star = moon_proj.abs(star_proj); + f32 moon_threshold = 80.0f + (700.0f * (var_f30 * var_f30)); + + // if a star is too close to the moon then avoid drawing + if (moon_dist_to_star > moon_threshold) { + GXBegin(GX_QUADS, GX_VTXFMT0, 3); + GXPosition3f32(center.x + (star_size * (pos[0].x - spBC.x)), center.y + (star_size * (pos[0].y - spBC.y)), center.z + (star_size * (pos[0].z - spBC.z))); + GXPosition3f32(center.x + (star_size * (pos[1].x - spBC.x)), center.y + (star_size * (pos[1].y - spBC.y)), center.z + (star_size * (pos[1].z - spBC.z))); + GXPosition3f32(center.x + (star_size * (pos[2].x - spBC.x)), center.y + (star_size * (pos[2].y - spBC.y)), center.z + (star_size * (pos[2].z - spBC.z))); + GXEnd(); + + GXBegin(GX_QUADS, GX_VTXFMT0, 3); + GXPosition3f32(center.x - (star_size * (pos[0].x - spBC.x)), center.y - (star_size * (pos[0].y - spBC.y)), center.z - (star_size * (pos[0].z - spBC.z))); + GXPosition3f32(center.x - (star_size * (pos[1].x - spBC.x)), center.y - (star_size * (pos[1].y - spBC.y)), center.z - (star_size * (pos[1].z - spBC.z))); + GXPosition3f32(center.x - (star_size * (pos[2].x - spBC.x)), center.y - (star_size * (pos[2].y - spBC.y)), center.z - (star_size * (pos[2].z - spBC.z))); + GXEnd(); + } + } + + J3DShape::resetVcdVatCache(); + } } /* 80099D38-8009A5D4 .text drawWave__FPA4_fPPUc */ |
