d_kankyo_rain dKyr_drawRain work

This commit is contained in:
Jasper St. Pierre
2023-11-30 20:16:53 -08:00
parent 292f236570
commit dec72d3a93
+42 -44
View File
@@ -885,18 +885,25 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
dKankyo_rain_Packet * pPkt = g_env_light.mpRainPacket;
camera_class *pCamera = dComIfGp_getCamera(0);
cXyz windvec = dKyw_get_wind_vecpow();
Mtx camMtx;
cXyz pos[4];
cXyz windvec;
cXyz vp;
cXyz lp;
cXyz p;
cXyz dummy;
cXyz tilt;
Mtx rotMtx;
GXColor reg0, reg1;
static s32 rot = 0;
windvec = dKyw_get_wind_vecpow();
static u32 rot = 0;
if (g_env_light.mSnowCount == 0) {
cXyz dummy;
dummy.x = 0.0f;
dummy.y = -2.0f;
dummy.z = 0.0f;
dummy.set(0.0f, -2.0f, 0.0f);
if (pPkt->mRainCount != 0) {
GXColor reg0, reg1;
reg0.r = 0xFF;
reg0.g = 0xFF;
reg0.b = 0xFF;
@@ -909,7 +916,6 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
reg1.a = 0x0A;
if (dComIfGd_getView() != NULL) {
Mtx camMtx;
MTXInverse(dComIfGd_getViewRotMtx(), camMtx);
} else {
return;
@@ -943,9 +949,8 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
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);
MTXConcat(camMtx, rotMtx, drawMtx);
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
@@ -957,11 +962,9 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
reg0.a = alpha * 14.0f;
GXSetTevColor(GX_TEVREG0, reg0);
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;
@@ -969,47 +972,42 @@ 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);
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);
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;
worldPos.x = -size * -1.0f;
worldPos.y = 0.0f;
worldPos.z = 0.0f;
MTXMultVec(drawMtx, &worldPos, &lp);
vp.x = -1.0f * -size;
vp.y = 0.0f;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &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);
vp.x = -1.0f * size;
vp.y = 0.0f;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &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);
vp.x = -1.0f * -size;
vp.y = 0.0f;
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;
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;
vp.x = -1.0f * size;
vp.y = 0.0f;
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;
for (s32 j = 0; j < 4; j++) {
static const cXyz add_table[4] = {
@@ -1020,8 +1018,8 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
};
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
const cXyz * pAdd = &add_table[i];
f32 addX = pAdd->x, addY = pAdd->y, addZ = pAdd->z;
const cXyz & addv = add_table[j];
f32 addX = addv.x, addY = addv.y, addZ = addv.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);