diff --git a/include/d/d_kankyo_wether.h b/include/d/d_kankyo_wether.h index b612bc359..7ee084982 100644 --- a/include/d/d_kankyo_wether.h +++ b/include/d/d_kankyo_wether.h @@ -158,7 +158,7 @@ struct POISON_EFF { /* 0x20 */ f32 field_0x20; /* 0x24 */ f32 mAlpha; /* 0x28 */ f32 mSize; - /* 0x2C */ u8 field_0x2c[0x2E - 0x2C]; + /* 0x2C */ s16 field_0x2c; /* 0x2E */ s16 field_0x2e; }; diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index 7af591d06..48b91e970 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -522,19 +522,20 @@ BOOL dKyr_moon_arrival_check() { /* 8008C8B8-8008CF68 .text dKyr_sun_move__Fv */ void dKyr_sun_move() { - /* Nonmatching */ - dKankyo_sun_Packet* pSunPkt = g_env_light.mpSunPacket; - dKankyo_sunlenz_Packet* pLenzPkt = g_env_light.mpSunlenzPacket; - camera_class* pCamera = dComIfGp_getCamera(0); + camera_class* pCamera; + dKankyo_sun_Packet* pSunPkt = dKy_getEnvlight().mpSunPacket; + dKankyo_sunlenz_Packet* pLenzPkt = dKy_getEnvlight().mpSunlenzPacket; + pCamera = (camera_class*)dComIfGp_getCamera(0); + f32 pulsePos; f32 staringAtSunAmount = 0.0f; u8 numPointsVisible = 0, numCenterPointsVisible = 0; u32 stType = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()); cXyz lightDir; - if (g_env_light.mBaseLightInfluence.mColor.r == 0 && stType != dStageType_MISC_e) { - dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &g_env_light.mBaseLightInfluence.mPos, &lightDir); + if (dKy_getEnvlight().mBaseLightInfluence.mColor.r == 0 && stType != dStageType_MISC_e) { + dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &dKy_getEnvlight().mBaseLightInfluence.mPos, &lightDir); } else { - dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &g_env_light.mSunPos2, &lightDir); + dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &dKy_getEnvlight().mSunPos2, &lightDir); } pSunPkt->mPos[0].x = pCamera->mLookat.mEye.x + lightDir.x * 8000.0f; @@ -548,7 +549,7 @@ void dKyr_sun_move() { horizonY = 1.0f; horizonY = 1.0f - horizonY; horizonY *= horizonY; - f32 pulsePos = 1.0f - horizonY; + pulsePos = 1.0f - horizonY; if (dComIfGp_getStageStagInfo() != NULL) { dComIfGp_getStageStagInfo(); @@ -558,7 +559,7 @@ void dKyr_sun_move() { pSunPkt->field_0x3c--; pSunPkt->field_0x3d = false; - if (g_env_light.mCurTime > 95.7f && g_env_light.mCurTime < 292.5f) { + if (dKy_getEnvlight().mCurTime > 95.7f && dKy_getEnvlight().mCurTime < 292.5f) { f32 borderY = 0.0f; s32 numPointsCulled = 0; @@ -581,11 +582,9 @@ void dKyr_sun_move() { for (s32 i = 0; i < 5; i++) { f32 screenBottom = 490.0f - borderY; - cXyz chkpnt; - chkpnt.x = sun_chkpnt[i].x; - chkpnt.y = sun_chkpnt[i].y; - chkpnt.x = projected.x - chkpnt.x; - chkpnt.y = projected.y - chkpnt.y; + cXyz chkpnt = projected; + chkpnt.x -= sun_chkpnt[i].x; + chkpnt.y -= sun_chkpnt[i].y; if (chkpnt.x > 0.0f && chkpnt.x < 640.0 && chkpnt.y > borderY && chkpnt.y < screenBottom) { if (pSunPkt->mVizChkData[i] >= 0xFFFFFF) { @@ -635,7 +634,7 @@ void dKyr_sun_move() { pSunPkt->field_0x3d = false; } - if (g_env_light.mColpatWeather != 0 || (g_env_light.mColpatCurr != 0 && g_env_light.mColPatBlend > 0.5f)) { + if (dKy_getEnvlight().mColpatWeather != 0 || (dKy_getEnvlight().mColpatCurr != 0 && dKy_getEnvlight().mColPatBlend > 0.5f)) { numCenterPointsVisible = 0; numPointsVisible = 0; } @@ -645,7 +644,7 @@ void dKyr_sun_move() { numPointsVisible = 0; } - if (g_env_light.mCurTime < 120.0f || g_env_light.mCurTime > 270.0f) { + if (dKy_getEnvlight().mCurTime < 120.0f || dKy_getEnvlight().mCurTime > 270.0f) { numCenterPointsVisible = 0; numPointsVisible = 0; } @@ -665,16 +664,16 @@ void dKyr_sun_move() { } if (numPointsVisible >= 2) { - g_env_light.mpSunlenzPacket->mbDrawLenzInSky = false; + dKy_getEnvlight().mpSunlenzPacket->mbDrawLenzInSky = false; } else { - g_env_light.mpSunlenzPacket->mbDrawLenzInSky = true; + dKy_getEnvlight().mpSunlenzPacket->mbDrawLenzInSky = true; } - if (pSunPkt->mPos[0].y > 0.0f && !g_env_light.mpSunlenzPacket->mbDrawLenzInSky) { + if (pSunPkt->mPos[0].y > 0.0f && !dKy_getEnvlight().mpSunlenzPacket->mbDrawLenzInSky) { dKy_set_actcol_ratio(1.0f - staringAtSunAmount * pSunPkt->mVisibility); dKy_set_bgcol_ratio(1.0f - staringAtSunAmount * pSunPkt->mVisibility); - dKy_set_fogcol_ratio(pulsePos * staringAtSunAmount * pSunPkt->mVisibility * 0.5f + 1.0f); - dKy_set_vrboxcol_ratio(pulsePos * staringAtSunAmount * pSunPkt->mVisibility * 0.5f + 1.0f); + dKy_set_fogcol_ratio(staringAtSunAmount * pSunPkt->mVisibility * pulsePos * 0.5f + 1.0f); + dKy_set_vrboxcol_ratio(staringAtSunAmount * pSunPkt->mVisibility * pulsePos * 0.5f + 1.0f); } if (dKyr_moon_arrival_check()) { @@ -691,7 +690,7 @@ void dKyr_sun_move() { /* 8008CF68-8008D0B4 .text dKyr_rain_init__Fv */ void dKyr_rain_init() { - camera_class * pCamera = dComIfGp_getCamera(0); + camera_class * pCamera = (camera_class*)dComIfGp_getCamera(0); g_env_light.mpRainPacket->mpTxSnow01 = (u8*)dComIfG_getObjectRes("Always", ALWAYS_I8_TX_SNOW01); g_env_light.mpRainPacket->mpTxRingAHalf = (u8*)dComIfG_getObjectRes("Always", ALWAYS_BTI_TXA_RING_A_32HAFE); g_env_light.mpRainPacket->mCamEyePos = pCamera->mLookat.mEye; @@ -713,13 +712,13 @@ void dKyr_rain_init() { /* 8008D0B4-8008D0DC .text rain_bg_chk__FP19dKankyo_rain_Packeti */ void rain_bg_chk(dKankyo_rain_Packet* pPkt, int idx) { - camera_class * pCamera = g_dComIfG_gameInfo.play.mCameraInfo[0].mpCamera; + camera_class* pCamera = g_dComIfG_gameInfo.play.mCameraInfo[0].mpCamera; pPkt->mEff[idx].field_0x30 = pCamera->mLookat.mCenter.y + -800.0f; } /* 8008D0DC-8008D53C .text overhead_bg_chk__Fv */ bool overhead_bg_chk() { - camera_class * pCamera = (camera_class*)dComIfGp_getCamera(0); + camera_class* pCamera = (camera_class*)dComIfGp_getCamera(0); bool ret = false; dBgS_ObjGndChk_All gndChk; @@ -741,7 +740,7 @@ bool overhead_bg_chk() { /* 8008D638-8008DAF0 .text forward_overhead_bg_chk__FP4cXyzf */ bool forward_overhead_bg_chk(cXyz* pPos, f32 dist) { - camera_class * pCamera = (camera_class*)dComIfGp_getCamera(0); + camera_class* pCamera = (camera_class*)dComIfGp_getCamera(0); bool ret = false; dBgS_ObjGndChk_All gndChk; @@ -780,7 +779,7 @@ void dKyr_housi_move() { /* 8008F0BC-8008F23C .text dKyr_snow_init__Fv */ void dKyr_snow_init() { - camera_class * pCamera = dComIfGp_getCamera(0); + camera_class* pCamera = (camera_class*)dComIfGp_getCamera(0); g_env_light.mpSnowPacket = new(0x20) dKankyo_snow_Packet(); if (g_env_light.mpSnowPacket != NULL) { if (strcmp(dComIfGp_getStartStageName(), "Adanmae") != 0) { @@ -823,7 +822,7 @@ void dKyr_star_init() { /* 80090D50-80090DE0 .text dKyr_star_move__Fv */ void dKyr_star_move() { - dKankyo_star_Packet * pPkt = g_env_light.mpStarPacket; + dKankyo_star_Packet* pPkt = g_env_light.mpStarPacket; pPkt->mCount = g_env_light.mStarCount; if (pPkt->mCount != 0) { f32 wave = fabsf(cM_fsin(pPkt->mStarEff[0].mAnimCounter)); @@ -838,10 +837,10 @@ void wave_move() { /* Nonmatching */ dScnKy_env_light_c& envLight = dKy_getEnvlight(); dStage_FileList_dt_c* fili_p; - camera_class* pCamera; fopAc_ac_c* pPlayer; cXyz* windVecP; dKankyo_wave_Packet* pPkt; + camera_class* pCamera; f32 seaLevel; cXyz newPos2; cXyz eyevect; @@ -865,7 +864,7 @@ void wave_move() { fili_p = NULL; pPkt = g_env_light.mpWavePacket; - pCamera = dComIfGp_getCamera(0); + pCamera = (camera_class*)dComIfGp_getCamera(0); pPlayer = dComIfGp_getPlayer(0); roomNo = dComIfGp_roomControl_getStayNo(); @@ -2120,7 +2119,148 @@ void drawWave(Mtx drawMtx, u8** pImg) { /* 8009A5D4-8009AB88 .text drawCloudShadow__FPA4_fPPUc */ void drawCloudShadow(Mtx drawMtx, u8** pImg) { - /* Nonmatching */ + dScnKy_env_light_c& envLight = dKy_getEnvlight(); + camera_class *pCamera = (camera_class*)dComIfGp_getCamera(0); + dKankyo_cloud_Packet* pPkt = g_env_light.mpMoyaPacket; + static f32 rot = 0.0f; + GXTexObj texObj; + Mtx camMtx; + Mtx rotMtx; + cXyz pos[4]; + cXyz windvec; + cXyz vp; + cXyz lp; + cXyz p; + cXyz dummy; + cXyz tilt; + + if (pPkt->mCount <= 0) + return; + + j3dSys.reinitGX(); + if (dComIfGd_getView() != NULL) { + MTXInverse(dComIfGd_getViewRotMtx(), camMtx); + } else { + return; + } + +#if VERSION != VERSION_JPN + GXSetClipMode(GX_CLIP_DISABLE); +#endif + + GXColor reg0, reg1; + if (dKy_getEnvlight().mMoyaMode != 3 && dKy_getEnvlight().mMoyaMode != 4) { + reg0.r = envLight.mBG0_K0.r; + reg0.g = envLight.mBG0_K0.g; + reg0.b = envLight.mBG0_K0.b; + + reg1.r = envLight.mBG0_K0.r; + reg1.g = envLight.mBG0_K0.g; + reg1.b = envLight.mBG0_K0.b; + } else { + reg0.r = envLight.mBG3_K0.r; + reg0.g = envLight.mBG3_K0.g; + reg0.b = envLight.mBG3_K0.b; + + reg1.r = envLight.mBG3_K0.r; + reg1.g = envLight.mBG3_K0.g; + reg1.b = envLight.mBG3_K0.b; + } + + dKyr_set_btitex(&texObj, (ResTIMG*)pImg[0]); + + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, reg0); + GXSetTevColor(GX_TEVREG1, reg1); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, false, GX_PTIDENTITY); + 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, 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, true, GX_TEVPREV); + dKy_GxFog_set(); + 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); + GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE); + GXSetCullMode(GX_CULL_NONE); + 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); + MTXRotDeg(rotMtx, 'Z', rot); + MTXConcat(camMtx, rotMtx, camMtx); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + rot -= 1.5f; + if (rot < 0.0f) + rot = 719.0f; + GXSetCurrentMtx(GX_PNMTX0); + + for (s32 i = 0; i < pPkt->mCount; i++) { + f32 size = pPkt->mEff[i].mSize; + if (pPkt->mEff[i].mAlpha <= 0.0f) + continue; + + GXLoadTexObj(&texObj, GX_TEXMAP0); + + reg0.a = pPkt->mEff[i].mAlpha * 255.0f; + GXSetTevColor(GX_TEVREG0, reg0); + + 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; + + vp.x = -size; + vp.y = size; + vp.z = 0.0f; + MTXMultVec(camMtx, &vp, &lp); + pos[0].x = p.x + lp.x; + pos[0].y = p.y + lp.y; + pos[0].z = p.z + lp.z; + + vp.x = size; + vp.y = size; + vp.z = 0.0f; + MTXMultVec(camMtx, &vp, &lp); + pos[1].x = p.x + lp.x; + pos[1].y = p.y + lp.y; + pos[1].z = p.z + lp.z; + + vp.x = size; + vp.y = -size; + vp.z = 0.0f; + MTXMultVec(camMtx, &vp, &lp); + pos[2].x = p.x + lp.x; + pos[2].y = p.y + lp.y; + pos[2].z = p.z + lp.z; + + vp.x = -size; + vp.y = -size; + vp.z = 0.0f; + MTXMultVec(camMtx, &vp, &lp); + pos[3].x = p.x + lp.x; + pos[3].y = p.y + lp.y; + pos[3].z = p.z + lp.z; + + 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(0xFF, 0); + GXPosition3f32(pos[2].x, pos[2].y, pos[2].z); + GXTexCoord2s16(0xFF, 0xFF); + GXPosition3f32(pos[3].x, pos[3].y, pos[3].z); + GXTexCoord2s16(0, 0xFF); + GXEnd(); + } + +#if VERSION != VERSION_JPN + GXSetClipMode(GX_CLIP_ENABLE); + J3DShape::resetVcdVatCache(); +#endif } /* 8009AB88-8009B9C4 .text drawVrkumo__FPA4_fR8GXColorPPUc */