d_kankyo_rain work

This commit is contained in:
Jasper St. Pierre
2023-11-30 22:27:56 -08:00
parent d518b6b723
commit d0971c5a81
4 changed files with 479 additions and 27 deletions
+7 -4
View File
@@ -75,7 +75,7 @@ public:
/* 0x0010 */ u8* mpTxSnow01;
/* 0x0014 */ u8* mpTxRingAHalf;
/* 0x0018 */ RAIN_EFF mRainEff[250];
/* 0x0018 */ RAIN_EFF mEff[250];
/* 0x36C8 */ f32 field_0x36c8;
/* 0x36CC */ f32 field_0x36cc;
/* 0x36D0 */ s16 mRainCount;
@@ -154,7 +154,10 @@ struct POISON_EFF {
/* 0x00 */ s8 mStatus;
/* 0x04 */ cXyz mPos;
/* 0x10 */ u8 field_0x10[0x1E];
/* 0x10 */ u8 field_0x10[0x10];
/* 0x20 */ f32 field_0x20;
/* 0x24 */ f32 mAlpha;
/* 0x28 */ f32 mSize;
/* 0x2E */ s16 field_0x2e;
};
@@ -168,9 +171,9 @@ public:
virtual ~dKankyo_poison_Packet();
/* 0x0010 */ POISON_EFF mEff[1000];
/* 0xBB90 */ cXyz field_0xbb90;
/* 0xBB90 */ cXyz mBasePos;
/* 0xBB9C */ cXyz field_0xbb9c;
/* 0xBBA8 */ u32 mCount;
/* 0xBBA8 */ s32 mCount;
/* 0xBBAC */ u8* mpTexture;
};
+6
View File
@@ -40,6 +40,9 @@ inline void C_MTXRotAxisRad(Mtx m, const Vec* axis, f32 rad) {
PSMTXRotAxisRad(m, axis, rad);
}
#define MTXDegToRad(deg) ((deg) * 0.01745329252f)
#define MTXRadToDeg(rad) ((rad) * 57.29577951f)
/* When compiling in debug mode, use C implementations */
#ifdef DEBUG
#define MTXIdentity C_MTXIdentity
@@ -69,6 +72,9 @@ inline void C_MTXRotAxisRad(Mtx m, const Vec* axis, f32 rad) {
#define MTXQuat PSMTXQuat
#endif
#define MTXRotDeg(m, axis, deg) MTXRotRad(m, axis, MTXDegToRad(deg))
#define MTXRotAxisDeg(m, axis, deg) MTXRotAxisRad(m, axis, MTXDegToRad(deg))
#ifdef __cplusplus
};
#endif
+1 -1
View File
@@ -245,7 +245,7 @@ void J2DPane::makeMatrix(f32 x, f32 y) {
if (mRotation != 0.0f) {
MTXTrans(stack1, -mBasePosition.x, -mBasePosition.y, 0.0f);
f32 rot = mRotationAxis == ROTATE_Z ? -mRotation : mRotation;
MTXRotRad(stack2, mRotationAxis, rot * 0.017453292f);
MTXRotDeg(stack2, mRotationAxis, rot);
MTXTrans(stack3, mBasePosition.x + x, mBasePosition.y + y, 0.0f);
MTXConcat(stack2, stack1, mMtx);
MTXConcat(stack3, mMtx, mMtx);
+465 -22
View File
@@ -368,15 +368,15 @@ void dKyr_rain_init() {
g_env_light.mpRainPacket->mCenterDelta.x = 0.0f;
g_env_light.mpRainPacket->mCenterDelta.y = 0.0f;
g_env_light.mpRainPacket->mCenterDelta.z = 0.0f;
for (u32 i = 0; i < ARRAY_SIZE(g_env_light.mpRainPacket->mRainEff); i++)
g_env_light.mpRainPacket->mRainEff[i].mStatus = 0;
for (u32 i = 0; i < ARRAY_SIZE(g_env_light.mpRainPacket->mEff); i++)
g_env_light.mpRainPacket->mEff[i].mStatus = 0;
g_env_light.mpRainPacket->mRainCount = 0;
}
/* 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;
pPkt->mRainEff[idx].field_0x30 = pCamera->mLookat.mCenter.y + -800.0f;
pPkt->mEff[idx].field_0x30 = pCamera->mLookat.mCenter.y + -800.0f;
}
/* 8008D0DC-8008D53C .text overhead_bg_chk__Fv */
@@ -788,7 +788,7 @@ void dKyr_poison_light_colision() {
f32 halfHeight = 70.0f;
for (s32 i = 0; i < g_env_light.mPoisonCount; i++) {
cXyz pos = pPkt->field_0xbb90 + pPkt->mEff[i].mPos;
cXyz pos = pPkt->mBasePos + pPkt->mEff[i].mPos;
pos.y -= halfHeight;
if (light_at_hit_check(&pos) && pPkt->mEff[i].mStatus == 1) {
pPkt->mEff[i].mStatus = 2;
@@ -870,20 +870,326 @@ void snap_sunmoon_proc(cXyz* pPos, int type) {
}
/* 8009428C-8009514C .text dKyr_drawSun__FPA4_fP4cXyzR8GXColorPPUc */
void dKyr_drawSun(Mtx, cXyz*, GXColor&, u8**) {
void dKyr_drawSun(Mtx drawMtx, cXyz* pPos, GXColor& reg0, u8** pImg) {
/* Nonmatching */
dKankyo_sun_Packet* pSunPkt;
dKankyo_sunlenz_Packet* pSunlenzPkt;
camera_class* pCamera;
cXyz pos[4];
cXyz sunPos;
cXyz moonPos2;
cXyz moonPos;
cXyz vp;
cXyz lp;
bool bDrawSun;
bool bDrawMoon;
Mtx camMtx;
Mtx rotMtx;
GXColor reg1;
GXTexObj texObj;
pSunPkt = dKy_getEnvlight().mpSunPacket;
pSunlenzPkt = dKy_getEnvlight().mpSunlenzPacket;
pCamera = dComIfGp_getCamera(0);
bDrawMoon = false;
bDrawSun = false;
if (pSunPkt->mSunAlpha > 0.0f)
bDrawSun = true;
if (pSunPkt->mMoonAlpha > 0.0f)
bDrawMoon = true;
if (bDrawSun | bDrawMoon) {
sunPos = *pPos;
u32 stType = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo());
if (dKy_getEnvlight().mBaseLightInfluence.mColor.r == 0 && stType != 2) {
if (dKy_getEnvlight().mCurTime > 285.0f || dKy_getEnvlight().mCurTime < 105.0f)
bDrawMoon = false;
moonPos2 = *pPos;
} else {
moonPos.x = -(pPos->x - pCamera->mLookat.mEye.x);
moonPos.y = -(pPos->y - pCamera->mLookat.mEye.y);
moonPos.z = -(pPos->z - pCamera->mLookat.mEye.z);
moonPos2.x = moonPos.x + pCamera->mLookat.mEye.x;
moonPos2.y = moonPos.y + pCamera->mLookat.mEye.y;
moonPos2.z = moonPos.z + pCamera->mLookat.mEye.z;
}
int dayofweek = dKy_get_dayofweek();
if (dComIfGs_getTime() < 180.0f) {
if (dayofweek != 0)
dayofweek--;
else
dayofweek = 6;
}
s32 texidx;
f32 flipX;
switch (dayofweek) {
case 0: texidx = 0; flipX = 1.0f; break;
case 1: texidx = 1; flipX = 1.0f; break;
case 2: texidx = 2; flipX = 1.0f; break;
case 3: texidx = 3; flipX = 1.0f; break;
case 4: texidx = 3; flipX = -1.0f; break;
case 5: texidx = 2; flipX = -1.0f; break;
case 6: texidx = 1; flipX = -1.0f; break;
}
reg0.r = dKy_getEnvlight().mFogColor.r;
reg0.g = dKy_getEnvlight().mFogColor.g;
reg0.b = dKy_getEnvlight().mFogColor.b;
reg0.a = 0xFF;
reg1.r = 0x00;
reg1.g = 0x00;
reg1.b = 0x00;
reg1.a = 0xFF;
if (dComIfGd_getView() != NULL) {
MTXInverse(dComIfGd_getViewRotMtx(), camMtx);
} else {
if (pSunPkt->field_0x3c < 5)
pSunPkt->field_0x3c += 2;
pSunPkt->field_0x3d = true;
return;
}
dKyr_set_btitex(&texObj, (ResTIMG*)pImg[texidx]);
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, 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);
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE);
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);
if (bDrawMoon == true) {
cXyz camfwd;
f32 dayscale[7] = { 1.0f, 0.83f, 0.6f, 0.6f, 0.6f, 0.6f, 0.83f, };
snap_sunmoon_proc(&moonPos2, texidx);
dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &pCamera->mLookat.mCenter, &camfwd);
f32 cam_distXZ = sqrtf(camfwd.x*camfwd.x + camfwd.z*camfwd.z);
f32 cam_theta = atan2f(camfwd.x, camfwd.z);
f32 cam_phi = atan2f(camfwd.y, cam_distXZ);
f32 moon_distXZ = sqrtf(moonPos.x*moonPos.x + moonPos.z*moonPos.z);
f32 moon_theta = atan2f(moonPos.x, moonPos.z);
f32 moon_phi = atan2f(moonPos.y, moon_distXZ);
f32 angle = 45.0f + (((moon_theta - cam_theta) / -8.0f) * moon_phi) * 360.0f;
MTXRotDeg(rotMtx, 'Z', angle);
MTXConcat(camMtx, rotMtx, camMtx);
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
reg0.r = 0xF3;
reg0.g = 0xFF;
reg0.b = 0x94;
f32 size = 700.0f;
reg0.a = pSunPkt->mMoonAlpha * 255.0f;
GXSetTevColor(GX_TEVREG0, reg0);
for (s32 j = 0; j < 2; j++) {
if (j == 1) {
GXInitTexObj(&texObj, pSunlenzPkt->mpTexSnow01, 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);
size *= 1.7f;
reg0.a = pSunPkt->mMoonAlpha * 76.0f;
reg0.r = 0xFF;
reg0.g = 0xFF;
reg0.b = 0xCF;
reg1.r = 0xC5;
reg1.g = 0x69;
reg1.b = 0x23;
MTXRotDeg(rotMtx, 'Z', 50.0f * flipX);
MTXConcat(camMtx, rotMtx, camMtx);
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
}
GXSetTevColor(GX_TEVREG0, reg0);
GXSetTevColor(GX_TEVREG1, reg1);
vp.x = -size * flipX;
vp.y = size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[0].x = moonPos2.x + lp.x;
pos[0].y = moonPos2.y + lp.y;
pos[0].z = moonPos2.z + lp.z;
vp.x = size * flipX;
vp.y = size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[1].x = moonPos2.x + lp.x;
pos[1].y = moonPos2.y + lp.y;
pos[1].z = moonPos2.z + lp.z;
if (texidx == 0) {
vp.x = size * flipX;
vp.y = -size;
} else {
vp.x = size * flipX * dayscale[dayofweek];
vp.y = -size * dayscale[dayofweek];
}
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[2].x = moonPos2.x + lp.x;
pos[2].y = moonPos2.y + lp.y;
pos[2].z = moonPos2.z + lp.z;
vp.x = -size * flipX;
vp.y = -size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[3].x = moonPos2.x + lp.x;
pos[3].y = moonPos2.y + lp.y;
pos[3].z = moonPos2.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 (bDrawSun == true) {
cXyz camfwd;
snap_sunmoon_proc(&sunPos, 9);
f32 sun_distXZ = sqrtf(sunPos.x*sunPos.x + sunPos.z*sunPos.z);
f32 sun_theta = atan2f(sunPos.x, sunPos.z);
f32 sun_phi = atan2f(sunPos.y, sun_distXZ);
dKyr_get_vectle_calc(&pCamera->mLookat.mEye, &pCamera->mLookat.mCenter, &camfwd);
f32 cam_distXZ = sqrtf(camfwd.x*camfwd.x + camfwd.z*camfwd.z);
f32 cam_theta = atan2f(camfwd.x, camfwd.z);
f32 cam_phi = atan2f(camfwd.y, cam_distXZ);
MTXRotDeg(rotMtx, 'Z', -50.0f + (360.0f * ((sun_theta - cam_theta) / -8.0f)));
MTXConcat(camMtx, rotMtx, camMtx);
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
reg0.r = 0xFF;
reg0.g = 0xFF;
reg0.b = 0xF1;
reg1.r = 0xF1;
reg1.g = 0x91;
reg1.b = 0x49;
f32 dist = 1.0f - pSunlenzPkt->mDistFalloff;
f32 size = 575.0f;
if (pSunPkt->mVisibility > 0.0f)
size += 500.0f * (dist * dist) * pSunPkt->mVisibility;
for (s32 j = 0; j < 2; j++) {
if (j == 0) {
dKyr_set_btitex(&texObj, (ResTIMG*)pImg[4]);
reg0.a = pSunPkt->mSunAlpha * 255.0f;
} else {
GXInitTexObj(&texObj, pSunlenzPkt->mpTexSnow01, 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);
size *= 1.6f;
reg0.a = pSunPkt->mSunAlpha * 76.0f;
}
GXSetTevColor(GX_TEVREG0, reg0);
GXSetTevColor(GX_TEVREG1, reg1);
vp.x = -size * flipX;
vp.y = size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[0].x = sunPos.x + lp.x;
pos[0].y = sunPos.y + lp.y;
pos[0].z = sunPos.z + lp.z;
vp.x = size * flipX;
vp.y = size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[1].x = sunPos.x + lp.x;
pos[1].y = sunPos.y + lp.y;
pos[1].z = sunPos.z + lp.z;
vp.x = size * flipX;
vp.y = -size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[2].x = sunPos.x + lp.x;
pos[2].y = sunPos.y + lp.y;
pos[2].z = sunPos.z + lp.z;
vp.x = -size * flipX;
vp.y = -size;
vp.z = 0.0f;
MTXMultVec(camMtx, &vp, &lp);
pos[3].x = sunPos.x + lp.x;
pos[3].y = sunPos.y + lp.y;
pos[3].z = sunPos.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
J3DShape::resetVcdVatCache();
#endif
}
}
/* 8009514C-80095E8C .text dKyr_drawLenzflare__FPA4_fP4cXyzR8GXColorPPUc */
void dKyr_drawLenzflare(Mtx, cXyz*, GXColor&, u8**) {
void dKyr_drawLenzflare(Mtx drawMtx, cXyz* pPos, GXColor& color, u8** pImg) {
/* Nonmatching */
}
/* 80095E8C-8009682C .text dKyr_drawRain__FPA4_fPPUc */
void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
dKankyo_rain_Packet * pPkt = g_env_light.mpRainPacket;
camera_class *pCamera = dComIfGp_getCamera(0);
dKankyo_rain_Packet* pPkt = g_env_light.mpRainPacket;
camera_class* pCamera = dComIfGp_getCamera(0);
Mtx camMtx;
cXyz pos[4];
@@ -949,22 +1255,22 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
MTXRotRad(rotMtx, 'Z', rot * 0.01745329f);
MTXRotDeg(rotMtx, 'Z', rot);
MTXConcat(camMtx, rotMtx, drawMtx);
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
for (s32 i = 0; i < pPkt->mRainCount; i++) {
f32 alpha = pPkt->mRainEff[i].mAlpha;
f32 alpha = pPkt->mEff[i].mAlpha;
if (alpha <= 0.0f)
continue;
reg0.a = alpha * 14.0f;
GXSetTevColor(GX_TEVREG0, reg0);
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->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;
f32 dist = p.abs(pCamera->mLookat.mEye);
dist = dist / 1500.0f + 0.1f;
@@ -1042,7 +1348,6 @@ void dKyr_drawRain(Mtx drawMtx, u8** pImg) {
/* 8009682C-80096D18 .text dKyr_drawSibuki__FPA4_fPPUc */
void dKyr_drawSibuki(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
camera_class *pCamera = dComIfGp_getCamera(0);
dKankyo_rain_Packet * pPkt = g_env_light.mpRainPacket;
@@ -1171,42 +1476,180 @@ void dKyr_drawSibuki(Mtx drawMtx, u8** pImg) {
}
/* 80096D18-800973CC .text drawPoison__FPA4_fPPUc */
void drawPoison(Mtx, u8**) {
void drawPoison(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
dKankyo_poison_Packet* pPkt;
GXTexObj texObj;
Mtx camMtx;
Mtx rotMtx;
cXyz pos[4];
cXyz windvec;
cXyz vp;
cXyz lp;
cXyz p;
cXyz dummy;
cXyz tilt;
GXColor reg0, reg1;
pPkt = dKy_getEnvlight().mpPoisonPacket;
static f32 rot = 0.0f;
j3dSys.reinitGX();
if (dComIfGd_getView() != NULL) {
MTXInverse(dComIfGd_getViewRotMtx(), camMtx);
} else {
return;
}
reg0.r = 0x2D;
reg0.g = 0x88;
reg0.b = 0xAA;
reg1.r = 0x6D;
reg1.g = 0x3C;
reg1.b = 0xCD;
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, 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);
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_TRUE, 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.3f;
if (rot < 0.0f)
rot = 719.0f;
GXSetCurrentMtx(GX_PNMTX0);
s32 wave = 0;
for (s32 i = 0; i < dKy_getEnvlight().mPoisonCount; i++, wave += 4000) {
f32 size = pPkt->mEff[i].mSize;
if (pPkt->mEff[i].mAlpha <= 0.0f)
continue;
GXLoadTexObj(&texObj, GX_TEXMAP0);
f32 cosR = fabsf(cM_scos(dKy_getEnvlight().mpPoisonPacket->mCount * 500.0f + wave));
cosR *= cosR;
reg0.r = 95.0f + -50.0f * cosR;
reg0.g = 186.0f + -50.0f * cosR;
reg0.b = 226.0f + -56.0f * cosR;
reg1.r = 115.0f + -6.0f * cosR;
reg1.g = 206.0f + -146.0f * cosR;
reg1.b = 255.0f + -50.0f * cosR;
reg1.a = pPkt->mEff[i].mAlpha * 255.0f;
GXSetTevColor(GX_TEVREG0, reg0);
GXSetTevColor(GX_TEVREG1, reg1);
p.x = pPkt->mBasePos.x + pPkt->mEff[i].mPos.x;
p.y = pPkt->mBasePos.y + pPkt->mEff[i].mPos.y;
p.z = pPkt->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
}
/* 800973CC-80097AD0 .text dKyr_drawHousi__FPA4_fPPUc */
void dKyr_drawHousi(Mtx, u8**) {
void dKyr_drawHousi(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
}
/* 80097AD0-800987B8 .text dKyr_drawKazanbai__FPA4_fPPUc */
void dKyr_drawKazanbai(Mtx, u8**) {
void dKyr_drawKazanbai(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
}
/* 800987B8-80098FF0 .text dKyr_drawSnow__FPA4_fPPUc */
void dKyr_drawSnow(Mtx, u8**) {
void dKyr_drawSnow(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
}
/* 80098FF0-80099D38 .text dKyr_drawStar__FPA4_fPPUc */
void dKyr_drawStar(Mtx, u8**) {
void dKyr_drawStar(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
}
/* 80099D38-8009A5D4 .text drawWave__FPA4_fPPUc */
void drawWave(Mtx, u8**) {
void drawWave(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
}
/* 8009A5D4-8009AB88 .text drawCloudShadow__FPA4_fPPUc */
void drawCloudShadow(Mtx, u8**) {
void drawCloudShadow(Mtx drawMtx, u8** pImg) {
/* Nonmatching */
}
/* 8009AB88-8009B9C4 .text drawVrkumo__FPA4_fR8GXColorPPUc */
void drawVrkumo(Mtx, GXColor&, u8**) {
void drawVrkumo(Mtx drawMtx, GXColor& clr, u8** pImg) {
/* Nonmatching */
}