From ac7c20cab438d0c02aa56c80abe1002955561bd4 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Thu, 30 Nov 2023 20:22:55 -0500 Subject: [PATCH] match c_bg_s, fix d_kankyo_rain double branches --- configure.py | 2 +- src/SSystem/SComponent/c_bg_s.cpp | 23 +- src/d/d_kankyo_rain.cpp | 447 +++++++++++++++--------------- 3 files changed, 241 insertions(+), 231 deletions(-) diff --git a/configure.py b/configure.py index f5e5f8e52..0462ec383 100644 --- a/configure.py +++ b/configure.py @@ -522,7 +522,7 @@ config.libs = [ Object(Matching, "SSystem/SComponent/c_xyz.cpp"), Object(Matching, "SSystem/SComponent/c_sxyz.cpp"), Object(Matching, "SSystem/SComponent/c_math.cpp"), - Object(NonMatching, "SSystem/SComponent/c_bg_s.cpp"), + Object(Matching, "SSystem/SComponent/c_bg_s.cpp"), Object(Matching, "SSystem/SComponent/c_bg_s_chk.cpp"), Object(Matching, "SSystem/SComponent/c_bg_s_gnd_chk.cpp"), Object(Matching, "SSystem/SComponent/c_bg_s_lin_chk.cpp"), diff --git a/src/SSystem/SComponent/c_bg_s.cpp b/src/SSystem/SComponent/c_bg_s.cpp index 40a2a6247..0b585df43 100644 --- a/src/SSystem/SComponent/c_bg_s.cpp +++ b/src/SSystem/SComponent/c_bg_s.cpp @@ -76,19 +76,17 @@ static void dummy() { } /* 80246600-8024669C .text Release__4cBgSFP4cBgW */ -int cBgS::Release(cBgW* bgw) { +bool cBgS::Release(cBgW* bgw) { if (bgw == NULL) return true; if (bgw->ChkUsed() && bgw->GetId() >= 0 && bgw->GetId() < 0x100 && m_chk_element[bgw->GetId()].ChkUsed()) { m_chk_element[bgw->GetId()].Release(); bgw->SetId(256); - goto done; + } else { + return true; } - return true; - -done: return false; } @@ -136,8 +134,8 @@ f32 cBgS::GroundCross(cBgS_GndChk* chk) { chk->ClearPi(); chk->mWallPrecheck = (chk->mFlag & 0x02); chk->mGndPrecheck = (chk->mFlag & 0x01); - for (s32 bg_index = 0; bg_index < (s32)ARRAY_SIZE(m_chk_element); bg_index++) { - cBgS_ChkElm* elm = &m_chk_element[bg_index]; + cBgS_ChkElm* elm = m_chk_element; + for (s32 bg_index = 0; bg_index < (s32)ARRAY_SIZE(m_chk_element); bg_index++, elm++) { if (elm->ChkUsed() && elm->m_bgw_base_ptr->pm_vtx_tbl != NULL && !chk->ChkSameActorPid(elm->m_actor_id)) { if (elm->m_bgw_base_ptr->GroundCrossGrpRp(chk, elm->m_bgw_base_ptr->m_rootGrpIdx, 1)) { chk->SetActorInfo(bg_index, elm->m_bgw_base_ptr, elm->m_actor_id); @@ -150,10 +148,13 @@ f32 cBgS::GroundCross(cBgS_GndChk* chk) { /* 80246A14-80246C98 .text ConvDzb__4cBgSFPv */ void* cBgS::ConvDzb(void* work) { cBgD_t * pbgd = (cBgD_t *)work; - if (pbgd->flag & 0x80000000) - return; - pbgd->flag |= 0x80000000; + if (((pbgd->flag & 0x80000000) == 0)) { + pbgd->flag |= 0x80000000; + } else { + return pbgd; + } + JUT_ASSERT(0x214, ((int)pbgd->m_v_tbl % 4) == 0); JUT_ASSERT(0x215, ((int)pbgd->m_t_tbl % 2) == 0); JUT_ASSERT(0x216, ((int)pbgd->m_b_tbl % 2) == 0); @@ -173,7 +174,7 @@ void* cBgS::ConvDzb(void* work) { for (s32 i = 0; i < pbgd->m_g_num; i++) { pbgd->m_g_tbl[i].m_name = (char*)((u32)pbgd + (u32)pbgd->m_g_tbl[i].m_name); } - + return pbgd; } diff --git a/src/d/d_kankyo_rain.cpp b/src/d/d_kankyo_rain.cpp index ea8b88e2c..13a1ddcfc 100644 --- a/src/d/d_kankyo_rain.cpp +++ b/src/d/d_kankyo_rain.cpp @@ -523,11 +523,13 @@ void wave_move() { if (g_env_light.mWaveChan.mWaveFlatInter >= 1.0f) return; - if (dComIfGd_getView() == NULL) + if (dComIfGd_getView() != NULL) { + Mtx drawMtx; + MTXInverse(dComIfGd_getViewRotMtx(), drawMtx); + } else { return; + } - Mtx drawMtx; - MTXInverse(dComIfGd_getViewRotMtx(), drawMtx); cXyz d0; dKy_set_eyevect_calc2(pCamera, &eyevect, g_env_light.mWaveChan.mWaveSpawnDist, 0.0f); d0.z = 0.0f; @@ -898,131 +900,133 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) { if (dComIfGd_getView() != NULL) { Mtx camMtx; 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, reg0); - GXSetTevColor(GX_TEVREG1, reg1); - GXSetNumTexGens(1); - GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_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); - 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(true, GX_LEQUAL, false); - GXSetCullMode(GX_CULL_NONE); + 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, reg0); + GXSetTevColor(GX_TEVREG1, reg1); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_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); + 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(true, GX_LEQUAL, false); + GXSetCullMode(GX_CULL_NONE); #if VERSION != VERSION_JPN - GXSetClipMode(GX_CLIP_DISABLE); + GXSetClipMode(GX_CLIP_DISABLE); #endif - 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); - Mtx rotMtx; - MTXRotRad(rotMtx, 'Z', rot * 0.01745329f); - MTXConcat(drawMtx, rotMtx, drawMtx); - GXLoadPosMtxImm(drawMtx, GX_PNMTX0); - GXSetCurrentMtx(GX_PNMTX0); + 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); + Mtx rotMtx; + MTXRotRad(rotMtx, 'Z', rot * 0.01745329f); + MTXConcat(drawMtx, rotMtx, drawMtx); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); - for (s32 i = 0; i < pPkt->mRainCount; i++) { - f32 alpha = pPkt->mRainEff[i].mAlpha; - if (alpha <= 0.0f) - continue; + for (s32 i = 0; i < pPkt->mRainCount; i++) { + f32 alpha = pPkt->mRainEff[i].mAlpha; + if (alpha <= 0.0f) + continue; - reg0.a = alpha * 14.0f; - GXSetTevColor(GX_TEVREG0, reg0); + reg0.a = alpha * 14.0f; + GXSetTevColor(GX_TEVREG0, reg0); - cXyz pos[4], p; + cXyz pos[4], p; - p.x = pPkt->mRainEff[i].mBasePos.x + + pPkt->mRainEff[i].mPos.x; - p.y = pPkt->mRainEff[i].mBasePos.y + + pPkt->mRainEff[i].mPos.y; - p.z = pPkt->mRainEff[i].mBasePos.z + + pPkt->mRainEff[i].mPos.z; + p.x = pPkt->mRainEff[i].mBasePos.x + + pPkt->mRainEff[i].mPos.x; + p.y = pPkt->mRainEff[i].mBasePos.y + + pPkt->mRainEff[i].mPos.y; + p.z = pPkt->mRainEff[i].mBasePos.z + + pPkt->mRainEff[i].mPos.z; - f32 dist = p.abs(pCamera->mLookat.mEye); - dist = dist / 1500.0f + 0.1f; - if (dist > 1.0f) - dist = 1.0f; + f32 dist = p.abs(pCamera->mLookat.mEye); + dist = dist / 1500.0f + 0.1f; + if (dist > 1.0f) + dist = 1.0f; - f32 size = 2.5f + (i / 250.0f); + f32 size = 2.5f + (i / 250.0f); - f32 speed = dist * 70.0f + 5.0f; + f32 speed = dist * 70.0f + 5.0f; - cXyz tilt; - tilt.x = speed * (windvec.x + pPkt->mCenterDelta.x * pPkt->mCenterDeltaMul + (i & 0x07) * 0.08f + 0.0f); - tilt.y = speed * (windvec.y + pPkt->mCenterDelta.y * pPkt->mCenterDeltaMul + -2.0f); - tilt.z = speed * (windvec.z + pPkt->mCenterDelta.z * pPkt->mCenterDeltaMul + (i & 0x03) * 0.08f + 0.0f); + cXyz tilt; + tilt.x = speed * (windvec.x + pPkt->mCenterDelta.x * pPkt->mCenterDeltaMul + (i & 0x07) * 0.08f + 0.0f); + tilt.y = speed * (windvec.y + pPkt->mCenterDelta.y * pPkt->mCenterDeltaMul + -2.0f); + tilt.z = speed * (windvec.z + pPkt->mCenterDelta.z * pPkt->mCenterDeltaMul + (i & 0x03) * 0.08f + 0.0f); - cXyz worldPos, lp; + cXyz worldPos, lp; - worldPos.x = -size * -1.0f; - worldPos.y = 0.0f; - worldPos.z = 0.0f; - MTXMultVec(drawMtx, &worldPos, &lp); - pos[0].x = (p.x + lp.x) - tilt.x; - pos[0].y = (p.y + lp.y) - tilt.y; - pos[0].z = (p.z + lp.z) - tilt.z; + worldPos.x = -size * -1.0f; + worldPos.y = 0.0f; + worldPos.z = 0.0f; + MTXMultVec(drawMtx, &worldPos, &lp); + pos[0].x = (p.x + lp.x) - tilt.x; + pos[0].y = (p.y + lp.y) - tilt.y; + pos[0].z = (p.z + lp.z) - tilt.z; - worldPos.x = size; - worldPos.y = 0.0f; - worldPos.z = 0.0f; - MTXMultVec(drawMtx, &worldPos, &lp); - pos[1].x = (p.x + lp.x) - tilt.x; - pos[1].y = (p.y + lp.y) - tilt.y; - pos[1].z = (p.z + lp.z) - tilt.z; + worldPos.x = size; + worldPos.y = 0.0f; + worldPos.z = 0.0f; + MTXMultVec(drawMtx, &worldPos, &lp); + pos[1].x = (p.x + lp.x) - tilt.x; + pos[1].y = (p.y + lp.y) - tilt.y; + pos[1].z = (p.z + lp.z) - tilt.z; - worldPos.x = -size * -1.0f; - worldPos.y = 0.0f; - worldPos.z = 0.0f; - MTXMultVec(drawMtx, &worldPos, &lp); - pos[2].x = p.x + lp.x; - pos[2].y = p.y + lp.y; - pos[2].z = p.z + lp.z; + worldPos.x = -size * -1.0f; + worldPos.y = 0.0f; + worldPos.z = 0.0f; + MTXMultVec(drawMtx, &worldPos, &lp); + pos[2].x = p.x + lp.x; + pos[2].y = p.y + lp.y; + pos[2].z = p.z + lp.z; - worldPos.x = size; - worldPos.y = 0.0f; - worldPos.z = 0.0f; - MTXMultVec(drawMtx, &worldPos, &lp); - pos[3].x = p.x; - pos[3].y = p.y; - pos[3].z = p.z; + worldPos.x = size; + worldPos.y = 0.0f; + worldPos.z = 0.0f; + MTXMultVec(drawMtx, &worldPos, &lp); + pos[3].x = p.x; + pos[3].y = p.y; + pos[3].z = p.z; - for (s32 j = 0; j < 4; j++) { - static const cXyz add_table[4] = { - cXyz(150.0f, 0.0f, 0.0f), - cXyz(0.0f, 150.0f, 150.0f), - cXyz(150.0f, 320.0f, 150.0f), - cXyz(45.0f, 480.0f, 45.0f), - }; + for (s32 j = 0; j < 4; j++) { + static const cXyz add_table[4] = { + cXyz(150.0f, 0.0f, 0.0f), + cXyz(0.0f, 150.0f, 150.0f), + cXyz(150.0f, 320.0f, 150.0f), + cXyz(45.0f, 480.0f, 45.0f), + }; - GXBegin(GX_QUADS, GX_VTXFMT0, 4); - const cXyz * pAdd = &add_table[i]; - f32 addX = pAdd->x, addY = pAdd->y, addZ = pAdd->z; - GXPosition3f32(pos[0].x + addX, pos[0].y + addY, pos[0].z + addZ); - GXTexCoord2s16(0, 0); - GXPosition3f32(pos[1].x + addX, pos[1].y + addY, pos[1].z + addZ); - GXTexCoord2s16(0xFF, 0); - GXPosition3f32(pos[2].x + addX, pos[2].y + addY, pos[2].z + addZ); - GXTexCoord2s16(0xFF, 0xFF); - GXPosition3f32(pos[3].x + addX, pos[3].y + addY, pos[3].z + addZ); - GXTexCoord2s16(0, 0xFF); - GXEnd(); - } + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + const cXyz * pAdd = &add_table[i]; + f32 addX = pAdd->x, addY = pAdd->y, addZ = pAdd->z; + GXPosition3f32(pos[0].x + addX, pos[0].y + addY, pos[0].z + addZ); + GXTexCoord2s16(0, 0); + GXPosition3f32(pos[1].x + addX, pos[1].y + addY, pos[1].z + addZ); + GXTexCoord2s16(0xFF, 0); + GXPosition3f32(pos[2].x + addX, pos[2].y + addY, pos[2].z + addZ); + GXTexCoord2s16(0xFF, 0xFF); + GXPosition3f32(pos[3].x + addX, pos[3].y + addY, pos[3].z + addZ); + GXTexCoord2s16(0, 0xFF); + GXEnd(); } + } #if VERSION != VERSION_JPN - GXSetClipMode(GX_CLIP_ENABLE); - J3DShape::resetVcdVatCache(); + GXSetClipMode(GX_CLIP_ENABLE); + J3DShape::resetVcdVatCache(); #endif - } } } } @@ -1036,120 +1040,125 @@ void dKyr_drawSibuki(Mtx drawMtx, u8** pImg) { if (g_env_light.mSnowCount == 0 && dComIfGd_getView() != NULL) { Mtx camMtx; MTXInverse(dComIfGd_getViewRotMtx(), camMtx); - - f32 alpha = 200.0f; - if (pPkt->mStatus & 1) - alpha = 0.0f; - else if (pPkt->mStatus & 2) - alpha = 200.0f; - - cLib_addCalc(&pPkt->mSibukiAlpha, alpha, 0.2f, 30.0f, 0.001f); - - cXyz eyevect, camDir; - dKy_set_eyevect_calc(pCamera, &eyevect, 7000.0f, 4000.0f); - dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &pCamera->mLookat.mCenter, &camDir); - - float alphaFade = 0.0f; - if (camDir.y > 0.0f) { - if (camDir.y < 0.5f) - alphaFade = 1.0f - (camDir.y / 0.5f); - } else { - alphaFade = 1.0f; - } - - GXColor color; - color.r = 0xB4; - color.g = 0xC8; - color.b = 0xC8; - color.a = (u8)(pPkt->mSibukiAlpha * alphaFade); - - GXTexObj texObj; - dKyr_init_btitex(&texObj, (ResTIMG*)pImg[1]); - GXLoadTexObj(&texObj, GX_TEXMAP0); - - GXSetNumChans(0); - GXSetTevColor(GX_TEVREG0, color); - GXSetTevColor(GX_TEVREG1, color); - 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); - 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(true, GX_GEQUAL, false); - GXSetCullMode(GX_CULL_NONE); -#if VERSION != VERSION_JPN - GXSetClipMode(GX_CLIP_DISABLE); -#endif - 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); - GXLoadPosMtxImm(drawMtx, GX_PNMTX0); - GXSetCurrentMtx(GX_PNMTX0); - - f32 scale; - if (dComIfGd_getView() != NULL) { - scale = dComIfGd_getView()->mFovy / 20.0f; - if (scale >= 1.0f) - scale = 1.0f; - scale = 1.0f - scale; - } else { - scale = 0.2f; - } - - for (s32 i = 0; i < g_env_light.mRainCount >> 1; i++) { - cXyz pos[4], p; - - f32 size = 20.0f + (scale * cM_rndF(25.0f)); - - f32 localX = cM_rndFX(3600.0f); - f32 localY = cM_rndFX(1500.0f); - f32 localZ = cM_rndFX(3600.0f); - - p.x = eyevect.x + localX; - p.y = eyevect.y + localY; - p.z = eyevect.z + localZ; - - pos[0].x = p.x - size; - pos[0].y = p.y; - pos[0].z = p.z - size; - - pos[1].x = p.x + size; - pos[1].y = p.y; - pos[1].z = p.z - size; - - pos[2].x = p.x + size; - pos[2].y = p.y; - pos[2].z = p.z + size; - - pos[3].x = p.x - size; - pos[3].y = p.y; - pos[3].z = p.z + size; - - 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(0x1FF, 0); - GXPosition3f32(pos[2].x, pos[2].y, pos[2].z); - GXTexCoord2s16(0x1FF, 0x1FF); - GXPosition3f32(pos[3].x, pos[3].y, pos[3].z); - GXTexCoord2s16(0, 0x1FF); - GXEnd(); - } - -#if VERSION != VERSION_JPN - GXSetClipMode(GX_CLIP_ENABLE); - J3DShape::resetVcdVatCache(); -#endif + } else { + return; } + + f32 alpha = 200.0f; + if (pPkt->mStatus & 1) + alpha = 0.0f; + else if (pPkt->mStatus & 2) + alpha = 200.0f; + + cLib_addCalc(&pPkt->mSibukiAlpha, alpha, 0.2f, 30.0f, 0.001f); + + cXyz eyevect, camDir; + dKy_set_eyevect_calc(pCamera, &eyevect, 7000.0f, 4000.0f); + dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &pCamera->mLookat.mCenter, &camDir); + + f32 alphaFade; + if (camDir.y > 0.0f) { + if (camDir.y < 0.5f) { + alphaFade = 1.0f - (camDir.y / 0.5f); + } else { + alphaFade = 0.0f; + } + } else { + alphaFade = 1.0f; + } + + GXColor color; + color.r = 0xB4; + color.g = 0xC8; + color.b = 0xC8; + color.a = (u8)(pPkt->mSibukiAlpha * alphaFade); + + GXTexObj texObj; + dKyr_init_btitex(&texObj, (ResTIMG*)pImg[1]); + GXLoadTexObj(&texObj, GX_TEXMAP0); + + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, color); + GXSetTevColor(GX_TEVREG1, color); + 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); + 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(true, GX_GEQUAL, false); + GXSetCullMode(GX_CULL_NONE); +#if VERSION != VERSION_JPN + GXSetClipMode(GX_CLIP_DISABLE); +#endif + 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); + GXLoadPosMtxImm(drawMtx, GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + f32 scale; + if (dComIfGd_getView() != NULL) { + scale = dComIfGd_getView()->mFovy / 20.0f; + if (scale >= 1.0f) + scale = 1.0f; + scale = 1.0f - scale; + } else { + scale = 0.2f; + } + + for (s32 i = 0; i < g_env_light.mRainCount >> 1; i++) { + cXyz pos[4], p; + + f32 size = 20.0f + (scale * cM_rndF(25.0f)); + + f32 localX = cM_rndFX(3600.0f); + f32 localY = cM_rndFX(1500.0f); + f32 localZ = cM_rndFX(3600.0f); + + p.x = eyevect.x + localX; + p.y = eyevect.y + localY; + p.z = eyevect.z + localZ; + + pos[0].x = p.x - size; + pos[0].y = p.y; + pos[0].z = p.z - size; + + pos[1].x = p.x + size; + pos[1].y = p.y; + pos[1].z = p.z - size; + + pos[2].x = p.x + size; + pos[2].y = p.y; + pos[2].z = p.z + size; + + pos[3].x = p.x - size; + pos[3].y = p.y; + pos[3].z = p.z + size; + + 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(0x1FF, 0); + GXPosition3f32(pos[2].x, pos[2].y, pos[2].z); + GXTexCoord2s16(0x1FF, 0x1FF); + GXPosition3f32(pos[3].x, pos[3].y, pos[3].z); + GXTexCoord2s16(0, 0x1FF); + GXEnd(); + } + +#if VERSION != VERSION_JPN + GXSetClipMode(GX_CLIP_ENABLE); + J3DShape::resetVcdVatCache(); +#endif } /* 80096D18-800973CC .text drawPoison__FPA4_fPPUc */