mirror of
https://github.com/zeldaret/tp
synced 2026-05-23 15:01:53 -04:00
9e3d968435
* henna minor cleanup * rename light to kankyo * more cleanup * pos * more cleanup * fix build * final fix
6418 lines
246 KiB
C++
6418 lines
246 KiB
C++
#include "d/dolzel.h" // IWYU pragma: keep
|
|
|
|
#include "JSystem/JUtility/JUTTexture.h"
|
|
#include "SSystem/SComponent/c_counter.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_demo.h"
|
|
#include "d/d_kankyo_rain.h"
|
|
#include "f_op/f_op_camera_mng.h"
|
|
#include "f_op/f_op_kankyo_mng.h"
|
|
#include "m_Do/m_Do_graphic.h"
|
|
#include "m_Do/m_Do_lib.h"
|
|
|
|
/* 8005B660-8005B708 055FA0 00A8+00 3/3 0/0 0/0 .text vectle_calc__FP10DOUBLE_POSP4cXyz
|
|
*/
|
|
static void vectle_calc(DOUBLE_POS* i_pos, cXyz* o_out) {
|
|
double s = sqrt(i_pos->x * i_pos->x + i_pos->y * i_pos->y + i_pos->z * i_pos->z);
|
|
|
|
if (s != 0.0) {
|
|
o_out->x = i_pos->x / s;
|
|
o_out->y = i_pos->y / s;
|
|
o_out->z = i_pos->z / s;
|
|
} else {
|
|
o_out->x = 0.0;
|
|
o_out->y = 0.0;
|
|
o_out->z = 0.0;
|
|
}
|
|
}
|
|
|
|
/* 8005B708-8005B760 056048 0058+00 7/7 0/0 0/0 .text get_vectle_calc__FP4cXyzP4cXyzP4cXyz */
|
|
static void get_vectle_calc(cXyz* i_vecA, cXyz* i_vecB, cXyz* o_out) {
|
|
DOUBLE_POS pos;
|
|
pos.x = i_vecB->x - i_vecA->x;
|
|
pos.y = i_vecB->y - i_vecA->y;
|
|
pos.z = i_vecB->z - i_vecA->z;
|
|
|
|
vectle_calc(&pos, o_out);
|
|
}
|
|
|
|
/* 8005B760-8005B780 0560A0 0020+00 8/8 7/7 11/11 .text dKyr_get_vectle_calc__FP4cXyzP4cXyzP4cXyz
|
|
*/
|
|
void dKyr_get_vectle_calc(cXyz* i_vecA, cXyz* i_vecB, cXyz* o_out) {
|
|
get_vectle_calc(i_vecA, i_vecB, o_out);
|
|
}
|
|
|
|
/* 8005B780-8005B830 0560C0 00B0+00 2/2 0/0 0/0 .text
|
|
* dKy_set_eyevect_calc__FP12camera_classP3Vecff */
|
|
static void dKy_set_eyevect_calc(camera_class* i_camera, Vec* o_out, f32 param_2, f32 param_3) {
|
|
cXyz calc;
|
|
get_vectle_calc(&i_camera->lookat.eye, &i_camera->lookat.center, &calc);
|
|
o_out->x = i_camera->lookat.eye.x + calc.x * param_2;
|
|
o_out->y = (i_camera->lookat.eye.y + calc.y * param_3) - 200.0f;
|
|
o_out->z = i_camera->lookat.eye.z + calc.z * param_2;
|
|
}
|
|
|
|
/* 8005B830-8005B92C 056170 00FC+00 6/6 0/0 0/0 .text
|
|
* dKy_set_eyevect_calc2__FP12camera_classP3Vecff */
|
|
static void dKy_set_eyevect_calc2(camera_class* i_camera, Vec* o_out, f32 param_2, f32 param_3) {
|
|
cXyz calc;
|
|
DOUBLE_POS pos;
|
|
|
|
pos.x = i_camera->lookat.center.x - i_camera->lookat.eye.x;
|
|
if (param_3 != 0.0f) {
|
|
pos.y = i_camera->lookat.center.y - i_camera->lookat.eye.y;
|
|
} else {
|
|
pos.y = 0.0f;
|
|
}
|
|
pos.z = i_camera->lookat.center.z - i_camera->lookat.eye.z;
|
|
|
|
vectle_calc(&pos, &calc);
|
|
|
|
o_out->x = i_camera->lookat.eye.x + calc.x * param_2;
|
|
o_out->y = i_camera->lookat.eye.y + calc.y * param_3;
|
|
o_out->z = i_camera->lookat.eye.z + calc.z * param_2;
|
|
|
|
if (param_3 == 0.0f) {
|
|
o_out->y = 0.0f;
|
|
}
|
|
}
|
|
|
|
/* 8005B92C-8005BA24 05626C 00F8+00 5/5 0/0 0/0 .text
|
|
* dKyr_set_btitex_common__FP9_GXTexObjP7ResTIMG11_GXTexMapID */
|
|
static void dKyr_set_btitex_common(GXTexObj* i_obj, ResTIMG* i_img, GXTexMapID i_mapID) {
|
|
GXInitTexObj(i_obj, (&i_img->format + i_img->imageOffset), i_img->width, i_img->height,
|
|
(GXTexFmt)i_img->format, (GXTexWrapMode)i_img->wrapS, (GXTexWrapMode)i_img->wrapT,
|
|
(GXBool)(i_img->mipmapCount > 1));
|
|
|
|
GXInitTexObjLOD(i_obj, (GXTexFilter)i_img->minFilter, (GXTexFilter)i_img->magFilter,
|
|
i_img->minLOD * 0.125f, i_img->maxLOD * 0.125f, i_img->LODBias * 0.01f,
|
|
(GXBool)i_img->biasClamp, (GXBool)i_img->doEdgeLOD,
|
|
(GXAnisotropy)i_img->maxAnisotropy);
|
|
|
|
GXLoadTexObj(i_obj, i_mapID);
|
|
}
|
|
|
|
/* 8005BA24-8005BA48 056364 0024+00 12/12 0/0 0/0 .text dKyr_set_btitex__FP9_GXTexObjP7ResTIMG */
|
|
static void dKyr_set_btitex(GXTexObj* i_obj, ResTIMG* i_img) {
|
|
dKyr_set_btitex_common(i_obj, i_img, GX_TEXMAP0);
|
|
}
|
|
|
|
/* 8005BA48-8005BED8 056388 0490+00 0/0 1/1 0/0 .text dKyr_lenzflare_move__Fv */
|
|
void dKyr_lenzflare_move() {
|
|
dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket;
|
|
dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunLenzPacket;
|
|
camera_class* camera = dComIfGp_getCamera(0);
|
|
|
|
cXyz eyeVect;
|
|
cXyz field_0x3c;
|
|
cXyz sunDirSmth;
|
|
cXyz camFwd;
|
|
|
|
if (sun_packet->mVisibility < 0.0001f) {
|
|
return;
|
|
}
|
|
|
|
dKy_set_eyevect_calc(camera, &eyeVect, 4000.0f, 4000.0f);
|
|
dKyr_get_vectle_calc(&eyeVect, sun_packet->mPos, &sunDirSmth);
|
|
lenz_packet->mPositions[0] = sun_packet->mPos[0];
|
|
lenz_packet->mPositions[1] = sun_packet->mPos[0];
|
|
|
|
cXyz vect;
|
|
cXyz proj;
|
|
cXyz center;
|
|
mDoLib_project(lenz_packet->mPositions, &proj);
|
|
|
|
center.x = 304.0f;
|
|
center.y = 224.0f;
|
|
center.z = 0.0f;
|
|
dKyr_get_vectle_calc(¢er, &proj, &vect);
|
|
|
|
lenz_packet->field_0x94 = cM_atan2s(vect.x, vect.y);
|
|
lenz_packet->field_0x94 *= 0.0054931640625f; // Maybe 45 / 8192
|
|
lenz_packet->field_0x94 += 180.0f;
|
|
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &camFwd);
|
|
|
|
for (int i = 2; i < 8; i++) {
|
|
if (i == 2) {
|
|
f32 size = 250.0f + 600.0f * sunDirSmth.abs(camFwd);
|
|
lenz_packet->mPositions[i].x = sun_packet->mPos[0].x - sunDirSmth.x * size * i;
|
|
lenz_packet->mPositions[i].y = sun_packet->mPos[0].y - sunDirSmth.y * size * i;
|
|
lenz_packet->mPositions[i].z = sun_packet->mPos[0].z - sunDirSmth.z * size * i;
|
|
} else {
|
|
f32 size = 250.0f + 110.0f * sunDirSmth.abs(camFwd);
|
|
lenz_packet->mPositions[i].x = sun_packet->mPos[0].x - (4100.0f * sunDirSmth.x + sunDirSmth.x * size * i);
|
|
lenz_packet->mPositions[i].y = sun_packet->mPos[0].y - (4100.0f * sunDirSmth.y + sunDirSmth.y * size * i);
|
|
lenz_packet->mPositions[i].z = sun_packet->mPos[0].z - (4100.0f * sunDirSmth.z + sunDirSmth.z * size * i);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8005BED8-8005BF08 056818 0030+00 1/1 0/0 0/0 .text dKyr_moon_arrival_check__Fv */
|
|
static BOOL dKyr_moon_arrival_check() {
|
|
BOOL rv = FALSE;
|
|
if (g_env_light.daytime > 285.0f || g_env_light.daytime < 67.5f) {
|
|
rv = TRUE;
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
/* 8005BF08-8005CC5C 056848 0D54+00 0/0 1/1 0/0 .text dKyr_sun_move__Fv */
|
|
void dKyr_sun_move() {
|
|
dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket;
|
|
dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunLenzPacket;
|
|
camera_class* camera_p2 = dComIfGp_getCamera(0);
|
|
camera_class* camera = dComIfGp_getCamera(0);
|
|
cXyz lightDir;
|
|
|
|
f32 pulse_pos;
|
|
f32 sun_parcent = 0.0f;
|
|
|
|
static f32 S_parcent_bak = 0.0f;
|
|
|
|
u8 numPointsVisible = 0;
|
|
u8 numCenterPointsVisible = 0;
|
|
s32 numPointsCulled = 0;
|
|
|
|
u32 stage_type = dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo());
|
|
|
|
if (g_env_light.base_light.mColor.r == 0 && stage_type != ST_ROOM) {
|
|
dKyr_get_vectle_calc(&camera_p2->lookat.eye, &g_env_light.base_light.mPosition,
|
|
&lightDir);
|
|
} else {
|
|
dKyr_get_vectle_calc(&camera_p2->lookat.eye, &g_env_light.sun_light_pos, &lightDir);
|
|
}
|
|
|
|
sun_packet->mPos[0].x = camera_p2->lookat.eye.x + 8000.0f * lightDir.x;
|
|
sun_packet->mPos[0].y = camera_p2->lookat.eye.y + 8000.0f * lightDir.y;
|
|
sun_packet->mPos[0].z = camera_p2->lookat.eye.z + 8000.0f * lightDir.z;
|
|
|
|
f32 horizon_y = (sun_packet->mPos[0].y - camera_p2->lookat.eye.y) / 8000.0f;
|
|
if (horizon_y < 0.0f) {
|
|
horizon_y = 0.0f;
|
|
}
|
|
|
|
if (horizon_y >= 1.0f) {
|
|
horizon_y = 1.0f;
|
|
}
|
|
|
|
horizon_y = 1.0f - horizon_y;
|
|
horizon_y *= horizon_y;
|
|
pulse_pos = 1.0f - horizon_y;
|
|
|
|
if (dComIfGp_getStage()->getStagInfo() != NULL) {
|
|
dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo());
|
|
}
|
|
|
|
if (sun_packet->field_0x28) {
|
|
sun_packet->field_0x28--;
|
|
}
|
|
|
|
sun_packet->field_0x29 = 0;
|
|
|
|
if (g_env_light.daytime > 77.5f && g_env_light.daytime < 285.0f && dKy_rain_check() < 20 &&
|
|
strcmp(dComIfGp_getStartStageName(), "F_SP200") != 0 &&
|
|
strcmp(dComIfGp_getStartStageName(), "D_MN09B") != 0)
|
|
{
|
|
f32 border_y = 0.0f;
|
|
cLib_addCalc(&sun_packet->mSunAlpha, 1.0f, 0.05f, 0.1f, 0.00001f);
|
|
|
|
if (camera != NULL) {
|
|
border_y = camera->mCamera.TrimHeight();
|
|
}
|
|
|
|
cXyz proj;
|
|
mDoLib_project(sun_packet->mPos, &proj);
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
cXyz chkpnt = proj;
|
|
|
|
static f32 const sun_chkpnt[5][2] = {
|
|
{0.0f, 0.0f},
|
|
{-10.0f, -20.0f},
|
|
{10.0f, 20.0f},
|
|
{-20.0f, 10.0f},
|
|
{20.0f, -10.0f},
|
|
};
|
|
chkpnt.x -= sun_chkpnt[i][0];
|
|
chkpnt.y -= sun_chkpnt[i][1];
|
|
|
|
if (chkpnt.x > 0.0f && chkpnt.x < 608.0f && chkpnt.y > border_y && chkpnt.y < 458.0f - border_y) {
|
|
if (sun_packet->field_0x44[i] >= 0xFFFFFF) {
|
|
numPointsVisible++;
|
|
if (i == 0) {
|
|
numCenterPointsVisible++;
|
|
}
|
|
}
|
|
dComIfGd_peekZ(chkpnt.x, chkpnt.y, sun_packet->field_0x44 + i);
|
|
} else {
|
|
sun_packet->field_0x44[i] = 0;
|
|
numPointsCulled++;
|
|
}
|
|
}
|
|
|
|
if (numPointsCulled != 0 && numPointsVisible != 0 && numCenterPointsVisible != 0) {
|
|
numCenterPointsVisible = 1;
|
|
numPointsVisible = 5;
|
|
}
|
|
|
|
if (numPointsVisible != 0) {
|
|
if (sun_packet->field_0x28 < 5) {
|
|
sun_packet->field_0x28 += 2;
|
|
}
|
|
sun_packet->field_0x29 = 1;
|
|
}
|
|
|
|
lenz_packet->field_0x84 = lenz_packet->field_0x8c;
|
|
lenz_packet->field_0x88 = lenz_packet->field_0x90;
|
|
lenz_packet->field_0x8c = 1000000000.0f; // This is not G_CM3D_F_INF
|
|
lenz_packet->field_0x90 = 0.0f;
|
|
|
|
cXyz center;
|
|
center.x = 304.0f;
|
|
center.y = 224.0f;
|
|
center.z = 0.0f;
|
|
|
|
lenz_packet->mDistFalloff = center.abs(proj);
|
|
lenz_packet->mDistFalloff /= 450.0f;
|
|
if (lenz_packet->mDistFalloff > 1.0f) {
|
|
lenz_packet->mDistFalloff = 1.0f;
|
|
}
|
|
lenz_packet->mDistFalloff = 1.0f - lenz_packet->mDistFalloff;
|
|
sun_parcent = lenz_packet->mDistFalloff * lenz_packet->mDistFalloff;
|
|
lenz_packet->mDistFalloff = 1.0f - sun_parcent;
|
|
} else {
|
|
cLib_addCalc(&sun_packet->mSunAlpha, 0.0f, 0.1f, 0.05f, 0.001f);
|
|
numPointsVisible = 0;
|
|
sun_packet->field_0x28 = 0;
|
|
sun_packet->field_0x29 = 0;
|
|
}
|
|
|
|
if (g_env_light.mColpatWeather != 0 || g_env_light.mSnowCount > 10) {
|
|
numCenterPointsVisible = 0;
|
|
numPointsVisible = 0;
|
|
}
|
|
|
|
if (stage_type == ST_ROOM) {
|
|
numCenterPointsVisible = 0;
|
|
numPointsVisible = 0;
|
|
}
|
|
|
|
if (numCenterPointsVisible != 0) {
|
|
if (numPointsVisible == 4) {
|
|
cLib_addCalc(&sun_packet->mVisibility, 1.0f, 0.5f, 0.5f, 0.01f);
|
|
} else {
|
|
cLib_addCalc(&sun_packet->mVisibility, 1.0f, 0.2f, 0.3f, 0.001f);
|
|
}
|
|
} else if (numPointsVisible < 1) {
|
|
cLib_addCalc(&sun_packet->mVisibility, 0.0f, 0.5f, 0.5f, 0.001f);
|
|
} else {
|
|
cLib_addCalc(&sun_packet->mVisibility, 0.0f, 0.2f, 0.3f, 0.001f);
|
|
}
|
|
|
|
if (sun_packet->mVisibility <= 0.0f) {
|
|
g_env_light.mpSunLenzPacket->mDrawLenzInSky = TRUE;
|
|
} else {
|
|
g_env_light.mpSunLenzPacket->mDrawLenzInSky = FALSE;
|
|
}
|
|
|
|
if (lightDir.y > 0.0f && !g_env_light.mpSunLenzPacket->mDrawLenzInSky) {
|
|
if (dStage_stagInfo_GetArg0(dComIfGp_getStage()->getStagInfo()) != 0) {
|
|
f32 var_f1_3;
|
|
if (S_parcent_bak < sun_parcent) {
|
|
var_f1_3 = sun_parcent - S_parcent_bak;
|
|
} else {
|
|
var_f1_3 = S_parcent_bak - sun_parcent;
|
|
}
|
|
|
|
if (var_f1_3 < 0.3f) {
|
|
dKy_set_actcol_ratio(1.0f - sun_parcent * sun_packet->mVisibility);
|
|
dKy_set_bgcol_ratio(1.0f - sun_parcent * sun_packet->mVisibility);
|
|
dKy_set_fogcol_ratio(1.0f - pulse_pos * (sun_parcent * sun_packet->mVisibility));
|
|
dKy_set_vrboxcol_ratio(1.0f - 0.8f * (pulse_pos * (sun_parcent * sun_packet->mVisibility)));
|
|
}
|
|
S_parcent_bak = sun_parcent;
|
|
}
|
|
}
|
|
|
|
if (g_env_light.daytime < 255.0f && g_env_light.mColpatWeather == 0) {
|
|
cLib_addCalc(&sun_packet->field_0x6c, 1.0f, 0.1f, 0.01f, 0.0001f);
|
|
} else {
|
|
cLib_addCalc(&sun_packet->field_0x6c, 0.0f, 0.5f, 0.1f, 0.001f);
|
|
}
|
|
|
|
static GXColor sun_color[3] = {
|
|
{255, 255, 253, 255},
|
|
{255, 255, 255, 255},
|
|
{255, 255, 253, 255},
|
|
};
|
|
static GXColor sun_color2[3] = {
|
|
{255, 110, 43, 255},
|
|
{156, 121, 92, 255},
|
|
{255, 78, 0, 255},
|
|
};
|
|
|
|
if (g_env_light.daytime < 180.0f) {
|
|
f32 parcent;
|
|
if (g_env_light.daytime < 90.0f) {
|
|
parcent = 0.0f;
|
|
} else if (g_env_light.daytime < 105.0f) {
|
|
parcent = dKy_get_parcent(105.0f, 90.0f, g_env_light.daytime);
|
|
} else {
|
|
parcent = 1.0f;
|
|
}
|
|
|
|
sun_packet->mColor.r =
|
|
(f32)sun_color[0].r + parcent * ((f32)sun_color[1].r - (f32)sun_color[0].r);
|
|
sun_packet->mColor.g =
|
|
(f32)sun_color[0].g + parcent * ((f32)sun_color[1].g - (f32)sun_color[0].g);
|
|
sun_packet->mColor.b =
|
|
(f32)sun_color[0].b + parcent * ((f32)sun_color[1].b - (f32)sun_color[0].b);
|
|
|
|
sun_packet->field_0x74.r =
|
|
(f32)sun_color2[0].r + parcent * ((f32)sun_color2[1].r - (f32)sun_color2[0].r);
|
|
sun_packet->field_0x74.g =
|
|
(f32)sun_color2[0].g + parcent * ((f32)sun_color2[1].g - (f32)sun_color2[0].g);
|
|
sun_packet->field_0x74.b =
|
|
(f32)sun_color2[0].b + parcent * ((f32)sun_color2[1].b - (f32)sun_color2[0].b);
|
|
} else {
|
|
f32 parcent;
|
|
if (g_env_light.daytime < 247.5f) {
|
|
parcent = 1.0f;
|
|
} else if (g_env_light.daytime < 270.0f) {
|
|
parcent = 1.0f - dKy_get_parcent(270.0f, 247.5f, g_env_light.daytime);
|
|
} else {
|
|
parcent = 0.0f;
|
|
}
|
|
|
|
sun_packet->mColor.r =
|
|
(f32)sun_color[2].r + parcent * ((f32)sun_color[1].r - (f32)sun_color[2].r);
|
|
sun_packet->mColor.g =
|
|
(f32)sun_color[2].g + parcent * ((f32)sun_color[1].g - (f32)sun_color[2].g);
|
|
sun_packet->mColor.b =
|
|
(f32)sun_color[2].b + parcent * ((f32)sun_color[1].b - (f32)sun_color[2].b);
|
|
|
|
sun_packet->field_0x74.r =
|
|
(f32)sun_color2[2].r + parcent * ((f32)sun_color2[1].r - (f32)sun_color2[2].r);
|
|
sun_packet->field_0x74.g =
|
|
(f32)sun_color2[2].g + parcent * ((f32)sun_color2[1].g - (f32)sun_color2[2].g);
|
|
sun_packet->field_0x74.b =
|
|
(f32)sun_color2[2].b + parcent * ((f32)sun_color2[1].b - (f32)sun_color2[2].b);
|
|
}
|
|
|
|
if (dKyr_moon_arrival_check()) {
|
|
f32 alpha = (sun_packet->mPos[0].y - camera_p2->lookat.eye.y) / -8000.0f;
|
|
alpha *= alpha;
|
|
alpha *= 6.0f;
|
|
|
|
if (alpha > 1.0f) {
|
|
alpha = 1.0f;
|
|
}
|
|
|
|
cLib_addCalc(&sun_packet->mMoonAlpha, alpha, 0.2f, 0.01f, 0.001f);
|
|
} else {
|
|
cLib_addCalc(&sun_packet->mMoonAlpha, 0.0f, 0.2f, 0.01f, 0.001f);
|
|
}
|
|
|
|
if (g_env_light.camera_water_in_status == 0 && g_env_light.daytime > 255.0f &&
|
|
sun_packet->mSunAlpha >= 0.2f)
|
|
{
|
|
cXyz sp24;
|
|
dKyr_get_vectle_calc(&camera_p2->lookat.eye, &g_env_light.sun_light_pos, &lightDir);
|
|
sp24.x = camera_p2->lookat.eye.x + 30160.0f * lightDir.x;
|
|
sp24.y = camera_p2->lookat.eye.y + 30160.0f * lightDir.y;
|
|
sp24.z = camera_p2->lookat.eye.z + 30160.0f * lightDir.z;
|
|
sp24.y -= 21678.0f;
|
|
sun_packet->field_0x58 = dComIfGp_particle_set(sun_packet->field_0x58, 0x11C, &sp24, 0, 0);
|
|
}
|
|
}
|
|
|
|
/* 8005CC5C-8005CDA8 05759C 014C+00 0/0 1/1 0/0 .text dKyr_rain_init__Fv */
|
|
void dKyr_rain_init() {
|
|
camera_class* camera = g_dComIfG_gameInfo.play.mCameraInfo[0].mCamera;
|
|
g_env_light.mpRainPacket->mpTex = (u8*)dComIfG_getObjectRes("Always", 0x4a);
|
|
g_env_light.mpRainPacket->mpTex2 = (u8*)dComIfG_getObjectRes("Always", 0x57);
|
|
g_env_light.mpRainPacket->mCamEyePos = camera->lookat.eye;
|
|
g_env_light.mpRainPacket->mCamCenterPos = camera->lookat.center;
|
|
g_env_light.mpRainPacket->mCenterDeltaMul = 0.0f;
|
|
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->mFwdFade1 = 0.0f;
|
|
g_env_light.mpRainPacket->mFwdFade2 = 0.0f;
|
|
g_env_light.mpRainPacket->mStatus = 0.0f;
|
|
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 (int i = 0; i < 250; i++) {
|
|
g_env_light.mpRainPacket->mRainEff[i].mStatus = 0;
|
|
}
|
|
g_env_light.mpRainPacket->raincnt = 0;
|
|
}
|
|
|
|
/* 8005CDA8-8005CDD0 0576E8 0028+00 1/1 0/0 0/0 .text rain_bg_chk__FP19dKankyo_rain_Packeti */
|
|
static void rain_bg_chk(dKankyo_rain_Packet* i_packet, int i_idx) {
|
|
i_packet->mRainEff[i_idx].field_0x30 = dComIfGp_getCamera(0)->lookat.center.y + -800.0f;
|
|
}
|
|
|
|
/* 8005CDD0-8005CF78 057710 01A8+00 1/1 0/0 0/0 .text overhead_bg_chk__Fv */
|
|
static BOOL overhead_bg_chk() {
|
|
camera_class* camera = dComIfGp_getCamera(0);
|
|
BOOL chk = false;
|
|
|
|
dBgS_ObjGndChk_All gndchk;
|
|
dBgS_RoofChk roofchk;
|
|
|
|
cXyz chkPos = camera->lookat.eye;
|
|
chkPos.y += 50.0f;
|
|
|
|
roofchk.SetPos(chkPos);
|
|
if (dComIfG_Bgsp().RoofChk(&roofchk) != 1.0e9f) {
|
|
chk = true;
|
|
// Outside East Castle Town
|
|
if (!strcmp(dComIfGp_getStartStageName(), "F_SP122") &&
|
|
dStage_roomControl_c::getStayNo() == 17)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
chkPos.y += 10000.0f;
|
|
gndchk.SetPos(&chkPos);
|
|
if (dComIfG_Bgsp().GroundCross(&gndchk) > camera->lookat.eye.y + 50.0f) {
|
|
chk = true;
|
|
}
|
|
|
|
return chk;
|
|
}
|
|
|
|
/* 8005CF78-8005D18C 0578B8 0214+00 1/1 0/0 0/0 .text forward_overhead_bg_chk__FP4cXyzf
|
|
*/
|
|
static BOOL forward_overhead_bg_chk(cXyz* ppos, f32 dist) {
|
|
camera_class* camera = dComIfGp_getCamera(0);
|
|
BOOL chk = FALSE;
|
|
|
|
dBgS_ObjGndChk_All gndchk;
|
|
dBgS_RoofChk roofchk;
|
|
|
|
cXyz chk_pos;
|
|
cXyz vectle;
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &vectle);
|
|
chk_pos.x = camera->lookat.eye.x + vectle.x * dist;
|
|
chk_pos.y = camera->lookat.eye.y + vectle.y * dist;
|
|
chk_pos.z = camera->lookat.eye.z + vectle.z * dist;
|
|
chk_pos.y = 50.0f + camera->lookat.eye.y;
|
|
*ppos = chk_pos;
|
|
|
|
roofchk.SetPos(chk_pos);
|
|
if (G_CM3D_F_INF != dComIfG_Bgsp().RoofChk(&roofchk)) {
|
|
chk = TRUE;
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP122") == 0) {
|
|
if (dStage_roomControl_c::getStayNo() == 17) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
chk_pos.y += 10000.0f;
|
|
gndchk.SetPos(&chk_pos);
|
|
|
|
if (dComIfG_Bgsp().GroundCross(&gndchk) > 50.0f + camera->lookat.eye.y) {
|
|
chk = TRUE;
|
|
}
|
|
return chk;
|
|
}
|
|
|
|
/* 8005D18C-8005E8B0 057ACC 1724+00 0/0 1/1 0/0 .text dKyr_rain_move__Fv */
|
|
// NONMATCHING reg alloc, equivalent?
|
|
void dKyr_rain_move() {
|
|
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_getStage()->getStagInfo());
|
|
|
|
spA8.x = 0.0f;
|
|
spA8.y = -2.5f;
|
|
spA8.z = 0.0f;
|
|
|
|
if (rain_packet->raincnt <= g_env_light.raincnt) {
|
|
rain_packet->raincnt = g_env_light.raincnt;
|
|
}
|
|
|
|
if (rain_packet->raincnt != 0) {
|
|
dKyr_get_vectle_calc(&camera->lookat.center, &rain_packet->mCamCenterPos, &spB4);
|
|
|
|
var_f30 = rain_packet->mCamEyePos.abs(camera->lookat.eye);
|
|
|
|
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.x = camera->lookat.eye.x;
|
|
rain_packet->mCamEyePos.z = camera->lookat.eye.z;
|
|
|
|
var_f28 = rain_packet->mCamEyePos.abs(camera->lookat.eye);
|
|
var_f28 = var_f28 / 20.0f;
|
|
if (var_f28 > 1.0f) {
|
|
var_f28 = 1.0f;
|
|
}
|
|
|
|
spA8.y += -(var_f28 * 15.0f);
|
|
rain_packet->mCamEyePos = camera->lookat.eye;
|
|
|
|
var_f29 = rain_packet->mCamCenterPos.abs(camera->lookat.center);
|
|
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->lookat.center;
|
|
|
|
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;
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "R_SP30") == 0) {
|
|
if (dComIfGp_roomControl_getStayNo() == 0 || dComIfGp_roomControl_getStayNo() == 4) {
|
|
sp1C = 1;
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "R_SP107") == 0 &&
|
|
dComIfGp_roomControl_getStayNo() == 1)
|
|
{
|
|
sp1C = 2;
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
|
|
sp1C = 3;
|
|
}
|
|
|
|
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->raincnt - 1; i >= 0; i--) {
|
|
rain_packet->mRainEff[i].mBasePos.y = spFC.y;
|
|
|
|
switch (rain_packet->mRainEff[i].mStatus) {
|
|
case 0:
|
|
rain_packet->mRainEff[i].field_0x24 = -(cM_rndF(10.0f) + 35.5f);
|
|
rain_packet->mRainEff[i].mTimer = 0;
|
|
rain_packet->mRainEff[i].mBasePos.x = spFC.x;
|
|
rain_packet->mRainEff[i].mBasePos.y = spFC.y;
|
|
rain_packet->mRainEff[i].mBasePos.z = spFC.z;
|
|
rain_packet->mRainEff[i].mPosition.x = cM_rndFX(800.0f);
|
|
rain_packet->mRainEff[i].mPosition.y = cM_rndF(600.0f);
|
|
rain_packet->mRainEff[i].mPosition.z = cM_rndFX(800.0f);
|
|
rain_packet->mRainEff[i].mAlpha = 1.0f;
|
|
rain_packet->mRainEff[i].field_0x1c = cM_rndF(360.0f);
|
|
rain_packet->mRainEff[i].field_0x20 = cM_rndF(360.0f);
|
|
|
|
rain_bg_chk(rain_packet, i);
|
|
rain_packet->mRainEff[i].mStatus++;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
cLib_addCalc(&rain_packet->mRainEff[i].field_0x24, rain_packet->mRainEff[i].field_0x24 - cM_rndFX(0.1f), 0.5f, 0.1f, 0.01f);
|
|
|
|
rain_packet->mRainEff[i].mPosition.x +=
|
|
20.0f *
|
|
((spCC.x + (10.0f * (rain_packet->mCenterDelta.x * rain_packet->mCenterDeltaMul))) +
|
|
(spA8.x + (0.08f * (f32)(i & 7))));
|
|
|
|
rain_packet->mRainEff[i].mPosition.y +=
|
|
((f32)(i & 7) * -2.0f) +
|
|
(20.0f *
|
|
(spA8.y +
|
|
(spCC.y + ((rain_packet->mCenterDelta.y * rain_packet->mCenterDeltaMul) * 10.0f))));
|
|
|
|
rain_packet->mRainEff[i].mPosition.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->mRainEff[i].mBasePos.x + rain_packet->mRainEff[i].mPosition.x;
|
|
spC0.y = spFC.y;
|
|
spC0.z = rain_packet->mRainEff[i].mBasePos.z + rain_packet->mRainEff[i].mPosition.z;
|
|
|
|
f32 var_f1 = spC0.abs(spFC);
|
|
|
|
if (rain_packet->mRainEff[i].mTimer == 0) {
|
|
if (var_f1 > 800.0f) {
|
|
rain_packet->mRainEff[i].mTimer = 10;
|
|
rain_packet->mRainEff[i].field_0x24 = -(cM_rndF(10.0f) + 35.5f);
|
|
rain_packet->mRainEff[i].mBasePos = spFC;
|
|
|
|
if (spC0.abs(spFC) > 850.0f) {
|
|
rain_packet->mRainEff[i].mPosition.x = cM_rndFX(800.0f);
|
|
rain_packet->mRainEff[i].mPosition.y = cM_rndFX(800.0f);
|
|
rain_packet->mRainEff[i].mPosition.z = cM_rndFX(800.0f);
|
|
} else {
|
|
var_f31 = cM_rndFX(40.0f);
|
|
get_vectle_calc(&spC0, &spFC, &spB4);
|
|
|
|
rain_packet->mRainEff[i].mPosition.x = spB4.x * (var_f31 + 800.0f);
|
|
rain_packet->mRainEff[i].mPosition.y = spB4.y * (var_f31 + 800.0f);
|
|
rain_packet->mRainEff[i].mPosition.z = spB4.z * (var_f31 + 800.0f);
|
|
}
|
|
|
|
rain_packet->mRainEff[i].mStatus = 1;
|
|
rain_bg_chk(rain_packet, i);
|
|
}
|
|
|
|
spC0.y = rain_packet->mRainEff[i].mBasePos.y + rain_packet->mRainEff[i].mPosition.y;
|
|
if (spC0.y < rain_packet->mRainEff[i].field_0x30 + 20.0f) {
|
|
rain_packet->mRainEff[i].mBasePos = spFC;
|
|
rain_packet->mRainEff[i].mPosition.x = cM_rndFX(800.0f);
|
|
rain_packet->mRainEff[i].mPosition.y = 200.0f;
|
|
rain_packet->mRainEff[i].mPosition.z = cM_rndFX(800.0f);
|
|
rain_bg_chk(rain_packet, i);
|
|
rain_packet->mRainEff[i].mTimer = 10;
|
|
}
|
|
} else {
|
|
rain_packet->mRainEff[i].mTimer--;
|
|
}
|
|
}
|
|
|
|
spC0.x = rain_packet->mRainEff[i].mBasePos.x + rain_packet->mRainEff[i].mPosition.x;
|
|
spC0.y = rain_packet->mRainEff[i].mBasePos.y + rain_packet->mRainEff[i].mPosition.y;
|
|
spC0.z = rain_packet->mRainEff[i].mBasePos.z + rain_packet->mRainEff[i].mPosition.z;
|
|
|
|
if (i > g_env_light.raincnt - 1) {
|
|
if (i == rain_packet->raincnt - 1) {
|
|
rain_packet->raincnt--;
|
|
}
|
|
}
|
|
|
|
var_f31 = 1.0f;
|
|
if (sp34 || rain_packet->mOverheadFade < 1.0f) {
|
|
cXyz sp80;
|
|
f32 sp10 = 800.0f;
|
|
sp80 = spC0;
|
|
sp80.y = camera->lookat.eye.y;
|
|
|
|
if (camera->lookat.eye.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;
|
|
if (strcmp(dComIfGp_getStartStageName(), "R_SP30") == 0) {
|
|
if (dComIfGp_roomControl_getStayNo() == 0) {
|
|
if (spC0.x > -2680.0f && spC0.z < 2200.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
} else if (dComIfGp_roomControl_getStayNo() == 4 && spC0.z > 1600.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
} else if (sp1C == 2) {
|
|
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;
|
|
}
|
|
}
|
|
} else if (sp1C == 3) {
|
|
cXyz sp44;
|
|
sp44.x = -228.0f;
|
|
sp44.y = spC0.y;
|
|
sp44.z = 795.0f;
|
|
|
|
if (spC0.abs(sp44) < 1500.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
|
|
if (camera->lookat.eye.y < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
} else {
|
|
sp5C = spC0;
|
|
sp5C.y = 0.0f;
|
|
|
|
if (sp5C.abs() < sp20) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP113") == 0 &&
|
|
dComIfGp_roomControl_getStayNo() == 1)
|
|
{
|
|
if (spC0.z < 5100.0f || (spC0.x < -3250.0f && spC0.y < -50.0f) ||
|
|
(spC0.x < -2700.0f && spC0.z > 15750.0f))
|
|
{
|
|
var_f31 = 0.0f;
|
|
rain_packet->mStatus |= (u8)1;
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "D_MN09") == 0 &&
|
|
dComIfGp_roomControl_getStayNo() == 9)
|
|
{
|
|
if (spC0.x < -3680.0f && spC0.z > -11975.0f && spC0.z < -10530.0f) {
|
|
var_f31 = 0.0f;
|
|
rain_packet->mStatus |= (u8)1;
|
|
} else if (spC0.x > 3350.0f && spC0.z > -13027.0f && spC0.z < -11430.0f) {
|
|
var_f31 = 0.0f;
|
|
rain_packet->mStatus |= (u8)1;
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "R_SP107") == 0 &&
|
|
dComIfGp_roomControl_getStayNo() == 2 && spC0.z > 36900.0f)
|
|
{
|
|
var_f31 = 0.0f;
|
|
rain_packet->mStatus |= (u8)1;
|
|
}
|
|
|
|
rain_packet->mRainEff[i].mAlpha = var_f31 * (1.0f + cM_rndFX(0.5f));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8005E8B0-8005E8F8 0591F0 0048+00 1/1 0/0 0/0 .text d_krain_cut_turn_check__Fv */
|
|
static BOOL d_krain_cut_turn_check() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
BOOL ret = FALSE;
|
|
|
|
if (player != NULL && (player->getCutType() == daPy_py_c::CUT_TYPE_TURN_RIGHT ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_TURN_LEFT ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_LEFT ||
|
|
player->getCutType() == daPy_py_c::CUT_TYPE_LARGE_TURN_RIGHT)) {
|
|
ret = TRUE;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* 8005E8F8-8005FBDC 059238 12E4+00 0/0 1/1 0/0 .text dKyr_housi_move__Fv */
|
|
void dKyr_housi_move() {
|
|
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;
|
|
|
|
dBgS_CamGndChk_Wtr cam_gndchk;
|
|
f32 var_f30 = -100000000.0f;
|
|
bool var_r24 = 0;
|
|
|
|
cXyz sp54;
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN08") == 0) {
|
|
var_r24 = 1;
|
|
}
|
|
|
|
if (g_env_light.field_0xea9 == 2) {
|
|
sp54 = camera->lookat.eye;
|
|
sp54.y += 100000.0f;
|
|
|
|
cam_gndchk.SetPos(&sp54);
|
|
var_f30 = dComIfG_Bgsp().GroundCross(&cam_gndchk);
|
|
}
|
|
|
|
if (dKy_darkworld_check() == true || var_r24 == 1) {
|
|
sp78.x = 0.0f;
|
|
sp78.y = 2.8f;
|
|
sp78.z = 0.0f;
|
|
}
|
|
|
|
if (g_env_light.field_0xea9 == 1) {
|
|
sp78.x = 0.0f;
|
|
sp78.y = -0.55f;
|
|
sp78.z = 0.0f;
|
|
}
|
|
|
|
if (g_env_light.mHousiCount != 0 ||
|
|
(g_env_light.mHousiCount == 0 && housi_packet->field_0x5de8 <= 0.0f))
|
|
{
|
|
housi_packet->field_0x5dec = g_env_light.mHousiCount;
|
|
}
|
|
|
|
if (g_env_light.mHousiCount != 0) {
|
|
cLib_addCalc(&housi_packet->field_0x5de8, 1.0f, 0.2f, 0.05f, 0.01f);
|
|
} else {
|
|
cLib_addCalc(&housi_packet->field_0x5de8, 0.0f, 0.2f, 0.05f, 0.01f);
|
|
}
|
|
|
|
if (housi_packet->field_0x5dec == 0) {
|
|
return;
|
|
}
|
|
|
|
dKy_set_eyevect_calc2(camera, &sp84, 800.0f, 800.0f);
|
|
|
|
if (sp84.abs(housi_packet->field_0x10) > 500.0f) {
|
|
var_r27 = 1;
|
|
}
|
|
|
|
housi_packet->field_0x10 = sp84;
|
|
dKyw_get_wind_pow();
|
|
|
|
if (g_env_light.field_0xea9 == 1) {
|
|
var_f31 = 0.0f;
|
|
|
|
if (g_env_light.camera_water_in_status) {
|
|
dBgS_CamGndChk_Wtr sp90;
|
|
|
|
cXyz sp48;
|
|
camera_class* cam_p = dComIfGp_getCamera(0);
|
|
sp48 = cam_p->lookat.eye;
|
|
sp48.y += 100000.0f;
|
|
|
|
sp90.SetPos(&sp48);
|
|
f32 gnd_cross = dComIfG_Bgsp().GroundCross(&sp90);
|
|
if (gnd_cross > cam_p->lookat.eye.y) {
|
|
var_f31 = (gnd_cross - cam_p->lookat.eye.y) / 700.0f;
|
|
if (var_f31 < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
}
|
|
|
|
if (var_f31 > 1.0f) {
|
|
var_f31 = 1.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int i = housi_packet->field_0x5dec - 1; i >= 0; i--) {
|
|
f32 var_f26 = 0.4f * housi_packet->field_0x5de8;
|
|
effect = &housi_packet->mHousiEff[i];
|
|
|
|
switch (housi_packet->mHousiEff[i].mStatus) {
|
|
case 0:
|
|
if (g_env_light.field_0xea9 == 1) {
|
|
effect->field_0x34 = cM_rndF(0.5f) + 0.1f;
|
|
} else {
|
|
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->mPosition.x = cM_rndFX(1000.0f);
|
|
effect->mPosition.y = cM_rndFX(1000.0f);
|
|
effect->mPosition.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->mPosition.y < -100149.9f) {
|
|
effect->mPosition.y = (-99999.9f - effect->mBasePos.y) + 10.0f;
|
|
}
|
|
|
|
effect->field_0x38 = 0.0f;
|
|
effect->field_0x44 = 0.0f;
|
|
effect->mStatus++;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
f32 var_f24 = 2.5f;
|
|
|
|
if (effect->mStatus != 4) {
|
|
f32 var_f23 = effect->field_0x34;
|
|
if (effect->mStatus == 2) {
|
|
var_f23 *= 0.25f;
|
|
}
|
|
|
|
f32 temp_f0_5 = cM_fsin(effect->mScale.x);
|
|
if (g_env_light.field_0xea9 == 2) {
|
|
var_f24 = 5.0f;
|
|
}
|
|
|
|
if (effect->mStatus != 3) {
|
|
effect->mPosition.y += var_f23 * (sp78.y * var_f24);
|
|
effect->mPosition.x += var_f23 * (sp78.x * var_f24);
|
|
effect->mPosition.y -= var_f23 * 0.6f;
|
|
|
|
if (g_env_light.field_0xea9 == 2) {
|
|
if (g_env_light.fishing_hole_season == 3) {
|
|
effect->mPosition.y -= var_f23 * 3.0f;
|
|
} else {
|
|
effect->mPosition.y -= var_f23 * 1.5f;
|
|
}
|
|
}
|
|
|
|
effect->mPosition.z += var_f23 * (sp78.z * var_f24);
|
|
} else {
|
|
var_f23 *= 4.5f;
|
|
|
|
effect->mPosition.x += var_f23 * (sp78.x * var_f24);
|
|
effect->mPosition.y += (var_f23 * (sp78.y * var_f24)) * 0.75f;
|
|
effect->mPosition.y += var_f23 * 0.3f;
|
|
effect->mPosition.z += var_f23 * (sp78.z * var_f24);
|
|
}
|
|
|
|
effect->mPosition.x += temp_f0_5 * var_f23;
|
|
effect->mPosition.y += var_f23 * 0.5f * cM_fsin(effect->mScale.y);
|
|
effect->mPosition.z += cM_fsin(effect->mScale.z) * var_f23;
|
|
} else if (d_krain_cut_turn_check()) {
|
|
effect->mStatus = 3;
|
|
}
|
|
|
|
effect->mScale.x += 0.03f;
|
|
effect->mScale.y += 0.02f;
|
|
effect->mScale.z += 0.01f;
|
|
|
|
sp6C.x = effect->mBasePos.x + effect->mPosition.x;
|
|
sp6C.y = effect->mBasePos.y + effect->mPosition.y;
|
|
sp6C.z = effect->mBasePos.z + effect->mPosition.z;
|
|
|
|
if (g_env_light.field_0xea9 == 2) {
|
|
cXyz sp3C(sp6C);
|
|
|
|
if (sp6C.y <= var_f30) {
|
|
effect->mStatus = 2;
|
|
}
|
|
|
|
if (effect->mStatus == 2) {
|
|
effect->mPosition.y = var_f30 - effect->mBasePos.y;
|
|
} else if (effect->mStatus != 3 && effect->mStatus != 4) {
|
|
sp3C.y = player->current.pos.y;
|
|
|
|
if (sp3C.abs(player->current.pos) < 300.0f) {
|
|
if (sp3C.z > 5600.0f && player->current.pos.y < 130.0f) {
|
|
if (sp6C.y < player->current.pos.y + 2.0f) {
|
|
effect->mPosition.y =
|
|
(player->current.pos.y + 2.0f) - effect->mBasePos.y;
|
|
effect->mStatus = 4;
|
|
}
|
|
} else {
|
|
effect->mStatus = 3;
|
|
}
|
|
}
|
|
} else {
|
|
if (effect->mStatus == 4) {
|
|
effect->mPosition.y =
|
|
(player->current.pos.y + 2.0f) - effect->mBasePos.y;
|
|
}
|
|
|
|
if (sp3C.abs(player->current.pos) > 400.0f) {
|
|
effect->mStatus = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
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->mPosition.x += effect->mSpeed.x;
|
|
effect->mPosition.y += effect->mSpeed.y;
|
|
effect->mPosition.z += effect->mSpeed.z;
|
|
|
|
sp6C.x = effect->mBasePos.x + effect->mPosition.x;
|
|
sp6C.y = effect->mBasePos.y + effect->mPosition.y;
|
|
sp6C.z = effect->mBasePos.z + effect->mPosition.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->mPosition.x = cM_rndFX(1000.0f);
|
|
effect->mPosition.y = cM_rndFX(1000.0f);
|
|
effect->mPosition.z = cM_rndFX(1000.0f);
|
|
} else {
|
|
f32 temp_f23 = cM_rndFX(50.0f);
|
|
get_vectle_calc(&sp6C, &sp84, &sp60);
|
|
|
|
effect->mPosition.x = sp60.x * (temp_f23 + 1000.0f);
|
|
effect->mPosition.y = sp60.y * (temp_f23 + 1000.0f);
|
|
effect->mPosition.z = sp60.z * (temp_f23 + 1000.0f);
|
|
}
|
|
|
|
sp6C.x = effect->mBasePos.x + effect->mPosition.x;
|
|
sp6C.y = effect->mBasePos.y + effect->mPosition.y;
|
|
sp6C.z = effect->mBasePos.z + effect->mPosition.z;
|
|
|
|
if (sp6C.y <= var_f30) {
|
|
effect->mPosition.y += 1000.0f;
|
|
}
|
|
|
|
effect->mSpeed.x = 0.0f;
|
|
effect->mSpeed.y = 0.0f;
|
|
effect->mSpeed.z = 0.0f;
|
|
|
|
if (g_env_light.field_0xea9 == 2) {
|
|
effect->mPosition.y += cM_rndF(3200.0f);
|
|
if (sp6C.y > 3200.0f) {
|
|
effect->mPosition.y = 3200.0f - effect->mBasePos.y;
|
|
}
|
|
|
|
if (g_env_light.fishing_hole_season == 1) {
|
|
if (sp6C.x > 600.0f || sp6C.z > 1600.0f) {
|
|
effect->mStatus = 1;
|
|
} else {
|
|
effect->mStatus = 2;
|
|
}
|
|
} else if (sp6C.x > 1700.0f || sp6C.z > 2800.0f) {
|
|
effect->mStatus = 1;
|
|
} else {
|
|
effect->mStatus = 2;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
effect->field_0x3c--;
|
|
}
|
|
break;
|
|
}
|
|
|
|
sp6C.x = effect->mBasePos.x + effect->mPosition.x;
|
|
sp6C.y = effect->mBasePos.y + effect->mPosition.y;
|
|
sp6C.z = effect->mBasePos.z + effect->mPosition.z;
|
|
|
|
if (g_env_light.field_0xea9 != 2) {
|
|
effect->field_0x4c += 600;
|
|
if (effect->field_0x4c > 30000) {
|
|
var_f26 = 0.0f;
|
|
}
|
|
} else {
|
|
var_f26 = 1.0f;
|
|
}
|
|
|
|
cLib_addCalc(&effect->mAlpha, var_f26, 0.5f, 0.02f, 0.00001f);
|
|
effect->mAlpha *= var_f31;
|
|
|
|
if (var_r27 != 0) {
|
|
effect->mAlpha = 0.0f;
|
|
}
|
|
|
|
if (dKy_darkworld_check() == true || var_r24 == 1) {
|
|
f32 var_f1_6 = sp6C.abs(camera->lookat.eye);
|
|
effect->field_0x48 = var_f1_6;
|
|
|
|
f32 var_f1_7;
|
|
if (var_f1_6 >= 800.0f) {
|
|
var_f1_7 = (var_f1_6 - 800.0f) / 825.0f;
|
|
if (var_f1_7 > 1.0f) {
|
|
var_f1_7 = 1.0f;
|
|
}
|
|
} else {
|
|
var_f1_7 = 0.0f;
|
|
}
|
|
|
|
effect->mAlpha = var_f1_7;
|
|
}
|
|
|
|
f32 var_f1_8 = sp6C.abs(camera->lookat.eye);
|
|
f32 temp_f25 = var_f1_8 / 2000.0f;
|
|
effect->field_0x48 = 1.0f - (temp_f25 * temp_f25);
|
|
}
|
|
}
|
|
|
|
/* 8005FBDC-8005FD48 05A51C 016C+00 0/0 1/1 0/0 .text dKyr_snow_init__Fv */
|
|
void dKyr_snow_init() {
|
|
camera_class* camera = g_dComIfG_gameInfo.play.mCameraInfo[0].mCamera;
|
|
g_env_light.mpSnowPacket = new (32) dKankyo_snow_Packet();
|
|
|
|
if (g_env_light.mpSnowPacket == NULL) {
|
|
return;
|
|
}
|
|
|
|
g_env_light.mpSnowPacket->mpTex = (u8*)dComIfG_getObjectRes("Always", 0x56);
|
|
|
|
for (int i = 0; i < 500; i++) {
|
|
g_env_light.mpSnowPacket->mSnowEff[i].mStatus = 0;
|
|
}
|
|
|
|
g_env_light.mpSnowPacket->field_0x6d88 = 0;
|
|
g_env_light.mpSnowPacket->field_0x6d74 = camera->lookat.eye;
|
|
g_env_light.mpSnowPacket->field_0x6d80 = 0.0f;
|
|
g_env_light.mpSnowPacket->field_0x6d84 = 0.0f;
|
|
g_env_light.mpSnowPacket->field_0x6d8a = 0;
|
|
g_env_light.mpSnowPacket->field_0x6d8c = 0;
|
|
g_env_light.mpSnowPacket->field_0x6d90 = 0;
|
|
g_env_light.mpSnowPacket->field_0x6d91 = 0;
|
|
g_env_light.mpSnowPacket->field_0x6d92 = 0;
|
|
g_env_light.mpSnowPacket->field_0x6d93 = 0;
|
|
}
|
|
|
|
/* 8005FD48-80061324 05A688 15DC+00 0/0 1/1 0/0 .text dKyr_snow_move__Fv */
|
|
void dKyr_snow_move() {
|
|
dKankyo_snow_Packet* snow_packet = g_env_light.mpSnowPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
DOUBLE_POS spC8;
|
|
cXyz spB8;
|
|
cXyz spAC;
|
|
cXyz spA0;
|
|
cXyz sp94 = dKyw_get_wind_vecpow();
|
|
cXyz sp88 = dKyw_get_wind_vecpow();
|
|
cXyz sp7C;
|
|
cXyz sp70;
|
|
|
|
dBgS_ObjGndChk_All spE0;
|
|
cXyz sp64;
|
|
|
|
if (snow_packet->field_0x6d88 <= g_env_light.mSnowCount) {
|
|
snow_packet->field_0x6d88 = g_env_light.mSnowCount;
|
|
}
|
|
|
|
if (snow_packet->field_0x6d88 == 0) {
|
|
return;
|
|
}
|
|
|
|
sp64 = player->current.pos;
|
|
sp64.y += 100.0f;
|
|
spE0.SetPos(&sp64);
|
|
f32 temp_f19 = dComIfG_Bgsp().GroundCross(&spE0);
|
|
|
|
dKy_set_eyevect_calc2(camera, &spB8, 500.0f, 500.0f);
|
|
dKy_set_eyevect_calc2(camera, &spAC, 1000.0f, 1000.0f);
|
|
|
|
if (snow_packet->field_0x6d74.abs(camera->lookat.eye) > 1500.0f) {
|
|
snow_packet->field_0x6d88 = 0;
|
|
}
|
|
|
|
snow_packet->field_0x6d74 = camera->lookat.eye;
|
|
spA0.x = spA0.y = spA0.z = 0.0f;
|
|
|
|
cXyz* temp_r21 = dKyw_get_wind_vec();
|
|
f32 var_f20 = dKyw_get_wind_pow();
|
|
if (g_env_light.field_0xe92 == 1) {
|
|
var_f20 *= 1.2f;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
|
|
sp94.x = 0.3f;
|
|
sp94.y = 0.0f;
|
|
sp94.z = 0.0f;
|
|
var_f20 = 0.3f;
|
|
}
|
|
|
|
cXyz sp58;
|
|
spC8.x = camera->lookat.center.x - camera->lookat.eye.x;
|
|
spC8.y = 0.0f;
|
|
spC8.z = camera->lookat.center.z - camera->lookat.eye.z;
|
|
vectle_calc(&spC8, &sp58);
|
|
|
|
snow_packet->field_0x6d84 =
|
|
cM3d_VectorProduct2d(0.0f, 0.0f, -temp_r21->x, -temp_r21->z, sp58.x, sp58.z);
|
|
|
|
f32 temp_f20_1 = fabsf((temp_r21->x * sp58.x) + (temp_r21->z * sp58.z));
|
|
snow_packet->field_0x6d80 = ((1.0f - temp_f20_1) * var_f20) * (1.0f - fabsf(temp_r21->y + 0.3f));
|
|
snow_packet->field_0x6d80 *= fabsf(snow_packet->field_0x6d84);
|
|
|
|
for (int i = snow_packet->field_0x6d88 - 1; i >= 0; i--) {
|
|
f32 gravity = -(2.0f + cM_rndF(6.5f));
|
|
f32 speed = 2.0f * (5.0f + (f32)(i & 15));
|
|
|
|
switch (snow_packet->mSnowEff[i].mStatus) {
|
|
case 0:
|
|
snow_packet->mSnowEff[i].mWindSpeed = speed;
|
|
snow_packet->mSnowEff[i].mGravity = gravity;
|
|
snow_packet->mSnowEff[i].mTimer = 0;
|
|
snow_packet->mSnowEff[i].mBasePos.x = spAC.x + cM_rndFX(1100.0f);
|
|
snow_packet->mSnowEff[i].mBasePos.y = spAC.y + 1100.0f;
|
|
snow_packet->mSnowEff[i].mBasePos.z = spAC.z + cM_rndFX(1100.0f);
|
|
snow_packet->mSnowEff[i].mPosition.x = spB8.x + cM_rndFX(550.0f);
|
|
snow_packet->mSnowEff[i].mPosition.y = spB8.y + 550.0f;
|
|
snow_packet->mSnowEff[i].mPosition.z = spB8.z + cM_rndFX(550.0f);
|
|
snow_packet->mSnowEff[i].mScale = 0.0f;
|
|
snow_packet->mSnowEff[i].mPosWaveX = cM_rndF(65536.0f);
|
|
snow_packet->mSnowEff[i].mPosWaveZ = cM_rndF(65536.0f);
|
|
snow_packet->mSnowEff[i].mStatus++;
|
|
break;
|
|
case 1:
|
|
cLib_addCalc(&snow_packet->mSnowEff[i].mWindSpeed, snow_packet->mSnowEff[i].mWindSpeed - cM_rndFX(0.08f), 0.5f, 0.1f, 0.01f);
|
|
|
|
cXyz sp4C;
|
|
sp88 = sp94;
|
|
if (camera->lookat.eye.abs(snow_packet->mSnowEff[i].mPosition) < 500.0f &&
|
|
snow_packet->mSnowEff[i].mPosition.y < temp_f19 + 250.0f)
|
|
{
|
|
f32 var_f1_3 = ((temp_f19 + 250.0f) - snow_packet->mSnowEff[i].mPosition.y) / 250.0f;
|
|
if (var_f1_3 > 1.0f) {
|
|
var_f1_3 = 1.0f;
|
|
}
|
|
|
|
sp88.y = var_f1_3 * 0.45f;
|
|
}
|
|
|
|
s16 wave_x = snow_packet->mSnowEff[i].mPosWaveX;
|
|
s16 wave_z = snow_packet->mSnowEff[i].mPosWaveZ;
|
|
|
|
sp4C.x = cM_scos(wave_x) * cM_ssin(wave_z);
|
|
sp4C.y = cM_ssin(wave_x);
|
|
sp4C.z = cM_scos(wave_x) * cM_scos(wave_z);
|
|
|
|
snow_packet->mSnowEff[i].mPosition.x += sp88.x * snow_packet->mSnowEff[i].mWindSpeed;
|
|
snow_packet->mSnowEff[i].mPosition.z += sp88.z * snow_packet->mSnowEff[i].mWindSpeed;
|
|
snow_packet->mSnowEff[i].mPosition.y += snow_packet->mSnowEff[i].mGravity + (sp88.y * snow_packet->mSnowEff[i].mWindSpeed);
|
|
|
|
snow_packet->mSnowEff[i].mPosition.x += sp4C.x * 5.3f;
|
|
snow_packet->mSnowEff[i].mPosition.y += sp4C.y * 5.3f;
|
|
snow_packet->mSnowEff[i].mPosition.z += sp4C.z * 5.3f;
|
|
|
|
sp88 = sp94;
|
|
if (camera->lookat.eye.abs(snow_packet->mSnowEff[i].mPosition) < 500.0f &&
|
|
snow_packet->mSnowEff[i].mBasePos.y < temp_f19 + 250.0f)
|
|
{
|
|
f32 var_f1_5 = ((temp_f19 + 250.0f) - snow_packet->mSnowEff[i].mBasePos.y) / 250.0f;
|
|
if (var_f1_5 > 1.0f) {
|
|
var_f1_5 = 1.0f;
|
|
}
|
|
|
|
sp88.y = var_f1_5 * 0.35f;
|
|
}
|
|
|
|
snow_packet->mSnowEff[i].mBasePos.x += sp88.x * snow_packet->mSnowEff[i].mWindSpeed;
|
|
snow_packet->mSnowEff[i].mBasePos.z += sp88.z * snow_packet->mSnowEff[i].mWindSpeed;
|
|
snow_packet->mSnowEff[i].mBasePos.y += snow_packet->mSnowEff[i].mGravity + (sp88.y * snow_packet->mSnowEff[i].mWindSpeed);
|
|
|
|
snow_packet->mSnowEff[i].mBasePos.x += sp4C.x * 5.3f;
|
|
snow_packet->mSnowEff[i].mBasePos.y += sp4C.y * 5.3f;
|
|
snow_packet->mSnowEff[i].mBasePos.z += sp4C.z * 5.3f;
|
|
|
|
cLib_addCalc(&snow_packet->mSnowEff[i].mPosWaveX, snow_packet->mSnowEff[i].mPosWaveX + cM_rndF(3000.0f), 0.25f,
|
|
1500.0f, 0.001f);
|
|
cLib_addCalc(&snow_packet->mSnowEff[i].mPosWaveZ, snow_packet->mSnowEff[i].mPosWaveZ + cM_rndF(3000.0f), 0.25f,
|
|
1500.0f, 0.001f);
|
|
|
|
sp7C = snow_packet->mSnowEff[i].mPosition;
|
|
f32 var_f1_6 = sp7C.abs(spB8);
|
|
|
|
if (snow_packet->mSnowEff[i].mTimer == 0) {
|
|
if (var_f1_6 > 550.0f) {
|
|
snow_packet->mSnowEff[i].mTimer = 10;
|
|
snow_packet->mSnowEff[i].mWindSpeed = speed;
|
|
snow_packet->mSnowEff[i].mGravity = gravity;
|
|
|
|
if (sp7C.abs(spB8) > 600.0f) {
|
|
snow_packet->mSnowEff[i].mPosition.x = spB8.x + cM_rndFX(550.0f);
|
|
snow_packet->mSnowEff[i].mPosition.y = spB8.y + cM_rndFX(550.0f);
|
|
snow_packet->mSnowEff[i].mPosition.z = spB8.z + cM_rndFX(550.0f);
|
|
} else {
|
|
f32 temp_f26_2 = cM_rndFX(27.5f);
|
|
get_vectle_calc(&sp7C, &spB8, &sp70);
|
|
|
|
snow_packet->mSnowEff[i].mPosition.x = spB8.x + sp70.x * (temp_f26_2 + 550.0f);
|
|
snow_packet->mSnowEff[i].mPosition.y = spB8.y + sp70.y * (temp_f26_2 + 550.0f);
|
|
snow_packet->mSnowEff[i].mPosition.z = spB8.z + sp70.z * (temp_f26_2 + 550.0f);
|
|
}
|
|
}
|
|
} else {
|
|
snow_packet->mSnowEff[i].mTimer--;
|
|
}
|
|
|
|
sp7C = snow_packet->mSnowEff[i].mBasePos;
|
|
f32 sp18 = sp7C.abs(spAC);
|
|
if (sp18 > 1100.0f) {
|
|
if (sp7C.abs(spAC) > 1150.0f) {
|
|
snow_packet->mSnowEff[i].mBasePos.x = spAC.x + cM_rndFX(1100.0f);
|
|
snow_packet->mSnowEff[i].mBasePos.y = spAC.y + cM_rndFX(1100.0f);
|
|
snow_packet->mSnowEff[i].mBasePos.z = spAC.z + cM_rndFX(1100.0f);
|
|
} else {
|
|
f32 temp_f26_3 = cM_rndFX(55.0f);
|
|
get_vectle_calc(&sp7C, &spAC, &sp70);
|
|
|
|
snow_packet->mSnowEff[i].mBasePos.x = spAC.x + sp70.x * (temp_f26_3 + 1100.0f);
|
|
snow_packet->mSnowEff[i].mBasePos.y = spAC.y + sp70.y * (temp_f26_3 + 1100.0f);
|
|
snow_packet->mSnowEff[i].mBasePos.z = spAC.z + sp70.z * (temp_f26_3 + 1100.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
sp7C = snow_packet->mSnowEff[i].mPosition;
|
|
|
|
f32 var_f1_11 = sp7C.abs(camera->lookat.eye);
|
|
f32 var_f26 = var_f1_11 / 100.0f;
|
|
if (var_f26 > 1.0) {
|
|
var_f26 = 1.0;
|
|
}
|
|
|
|
var_f26 *= 0.4f;
|
|
|
|
var_f1_11 = sp7C.abs(spB8);
|
|
if (var_f1_11 > 300.0f) {
|
|
f32 var_f1_12 = (550.0f - var_f1_11) / 250.0f;
|
|
if (var_f1_12 < 0.0f) {
|
|
var_f1_12 = 0.0f;
|
|
}
|
|
|
|
var_f26 *= var_f1_12;
|
|
}
|
|
|
|
if (i > g_env_light.mSnowCount - 1) {
|
|
var_f26 = 0.0f;
|
|
cLib_addCalc(&snow_packet->mSnowEff[i].mScale, var_f26, 0.2f, 0.1f, 0.01f);
|
|
} else {
|
|
snow_packet->mSnowEff[i].mScale = var_f26;
|
|
}
|
|
|
|
if (i > g_env_light.mSnowCount - 1 && snow_packet->mSnowEff[i].mScale < 0.01f) {
|
|
if (i == snow_packet->field_0x6d88 - 1) {
|
|
snow_packet->field_0x6d88--;
|
|
}
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
|
|
if (sp7C.z > -340.0f) {
|
|
snow_packet->mSnowEff[i].mScale = 0.0f;
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
|
|
if (sp7C.z > 9800.0f) {
|
|
snow_packet->mSnowEff[i].mScale = 0.0f;
|
|
}
|
|
}
|
|
|
|
sp7C = snow_packet->mSnowEff[i].mBasePos;
|
|
|
|
var_f1_11 = sp7C.abs(camera->lookat.eye);
|
|
f32 temp_f29 = var_f1_11 / 100.0f;
|
|
if (temp_f29 > 1.0) {
|
|
temp_f29 = 1.0;
|
|
}
|
|
|
|
temp_f29 *= 0.38f;
|
|
|
|
var_f1_11 = sp7C.abs(spAC);
|
|
if (var_f1_11 > 850.0f) {
|
|
f32 var_f1_15 = (1100.0f - var_f1_11) / 250.0f;
|
|
if (var_f1_15 < 0.0f) {
|
|
var_f1_15 = 0.0f;
|
|
}
|
|
|
|
temp_f29 *= var_f1_15;
|
|
}
|
|
|
|
if (i > g_env_light.mSnowCount - 1) {
|
|
temp_f29 = 0.0f;
|
|
cLib_addCalc(&snow_packet->mSnowEff[i].field_0x30, temp_f29, 0.2f, 0.1f, 0.01f);
|
|
} else {
|
|
snow_packet->mSnowEff[i].field_0x30 = temp_f29;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
|
|
if (sp7C.z > -340.0f) {
|
|
snow_packet->mSnowEff[i].field_0x30 = 0.0f;
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
|
|
if (sp7C.z > 9800.0f) {
|
|
snow_packet->mSnowEff[i].field_0x30 = 0.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80061324-8006140C 05BC64 00E8+00 0/0 1/1 0/0 .text dKyr_star_init__Fv */
|
|
void dKyr_star_init() {
|
|
camera_class* camera = g_dComIfG_gameInfo.play.mCameraInfo[0].mCamera;
|
|
g_env_light.mpStarPacket = new (32) dKankyo_star_Packet();
|
|
|
|
if (g_env_light.mpStarPacket == NULL) {
|
|
return;
|
|
}
|
|
|
|
g_env_light.mpStarPacket->mpTex = (u8*)dComIfG_getObjectRes("Always", 0x4a);
|
|
g_env_light.mpStarPacket->mEffect[0].field_0x28 = 1.0f;
|
|
g_env_light.mpStarPacket->mEffectNum = 0;
|
|
}
|
|
|
|
|
|
/* 8006140C-80061438 05BD4C 002C+00 0/0 1/1 0/0 .text dKyr_star_move__Fv */
|
|
void dKyr_star_move() {
|
|
dKankyo_star_Packet* packet = g_env_light.mpStarPacket;
|
|
packet->mEffectNum = g_env_light.mStarCount;
|
|
|
|
if (packet->mEffectNum != 0) {
|
|
packet->mEffect[0].field_0x28 = 1.0f;
|
|
}
|
|
}
|
|
|
|
/* 80061438-800620AC 05BD78 0C74+00 0/0 1/1 0/0 .text cloud_shadow_move__Fv */
|
|
void cloud_shadow_move() {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_cloud_Packet* packet = g_env_light.mpCloudPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
Mtx camMtx;
|
|
cXyz wind_vecpow = dKyw_get_wind_vecpow();
|
|
cXyz* wind_vec = dKyw_get_wind_vec();
|
|
cXyz center;
|
|
cXyz spA0;
|
|
cXyz sp94;
|
|
cXyz sp88;
|
|
cXyz sp7C;
|
|
cXyz pos;
|
|
cXyz sp64;
|
|
cXyz sp58;
|
|
|
|
f32 sp44 = 400.0f;
|
|
f32 sp40;
|
|
f32 sp3C = 1.0f;
|
|
f32 wind_pow = dKyw_get_wind_pow();
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (packet->mCount <= g_env_light.mMoyaCount) {
|
|
packet->mCount = (s16)g_env_light.mMoyaCount;
|
|
}
|
|
|
|
if (packet->mCount != 0) {
|
|
if (g_env_light.mMoyaMode == 8 || g_env_light.mMoyaMode == 10) {
|
|
if ((g_Counter.mCounter0 & 128) == 0) {
|
|
cLib_addCalc(&g_env_light.field_0xebc, 1.0f, 0.1f, 0.01f + cM_rndFX(0.005f), 0.000001f);
|
|
} else {
|
|
cLib_addCalc(&g_env_light.field_0xebc, 0.3f, 0.1f, 0.01f, 0.000001f);
|
|
}
|
|
|
|
if (g_env_light.wether >= 3) {
|
|
cLib_addCalc(&g_env_light.field_0xebc, 1.0f, 0.5f, 0.1f, 0.000001f);
|
|
}
|
|
}
|
|
|
|
if (g_env_light.mMoyaMode == 4 || g_env_light.mMoyaMode == 11) {
|
|
wind_vecpow.x = wind_vec->x * (0.6f + (0.4f * dKyw_get_wind_pow()));
|
|
wind_vecpow.y = wind_vec->y * (0.6f + (0.4f * dKyw_get_wind_pow()));
|
|
wind_vecpow.z = wind_vec->z * (0.6f + (0.4f * dKyw_get_wind_pow()));
|
|
}
|
|
|
|
f32 sp28;
|
|
if (dComIfGd_getView() != NULL) {
|
|
sp28 = dComIfGd_getView()->fovy / 40.0f;
|
|
if (sp28 >= 1.0f) {
|
|
sp28 = 1.0f;
|
|
}
|
|
} else {
|
|
sp28 = 1.0f;
|
|
}
|
|
|
|
sp40 = 1200.0f;
|
|
f32 rnd_pos = 1400.0f;
|
|
dKy_set_eyevect_calc2(camera, ¢er, sp40, sp40);
|
|
|
|
for (int i = 0; i < packet->mCount; i++) {
|
|
switch (packet->mCloudEff[i].mStatus) {
|
|
case 0:
|
|
packet->mCloudEff[i].mBasePos.x = center.x;
|
|
packet->mCloudEff[i].mBasePos.y = center.y;
|
|
if (g_env_light.mMoyaMode == 8) {
|
|
packet->mCloudEff[i].mBasePos.y = -300.0f;
|
|
}
|
|
packet->mCloudEff[i].mBasePos.z = center.z;
|
|
|
|
packet->mCloudEff[i].mPosition.x = cM_rndFX(rnd_pos);
|
|
packet->mCloudEff[i].mPosition.y = cM_rndFX(rnd_pos);
|
|
packet->mCloudEff[i].mPosition.z = cM_rndFX(rnd_pos);
|
|
|
|
packet->mCloudEff[i].field_0x28 = 0.5f + cM_rndF(0.5f);
|
|
packet->mCloudEff[i].mAlpha = 0.0f;
|
|
packet->mCloudEff[i].field_0x2c = cM_rndF(65535.0f);
|
|
packet->mCloudEff[i].mPntWindSpeed.x = 0.0f;
|
|
packet->mCloudEff[i].mPntWindSpeed.y = 0.0f;
|
|
packet->mCloudEff[i].mPntWindSpeed.z = 0.0f;
|
|
|
|
packet->mCloudEff[i].mStatus++;
|
|
break;
|
|
case 1:
|
|
case 2: {
|
|
pos.x = packet->mCloudEff[i].mBasePos.x + packet->mCloudEff[i].mPosition.x;
|
|
pos.y = packet->mCloudEff[i].mBasePos.y + packet->mCloudEff[i].mPosition.y;
|
|
pos.z = packet->mCloudEff[i].mBasePos.z + packet->mCloudEff[i].mPosition.z;
|
|
|
|
f32 sp34 = (0.5f * (1.0f + cM_ssin(packet->mCloudEff[i].field_0x2c)));
|
|
f32 sp30 = cM_scos(packet->mCloudEff[i].field_0x2c);
|
|
packet->mCloudEff[i].field_0x2c += 100;
|
|
f32 sp2C = (sp44 * packet->mCloudEff[i].field_0x28);
|
|
|
|
if (g_env_light.mMoyaMode != 5) {
|
|
packet->mCloudEff[i].mPosition.x += (0.6f + (0.4f * sp34)) * (sp2C * (wind_vecpow.x * (wind_vecpow.x * wind_vecpow.x)));
|
|
packet->mCloudEff[i].mPosition.y += (0.6f * (sp2C * (wind_vecpow.y * (wind_vecpow.y * wind_vecpow.y)))) + (0.08f * sp2C * (sp30 * dKyw_get_wind_pow()));
|
|
packet->mCloudEff[i].mPosition.z += (0.6f + (0.4f * sp34)) * (sp2C * (wind_vecpow.z * (wind_vecpow.z * wind_vecpow.z)));
|
|
} else {
|
|
packet->mCloudEff[i].mPosition.x += sp30;
|
|
packet->mCloudEff[i].mPosition.y += (0.6f * (0.027000003f * sp2C)) + (0.3f * sp30 * (0.08f * sp2C));
|
|
packet->mCloudEff[i].mPosition.z += sp30;
|
|
}
|
|
|
|
if (g_env_light.mMoyaMode == 6) {
|
|
packet->mCloudEff[i].mPosition.y += 23.0f * packet->mCloudEff[i].field_0x28;
|
|
} else if (g_env_light.mMoyaMode == 8) {
|
|
if ((i & 1) == 0) {
|
|
packet->mCloudEff[i].mPosition.y += 20.0f * packet->mCloudEff[i].field_0x28;
|
|
}
|
|
} else if (g_env_light.mMoyaMode == 10) {
|
|
packet->mCloudEff[i].mPosition.y += 20.0f * packet->mCloudEff[i].field_0x28 * dKyw_get_wind_pow();
|
|
} else if (g_env_light.mMoyaMode == 11) {
|
|
packet->mCloudEff[i].mPosition.y += 120.0f * packet->mCloudEff[i].field_0x28 * dKyw_get_wind_pow();
|
|
}
|
|
|
|
pos.x = packet->mCloudEff[i].mBasePos.x + packet->mCloudEff[i].mPosition.x;
|
|
pos.y = packet->mCloudEff[i].mBasePos.y + packet->mCloudEff[i].mPosition.y;
|
|
pos.z = packet->mCloudEff[i].mBasePos.z + packet->mCloudEff[i].mPosition.z;
|
|
|
|
if (pos.abs(center) > rnd_pos) {
|
|
packet->mCloudEff[i].mBasePos.x = center.x;
|
|
packet->mCloudEff[i].mBasePos.y = center.y;
|
|
if (g_env_light.mMoyaMode == 8) {
|
|
packet->mCloudEff[i].mBasePos.y = -300.0f;
|
|
}
|
|
packet->mCloudEff[i].mBasePos.z = center.z;
|
|
|
|
if (pos.abs(center) > rnd_pos + (0.1f * rnd_pos)) {
|
|
packet->mCloudEff[i].mPosition.x = cM_rndFX(rnd_pos);
|
|
packet->mCloudEff[i].mPosition.y = cM_rndFX(rnd_pos);
|
|
packet->mCloudEff[i].mPosition.z = cM_rndFX(rnd_pos);
|
|
} else {
|
|
cLib_addCalc(&packet->mCloudEff[i].mAlpha, 0.0f, 0.5f, 0.1f, 0.01f);
|
|
if (packet->mCloudEff[i].mAlpha < 0.01f) {
|
|
get_vectle_calc(&pos, ¢er, &sp64);
|
|
sp64.x += cM_rndF(0.5f);
|
|
sp64.y += cM_rndF(0.5f);
|
|
sp64.z += cM_rndF(0.5f);
|
|
|
|
packet->mCloudEff[i].mPosition.x = sp64.x * rnd_pos;
|
|
packet->mCloudEff[i].mPosition.y = sp64.y * rnd_pos;
|
|
packet->mCloudEff[i].mPosition.z = sp64.z * rnd_pos;
|
|
}
|
|
}
|
|
|
|
packet->mCloudEff[i].mAlpha = 0.0f;
|
|
}
|
|
break;
|
|
}
|
|
case 3:
|
|
packet->mCloudEff[i].mStatus = 0;
|
|
break;
|
|
}
|
|
|
|
pos.x = packet->mCloudEff[i].mBasePos.x + packet->mCloudEff[i].mPosition.x;
|
|
pos.y = packet->mCloudEff[i].mBasePos.y + packet->mCloudEff[i].mPosition.y;
|
|
pos.z = packet->mCloudEff[i].mBasePos.z + packet->mCloudEff[i].mPosition.z;
|
|
|
|
f32 sp20 = 0.0f;
|
|
f32 sp1C = 700.0f;
|
|
f32 sp24 = pos.abs(camera->lookat.eye);
|
|
|
|
f32 sp18 = (sp24 / rnd_pos);
|
|
if (sp18 > 1.0f) {
|
|
sp18 = 1.0f;
|
|
}
|
|
sp18 = sp18;
|
|
|
|
f32 alpha_target;
|
|
if (sp24 < sp1C) {
|
|
if (sp24 < sp1C - 400.0f) {
|
|
alpha_target = 0.0f;
|
|
} else {
|
|
alpha_target = (sp24 - (sp1C - 400.0f)) / (sp1C - (sp1C - 400.0f));
|
|
if (alpha_target < 0.0f) {
|
|
alpha_target = 0.0f;
|
|
} else if (alpha_target > 1.0f) {
|
|
alpha_target = 1.0f;
|
|
}
|
|
}
|
|
} else {
|
|
f32 sp14 = 0.8f * (sp40 + rnd_pos);
|
|
if (sp24 < 0.5f * sp14) {
|
|
alpha_target = 1.0f;
|
|
} else {
|
|
alpha_target = (sp24 - (0.5f * sp14)) / (sp14 - (0.5f * sp14));
|
|
if (alpha_target < 0.0f) {
|
|
alpha_target = 0.0f;
|
|
} else if (alpha_target > 1.0f) {
|
|
alpha_target = 1.0f;
|
|
}
|
|
alpha_target = 1.0f - alpha_target;
|
|
}
|
|
}
|
|
|
|
packet->mCloudEff[i].mSize = (44.0f + (408.0f * sp18)) * sp28;
|
|
|
|
f32 alpha_max = 0.12f;
|
|
if (g_env_light.mMoyaMode == 1 || g_env_light.mMoyaMode == 8) {
|
|
alpha_max = 0.24f;
|
|
} else if (g_env_light.mMoyaMode == 10) {
|
|
alpha_max = 0.2f * dKyw_get_wind_pow();
|
|
} else if (g_env_light.mMoyaMode == 11) {
|
|
alpha_max = dKyw_get_wind_pow() * dKyw_get_wind_pow();
|
|
} else if (g_env_light.mMoyaMode == 2) {
|
|
alpha_max = 0.36f;
|
|
} else if (g_env_light.mMoyaMode == 4) {
|
|
alpha_max = 0.38f * dKyw_get_wind_pow();
|
|
} else if (g_env_light.mMoyaMode == 50) {
|
|
alpha_max = 0.25f * (envlight->senses_effect_strength * envlight->senses_effect_strength * envlight->senses_effect_strength);
|
|
packet->mCloudEff[i].mAlpha = alpha_max * alpha_target;
|
|
} else if (g_env_light.mMoyaMode == 5) {
|
|
alpha_max = 0.09f;
|
|
} else if (g_env_light.mMoyaMode == 6) {
|
|
alpha_max = 0.13f;
|
|
}
|
|
|
|
if (g_env_light.field_0xe92 == 1) {
|
|
alpha_max = 0.3f;
|
|
}
|
|
|
|
if (g_env_light.mMoyaMode == 9) {
|
|
if (dKyw_get_wind_pow() > 0.7f) {
|
|
alpha_max = 0.36f;
|
|
} else {
|
|
alpha_max = 0.1f;
|
|
}
|
|
}
|
|
|
|
f32 sp10 = 1.0f;
|
|
s8 sp8;
|
|
sp10 = dKy_move_room_ratio(&player->tevStr, &sp8);
|
|
packet->mCloudEff[i].mAlpha *= sp10;
|
|
|
|
if (i > g_env_light.mMoyaCount - 1) {
|
|
alpha_max = 0.0f;
|
|
if (packet->mCloudEff[i].mAlpha < 0.001f && i == packet->mCount - 1) {
|
|
packet->mCount--;
|
|
}
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN05A") == 0) {
|
|
dKankyo_mud_Packet* mud_packet = g_env_light.mpMudPacket;
|
|
if (mud_packet != NULL) {
|
|
alpha_max *= mud_packet->field_0x1c3c;
|
|
}
|
|
}
|
|
|
|
cLib_addCalc(&packet->mCloudEff[i].mAlpha, alpha_max * alpha_target, 0.1f, 0.1f, 0.001f);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 800620AC-80062ADC 05C9EC 0A30+00 0/0 1/1 0/0 .text vrkumo_move__Fv */
|
|
void vrkumo_move() {
|
|
cXyz wind_vecpow = dKyw_get_wind_vecpow();
|
|
dKankyo_vrkumo_Packet* vrkumo_packet = g_env_light.mpVrkumoPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
cXyz sp80;
|
|
|
|
f32 sp3C = 0.0f;
|
|
cXyz* wind_vec = dKyw_get_wind_vec();
|
|
|
|
f32 sp70, sp6C, sp68, sp64, sp60;
|
|
f32 sp5C, sp58, sp54, sp50, sp4C;
|
|
if (dKy_darkworld_check()) {
|
|
sp70 = 80.0f;
|
|
sp6C = 0.0f;
|
|
sp68 = 0.0f;
|
|
sp64 = 0.98f;
|
|
sp60 = 0.75f;
|
|
sp5C = sp70;
|
|
sp58 = sp6C;
|
|
sp54 = sp68;
|
|
sp50 = sp64;
|
|
sp4C = sp60;
|
|
} else {
|
|
sp70 = 10.0f;
|
|
sp6C = 2500.0f;
|
|
sp68 = 2500.0f;
|
|
sp64 = 0.99f;
|
|
sp60 = 1.0f;
|
|
sp5C = 25.0f;
|
|
sp58 = 1200.0f;
|
|
sp54 = 1200.0f;
|
|
sp50 = 0.95f;
|
|
sp4C = 1.0f;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN07A") == 0) {
|
|
sp58 = 4000.0f;
|
|
sp54 = 2000.0f;
|
|
}
|
|
|
|
f32 strength = g_env_light.mVrkumoStrength;
|
|
sp70 += strength * (sp5C - sp70);
|
|
sp6C += strength * (sp58 - sp6C);
|
|
sp68 += strength * (sp54 - sp68);
|
|
sp64 += strength * (sp50 - sp64);
|
|
sp60 += strength * (sp4C - sp60);
|
|
|
|
int stage_type = dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo());
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
f32 sp2C = 0.0f;
|
|
|
|
dStage_FileList_dt_c* filelist = NULL;
|
|
if (dComIfGp_roomControl_getStayNo() >= 0) {
|
|
filelist = dComIfGp_roomControl_getStatusRoomDt(dComIfGp_roomControl_getStayNo())->getFileListInfo();
|
|
}
|
|
|
|
if (filelist != NULL) {
|
|
sp2C = dStage_FileList_dt_SeaLevel(filelist);
|
|
#ifdef DEBUG
|
|
if (g_kankyoHIO.field_0x0b4) {
|
|
sp2C = g_kankyoHIO.field_0x0b8;
|
|
} else {
|
|
g_kankyoHIO.field_0x0b8 = sp2C;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
sp6C -= 0.09f * (camera->lookat.eye.y - sp2C);
|
|
}
|
|
|
|
for (int i = 0; i < 100; i++) {
|
|
switch (vrkumo_packet->mVrkumoEff[i].mStatus) {
|
|
case 0:
|
|
s16 sp8 = cM_rndF(65535.0f);
|
|
f32 sp34 = cM_rndF(18000.0f);
|
|
if (sp34 > 15000.0f) {
|
|
sp34 = 14000.0 + cM_rndF(1000.0f);
|
|
}
|
|
|
|
f32 var_f31 = sp34 * cM_ssin(sp8);
|
|
// @bug - parenthesis should not be on the condition
|
|
if ((f32)fabs(var_f31 < 5000.0f)) {
|
|
if (var_f31 > 0.0f) {
|
|
var_f31 += 5000.0f;
|
|
} else {
|
|
var_f31 -= 5000.0f;
|
|
}
|
|
}
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.x = var_f31;
|
|
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.y = 0.0f;
|
|
|
|
var_f31 = sp34 * cM_scos(sp8);
|
|
// @bug - parenthesis should not be on the condition
|
|
if ((f32)fabs(var_f31 < 5000.0f)) {
|
|
if (var_f31 > 0.0f) {
|
|
var_f31 += 5000.0f;
|
|
} else {
|
|
var_f31 -= 5000.0f;
|
|
}
|
|
}
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.z = var_f31;
|
|
|
|
vrkumo_packet->mVrkumoEff[i].mHeight = 0.3f * cM_rndFX(0.3f);
|
|
vrkumo_packet->mVrkumoEff[i].mAlpha = 0.0f;
|
|
vrkumo_packet->mVrkumoEff[i].mSpeed = 0.4f + cM_rndF(2.0f);
|
|
|
|
vrkumo_packet->mVrkumoEff[i].mStatus++;
|
|
break;
|
|
case 1:
|
|
sp80 = vrkumo_packet->mVrkumoEff[i].mPosition;
|
|
sp80.y = 0.0f;
|
|
|
|
if (sp80.abs() > 15000.0f) {
|
|
if (sp80.abs() > 15100.0f) {
|
|
sp8 = cM_rndF(65535.0f);
|
|
sp34 = cM_rndF(18000.0f);
|
|
if (sp34 > 15000.0f) {
|
|
sp34 = 14000.0 + cM_rndF(1000.0f);
|
|
}
|
|
var_f31 = sp34 * cM_ssin(sp8);
|
|
|
|
// @bug - parenthesis should not be on the condition
|
|
if ((f32)fabs(var_f31 < 5000.0f)) {
|
|
if (var_f31 > 0.0f) {
|
|
var_f31 += 5000.0f;
|
|
} else {
|
|
var_f31 -= 5000.0f;
|
|
}
|
|
}
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.x = var_f31;
|
|
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.y = 0.0f;
|
|
|
|
var_f31 = sp34 * cM_scos(sp8);
|
|
|
|
// @bug - parenthesis should not be on the condition
|
|
if ((f32)fabs(var_f31 < 5000.0f)) {
|
|
if (var_f31 > 0.0f) {
|
|
var_f31 += 5000.0f;
|
|
} else {
|
|
var_f31 -= 5000.0f;
|
|
}
|
|
}
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.z = var_f31;
|
|
} else {
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.x = -vrkumo_packet->mVrkumoEff[i].mPosition.x;
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.z = -vrkumo_packet->mVrkumoEff[i].mPosition.z;
|
|
}
|
|
vrkumo_packet->mVrkumoEff[i].mAlpha = 0.0f;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN07A") == 0) {
|
|
wind_vecpow.x = -0.7f;
|
|
wind_vecpow.z = 0.0f;
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "R_SP30") == 0) {
|
|
wind_vecpow.x = (0.3f * wind_vec->x) + (0.5f * wind_vecpow.x);
|
|
wind_vecpow.z = (0.3f * wind_vec->z) + (0.5f * wind_vecpow.z);
|
|
}
|
|
|
|
if (vrkumo_packet->mVrkumoEff[i].mAlpha <= 0.0f) {
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.x += wind_vecpow.x * (sp70 + ((i / 100.0f) * sp70));
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.z += wind_vecpow.z * (sp70 + ((i / 100.0f) * sp70));
|
|
} else {
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.x += wind_vecpow.x * (sp70 * vrkumo_packet->mVrkumoEff[i].mSpeed) * vrkumo_packet->mVrkumoEff[i].mDistFalloff;
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.z += wind_vecpow.z * (sp70 * vrkumo_packet->mVrkumoEff[i].mSpeed) * vrkumo_packet->mVrkumoEff[i].mDistFalloff;
|
|
}
|
|
break;
|
|
case 3:
|
|
break;
|
|
}
|
|
|
|
cXyz sp74;
|
|
sp74 = vrkumo_packet->mVrkumoEff[i].mPosition;
|
|
sp74.y = 0.0f;
|
|
|
|
f32 sp24 = sp74.abs();
|
|
f32 sp20 = 1.0f - (sp24 / 15000.0f);
|
|
if (sp20 < 0.0f) {
|
|
sp20 = 0.0f;
|
|
}
|
|
|
|
f32 spC = 1.0f;
|
|
|
|
f32 sp1C = i / 100.0f;
|
|
f32 sp44 = 1.0f - sp20;
|
|
sp44 = 1.0f - (sp44 * sp44 * sp44);
|
|
vrkumo_packet->mVrkumoEff[i].mPosition.y = (500.0f * sp1C) + (sp6C + (sp68 * sp44));
|
|
|
|
sp20 = sp24 / 15000.0f;
|
|
if (sp20 > 1.0f) {
|
|
sp20 = 1.0f;
|
|
}
|
|
sp20 = 1.0f - (0.6f * (sp20 * sp20 * sp20 * sp20));
|
|
vrkumo_packet->mVrkumoEff[i].mDistFalloff = sp20;
|
|
|
|
f32 max_alpha;
|
|
f32 alpha_step = 0.025f;
|
|
f32 sp10 = 1.0f;
|
|
if (i >= g_env_light.mVrkumoCount) {
|
|
alpha_step = 0.025f;
|
|
max_alpha = 0.0f;
|
|
} else if (vrkumo_packet->mVrkumoEff[i].mDistFalloff < 0.5f) {
|
|
alpha_step = 0.025f;
|
|
max_alpha = 0.0f;
|
|
} else {
|
|
max_alpha = sp10;
|
|
}
|
|
|
|
max_alpha *= spC;
|
|
cLib_addCalc(&vrkumo_packet->mVrkumoEff[i].mAlpha, max_alpha, 0.5f, alpha_step, 0.001f);
|
|
}
|
|
}
|
|
|
|
/* 80062ADC-80062B4C 05D41C 0070+00 7/7 0/0 0/0 .text dKr_cullVtx_Set__Fv */
|
|
static void dKr_cullVtx_Set() {
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
}
|
|
|
|
/* 80062B4C-80063670 05D48C 0B24+00 2/1 0/0 0/0 .text dKyr_draw_rev_moon__FPA4_fPPUc */
|
|
static void dKyr_draw_rev_moon(Mtx drawMtx, u8** tex) {
|
|
dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket;
|
|
dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunLenzPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
cXyz pos[4];
|
|
|
|
u16 date = dComIfGs_getDate();
|
|
cXyz sp60 = camera->lookat.eye + g_env_light.moon_pos;
|
|
sp60.y = camera->lookat.eye.y - g_env_light.moon_pos.y;
|
|
|
|
cXyz moon_pos;
|
|
moon_pos.x = sp60.x - camera->lookat.eye.x;
|
|
moon_pos.y = sp60.y - camera->lookat.eye.y;
|
|
moon_pos.z = sp60.z - camera->lookat.eye.z;
|
|
|
|
Vec vp, lp;
|
|
|
|
int weekday = date % 8;
|
|
if (g_env_light.getDaytime() < 180.0f) {
|
|
if (weekday != 0) {
|
|
weekday--;
|
|
} else {
|
|
weekday = 7;
|
|
}
|
|
}
|
|
|
|
if (weekday != 4) {
|
|
int texidx;
|
|
f32 flipX;
|
|
switch (weekday) {
|
|
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 = 0;
|
|
flipX = 1.0f;
|
|
break;
|
|
case 5:
|
|
texidx = 3;
|
|
flipX = -1.0f;
|
|
break;
|
|
case 6:
|
|
texidx = 2;
|
|
flipX = -1.0f;
|
|
break;
|
|
case 7:
|
|
default:
|
|
texidx = 1;
|
|
flipX = -1.0f;
|
|
break;
|
|
}
|
|
|
|
GXColor color_reg0;
|
|
color_reg0.r = g_env_light.fog_col.r;
|
|
color_reg0.g = g_env_light.fog_col.g;
|
|
color_reg0.b = g_env_light.fog_col.b;
|
|
color_reg0.a = 0xFF;
|
|
|
|
GXColor color_reg1;
|
|
color_reg1.r = 0;
|
|
color_reg1.g = 0;
|
|
color_reg1.b = 0;
|
|
color_reg1.a = 0xFF;
|
|
|
|
Mtx camMtx;
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
if (sun_packet->field_0x28 < 5) {
|
|
sun_packet->field_0x28 += 2;
|
|
}
|
|
sun_packet->field_0x29 = 1;
|
|
return;
|
|
}
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[0], GX_TEXMAP0);
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[1], GX_TEXMAP1);
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[texidx + 2], GX_TEXMAP2);
|
|
|
|
GXSetNumChans(0);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
GXSetNumTexGens(3);
|
|
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
|
GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
|
GXSetTexCoordGen(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
|
GXSetNumTevStages(3);
|
|
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
|
|
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_TEXC, 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_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL);
|
|
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
|
|
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD2, GX_TEXMAP2, GX_COLOR_NULL);
|
|
GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
|
|
GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX2, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX2, GX_DIRECT);
|
|
|
|
cXyz camfwd;
|
|
f32 dayscale[8] = {
|
|
1.0f, 0.83f, 0.6f, 0.78f,
|
|
1.0f, 0.78f, 0.6f, 0.83f,
|
|
};
|
|
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &camfwd);
|
|
|
|
f32 cam_distXZ = JMAFastSqrt((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 = JMAFastSqrt((moon_pos.x * moon_pos.x) + (moon_pos.z * moon_pos.z));
|
|
f32 moon_theta = atan2f(moon_pos.x, moon_pos.z);
|
|
f32 moon_phi = atan2f(moon_pos.y, moon_distXZ);
|
|
|
|
f32 sp3C = (moon_theta - cam_theta) / -(M_PI * 2);
|
|
f32 rot = -(45.0f + (360.0f * sp3C));
|
|
|
|
Mtx rotMtx;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
color_reg0.r = 0;
|
|
color_reg0.g = 0;
|
|
color_reg0.b = 0;
|
|
|
|
f32 size = 8000.0f;
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
|
|
size = 11000.0f;
|
|
}
|
|
|
|
color_reg0.a = 255.0f * sun_packet->mMoonAlpha;
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
if (i == 1) {
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)lenz_packet->mpResBall);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
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_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
|
|
size *= 2.3f;
|
|
color_reg0.a = 40.0f * sun_packet->mMoonAlpha;
|
|
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xFF;
|
|
color_reg0.b = 0xCF;
|
|
|
|
color_reg1.r = 0xC5;
|
|
color_reg1.g = 0x69;
|
|
color_reg1.b = 0x23;
|
|
|
|
rot = (50.0f * flipX);
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
|
|
vp.x = -size * flipX;
|
|
vp.y = size;
|
|
vp.z = 0.0f;
|
|
cMtx_multVec(camMtx, &vp, &lp);
|
|
pos[0].x = sp60.x + lp.x;
|
|
pos[0].y = sp60.y + lp.y;
|
|
pos[0].z = sp60.z + lp.z;
|
|
|
|
vp.x = size * flipX;
|
|
vp.y = size;
|
|
vp.z = 0.0f;
|
|
cMtx_multVec(camMtx, &vp, &lp);
|
|
pos[1].x = sp60.x + lp.x;
|
|
pos[1].y = sp60.y + lp.y;
|
|
pos[1].z = sp60.z + lp.z;
|
|
|
|
if (i == 0) {
|
|
vp.x = size * flipX;
|
|
vp.y = -size;
|
|
} else {
|
|
vp.x = (size * flipX) * dayscale[weekday];
|
|
vp.y = -size * dayscale[weekday];
|
|
}
|
|
|
|
vp.z = 0.0f;
|
|
cMtx_multVec(camMtx, &vp, &lp);
|
|
pos[2].x = sp60.x + lp.x;
|
|
pos[2].y = sp60.y + lp.y;
|
|
pos[2].z = sp60.z + lp.z;
|
|
|
|
vp.x = -size * flipX;
|
|
vp.y = -size;
|
|
vp.z = 0.0f;
|
|
cMtx_multVec(camMtx, &vp, &lp);
|
|
pos[3].x = sp60.x + lp.x;
|
|
pos[3].y = sp60.y + lp.y;
|
|
pos[3].z = sp60.z + lp.z;
|
|
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
GXPosition3f32(pos[0].x, pos[0].y, pos[0].z);
|
|
GXTexCoord2s16(0, 0);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0, 0);
|
|
GXTexCoord2s16(0, 0);
|
|
}
|
|
|
|
GXPosition3f32(pos[1].x, pos[1].y, pos[1].z);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
}
|
|
|
|
GXPosition3f32(pos[2].x, pos[2].y, pos[2].z);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
}
|
|
|
|
GXPosition3f32(pos[3].x, pos[3].y, pos[3].z);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
}
|
|
|
|
GXEnd();
|
|
}
|
|
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
|
|
/* 80063670-8006444C 05DFB0 0DDC+00 1/0 1/1 0/0 .text dKyr_drawSun__FPA4_fP4cXyzR8_GXColorPPUc */
|
|
void dKyr_drawSun(Mtx drawMtx, cXyz* ppos, GXColor& unused, u8** tex) {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
cXyz pos[4];
|
|
cXyz sunpos;
|
|
cXyz spB4;
|
|
cXyz moon_pos;
|
|
cXyz sp9C;
|
|
|
|
Vec sp90, sp84;
|
|
|
|
dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket;
|
|
dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunLenzPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
f32 rot = 0.0f;
|
|
|
|
u8 draw_moon = false;
|
|
u8 draw_sun = false;
|
|
u16 date = dComIfGs_getDate();
|
|
|
|
#if VERSION == VERSION_GCN_JPN
|
|
if (g_env_light.hide_vrbox) {
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == 0) {
|
|
sun_packet->mMoonAlpha = 1.0f;
|
|
sun_packet->mSunAlpha = 0.0f;
|
|
}
|
|
|
|
if (sun_packet->mSunAlpha > 0.0f) {
|
|
draw_sun = true;
|
|
}
|
|
|
|
if (sun_packet->mMoonAlpha > 0.0f) {
|
|
draw_moon = true;
|
|
}
|
|
|
|
if ((draw_sun | draw_moon) != 0) {
|
|
sunpos.x = ppos->x;
|
|
sunpos.y = ppos->y;
|
|
sunpos.z = ppos->z;
|
|
|
|
u32 stage_type = dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo());
|
|
if (g_env_light.base_light.mColor.r == 0 && stage_type != ST_ROOM) {
|
|
if (g_env_light.daytime > 285.0f || g_env_light.daytime < 105.0f) {
|
|
draw_moon = false;
|
|
}
|
|
|
|
spB4.x = ppos->x;
|
|
spB4.y = ppos->y;
|
|
spB4.z = ppos->z;
|
|
} else {
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == 0 && dComIfG_play_c::getLayerNo(0) == 0) {
|
|
spB4 = envlight->moon_pos;
|
|
moon_pos = spB4;
|
|
} else {
|
|
spB4 = camera->lookat.eye + envlight->moon_pos;
|
|
moon_pos.x = spB4.x - camera->lookat.eye.x;
|
|
moon_pos.y = spB4.y - camera->lookat.eye.y;
|
|
moon_pos.z = spB4.z - camera->lookat.eye.z;
|
|
}
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP103") == 0 && dKy_daynight_check()) {
|
|
spB4.x = 3900.0f + camera->lookat.eye.x;
|
|
spB4.y = 8052.0f + camera->lookat.eye.y;
|
|
spB4.z = -9072.0f + camera->lookat.eye.z;
|
|
|
|
moon_pos.x = spB4.x - camera->lookat.eye.x;
|
|
moon_pos.y = spB4.y - camera->lookat.eye.y;
|
|
moon_pos.z = spB4.z - camera->lookat.eye.z;
|
|
}
|
|
|
|
int weekday = date % 8;
|
|
if (g_env_light.getDaytime() < 180.0f) {
|
|
if (weekday != 0) {
|
|
weekday--;
|
|
} else {
|
|
weekday = 7;
|
|
}
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == 0) {
|
|
if (g_env_light.getDaytime() < 180.0f) {
|
|
weekday++;
|
|
if (weekday >= 8) {
|
|
weekday = 0;
|
|
}
|
|
}
|
|
|
|
if (weekday == 4) {
|
|
weekday = 3;
|
|
}
|
|
}
|
|
|
|
if (weekday != 4) {
|
|
int texidx;
|
|
f32 flipX;
|
|
switch (weekday) {
|
|
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 = 0;
|
|
flipX = 1.0f;
|
|
break;
|
|
case 5:
|
|
texidx = 3;
|
|
flipX = -1.0f;
|
|
break;
|
|
case 6:
|
|
texidx = 2;
|
|
flipX = -1.0f;
|
|
break;
|
|
case 7:
|
|
default:
|
|
texidx = 1;
|
|
flipX = -1.0f;
|
|
break;
|
|
}
|
|
|
|
GXColor color_reg0;
|
|
color_reg0.r = g_env_light.fog_col.r;
|
|
color_reg0.g = g_env_light.fog_col.g;
|
|
color_reg0.b = g_env_light.fog_col.b;
|
|
color_reg0.a = 0xFF;
|
|
|
|
GXColor color_reg1;
|
|
color_reg1.r = 0;
|
|
color_reg1.g = 0;
|
|
color_reg1.b = 0;
|
|
color_reg1.a = 0xFF;
|
|
|
|
Mtx camMtx;
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
if (sun_packet->field_0x28 < 5) {
|
|
sun_packet->field_0x28 += 2;
|
|
}
|
|
sun_packet->field_0x29 = 1;
|
|
return;
|
|
}
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[0], GX_TEXMAP0);
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[1], GX_TEXMAP1);
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[texidx + 2], GX_TEXMAP2);
|
|
|
|
GXSetNumChans(0);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
GXSetNumTexGens(3);
|
|
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
|
GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
|
GXSetTexCoordGen(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
|
GXSetNumTevStages(3);
|
|
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
|
|
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_TEXC, 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_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL);
|
|
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
|
|
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD2, GX_TEXMAP2, GX_COLOR_NULL);
|
|
GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
|
|
GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX2, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX2, GX_DIRECT);
|
|
|
|
if (draw_moon == true) {
|
|
cXyz camfwd;
|
|
f32 dayscale[8] = {
|
|
1.0f, 0.83f, 0.6f, 0.78f,
|
|
1.0f, 0.78f, 0.6f, 0.83f,
|
|
};
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") != 0) {
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &camfwd);
|
|
f32 cam_distXZ = JMAFastSqrt((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 = JMAFastSqrt((moon_pos.x * moon_pos.x) + (moon_pos.z * moon_pos.z));
|
|
f32 moon_theta = atan2f(moon_pos.x, moon_pos.z);
|
|
f32 moon_phi = atan2f(moon_pos.y, moon_distXZ);
|
|
|
|
f32 sp3C = (moon_theta - cam_theta) / -(M_PI * 2);
|
|
rot = 45.0f + (360.0f * sp3C);
|
|
}
|
|
|
|
Mtx rotMtx;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
color_reg0.r = 0;
|
|
color_reg0.g = 0;
|
|
color_reg0.b = 0;
|
|
|
|
f32 size = 8000.0f;
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == NULL) {
|
|
size = 11000.0f;
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == NULL) {
|
|
size = 10000.0f;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP103") == 0 && dKy_daynight_check()) {
|
|
size = 1200.0f;
|
|
dEvent_manager_c* eventMng = &dComIfGp_getEventManager();
|
|
if (eventMng != NULL) {
|
|
if (strcmp(eventMng->getRunEventName(), "APPEAR_HAWKER") == 0) {
|
|
size = 2400.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
color_reg0.a = 255.0f * sun_packet->mMoonAlpha;
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
if (i == 1) {
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)lenz_packet->mpResBall);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
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_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
|
|
size *= 2.3f;
|
|
color_reg0.a = 40.0f * sun_packet->mMoonAlpha;
|
|
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xFF;
|
|
color_reg0.b = 0xCF;
|
|
|
|
color_reg1.r = 0xC5;
|
|
color_reg1.g = 0x69;
|
|
color_reg1.b = 0x23;
|
|
|
|
rot = (50.0f * flipX);
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
|
|
sp90.x = -size * flipX;
|
|
sp90.y = size;
|
|
sp90.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp90, &sp84);
|
|
pos[0].x = spB4.x + sp84.x;
|
|
pos[0].y = spB4.y + sp84.y;
|
|
pos[0].z = spB4.z + sp84.z;
|
|
|
|
sp90.x = size * flipX;
|
|
sp90.y = size;
|
|
sp90.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp90, &sp84);
|
|
pos[1].x = spB4.x + sp84.x;
|
|
pos[1].y = spB4.y + sp84.y;
|
|
pos[1].z = spB4.z + sp84.z;
|
|
|
|
if (i == 0) {
|
|
sp90.x = size * flipX;
|
|
sp90.y = -size;
|
|
} else {
|
|
sp90.x = (size * flipX) * dayscale[weekday];
|
|
sp90.y = -size * dayscale[weekday];
|
|
}
|
|
sp90.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp90, &sp84);
|
|
pos[2].x = spB4.x + sp84.x;
|
|
pos[2].y = spB4.y + sp84.y;
|
|
pos[2].z = spB4.z + sp84.z;
|
|
|
|
sp90.x = -size * flipX;
|
|
sp90.y = -size;
|
|
sp90.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp90, &sp84);
|
|
pos[3].x = spB4.x + sp84.x;
|
|
pos[3].y = spB4.y + sp84.y;
|
|
pos[3].z = spB4.z + sp84.z;
|
|
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
GXPosition3f32(pos[0].x, pos[0].y, pos[0].z);
|
|
GXTexCoord2s16(0, 0);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0, 0);
|
|
GXTexCoord2s16(0, 0);
|
|
}
|
|
|
|
GXPosition3f32(pos[1].x, pos[1].y, pos[1].z);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
}
|
|
|
|
GXPosition3f32(pos[2].x, pos[2].y, pos[2].z);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
}
|
|
|
|
GXPosition3f32(pos[3].x, pos[3].y, pos[3].z);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
if (i == 0) {
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
}
|
|
|
|
GXEnd();
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
|
|
dKyr_draw_rev_moon(drawMtx, tex);
|
|
}
|
|
}
|
|
}
|
|
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8006444C-8006562C 05ED8C 11E0+00 0/0 1/1 0/0 .text
|
|
* dKyr_drawLenzflare__FPA4_fP4cXyzR8_GXColorPPUc */
|
|
void dKyr_drawLenzflare(Mtx drawMtx, cXyz* ppos, GXColor& param_2, u8** tex) {
|
|
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);
|
|
|
|
static s16 S_rot_work1 = 0;
|
|
static s16 S_rot_work2 = 0;
|
|
|
|
#if VERSION == VERSION_GCN_JPN
|
|
if (g_env_light.hide_vrbox) {
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
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->field_0x74.r;
|
|
color_reg1.g = sun_packet->field_0x74.g;
|
|
color_reg1.b = sun_packet->field_0x74.b;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
j3dSys.reinitGX();
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[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);
|
|
GXSetFog(GX_FOG_NONE, 0.0f, 1.0f, 0.1f, 1.0f, color_reg0);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, 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);
|
|
dKr_cullVtx_Set();
|
|
|
|
MTXRotRad(rotMtx, 'Z', 0.0f);
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
if (sun_packet->field_0x6c > 0.0f) {
|
|
spC = S_rot_work1 - 0x7F6;
|
|
spA = S_rot_work2 + 0x416B;
|
|
S_rot_work1 += 8;
|
|
S_rot_work2 -= 14;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
}
|
|
|
|
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->field_0x6c * (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)) * (160.0f * sp6C * (2.9f + spAC));
|
|
sp70 *= 1.5f * sun_visibility;
|
|
|
|
if (i & 3) {
|
|
sp70 *= 0.86f;
|
|
if (i & 2) {
|
|
sp70 *= 2.46f;
|
|
}
|
|
}
|
|
|
|
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->x + spD8.x;
|
|
spF0.y = ppos->y + spD8.y;
|
|
spF0.z = ppos->z + spD8.z;
|
|
|
|
sp7C = spFC.abs(spF0);
|
|
if (sp7C < lenz_packet->field_0x8c) {
|
|
lenz_packet->field_0x8c = sp7C;
|
|
} else if (sp7C > lenz_packet->field_0x90) {
|
|
lenz_packet->field_0x90 = 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();
|
|
}
|
|
}
|
|
|
|
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);
|
|
GXSetFog(GX_FOG_NONE, 0.0f, 1.0f, 0.1f, 1.0f, color_reg0);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, 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);
|
|
dKr_cullVtx_Set();
|
|
|
|
static const f32 scale_dat[] = {
|
|
8000.0f, 10500.0f, 3.2f, 1.8f, 1.8f, 6.2f, 1.2f, 4.0f
|
|
};
|
|
|
|
static const GXColor col_dat[] = {
|
|
{0xB4, 0xC8, 0xFF, 0xFF},
|
|
{0xC8, 0xC8, 0xFF, 0x50},
|
|
{0xFF, 0x8C, 0x78, 0x5A},
|
|
{0xFF, 0xB4, 0x78, 0x64},
|
|
{0xB4, 0xB4, 0x78, 0x55},
|
|
{0xB4, 0xC8, 0x64, 0x5A},
|
|
{0xDC, 0xFF, 0xB4, 0x6E},
|
|
{0xC8, 0xDC, 0xFF, 0x5A},
|
|
};
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
if (!g_env_light.mpSunLenzPacket->mDrawLenzInSky || i == 0) {
|
|
f32 spC4 = spA8;
|
|
if (i < 2) {
|
|
if (i == 0) {
|
|
color_reg0.a = sun_packet->field_0x6c * (0.8f * (spC4 * col_dat[i].a));
|
|
} else {
|
|
color_reg0.a = sun_packet->field_0x6c * (0.2f * (spC4 * col_dat[i].a));
|
|
}
|
|
} else if (i == 2) {
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
GXColorS10 spD0;
|
|
spD0.r = 0.5f * sun_packet->mColor.r;
|
|
spD0.g = 0.5f * sun_packet->mColor.g;
|
|
spD0.b = 0.5f * sun_packet->mColor.b;
|
|
|
|
if (spD0.r > 0xFF) {
|
|
spD0.r = 0xFF;
|
|
}
|
|
if (spD0.g > 0xFF) {
|
|
spD0.g = 0xFF;
|
|
}
|
|
if (spD0.b > 0xFF) {
|
|
spD0.b = 0xFF;
|
|
}
|
|
|
|
GXColor sp60;
|
|
sp60.r = 0xFF;
|
|
sp60.g = 0xFF;
|
|
sp60.b = 0xFF;
|
|
|
|
f32 sp5C = 0.12f;
|
|
color_reg0.r = ((f32)spD0.r * (1.0f - sp5C)) + ((f32)sp60.r * sp5C);
|
|
color_reg0.g = ((f32)spD0.g * (1.0f - sp5C)) + ((f32)sp60.g * sp5C);
|
|
color_reg0.b = ((f32)spD0.b * (1.0f - sp5C)) + ((f32)sp60.b * sp5C);
|
|
|
|
spD0.r = 0.5f * sun_packet->field_0x74.r;
|
|
spD0.g = 0.5f * sun_packet->field_0x74.g;
|
|
spD0.b = 0.5f * sun_packet->field_0x74.b;
|
|
|
|
if (spD0.r > 0xFF) {
|
|
spD0.r = 0xFF;
|
|
}
|
|
if (spD0.g > 0xFF) {
|
|
spD0.g = 0xFF;
|
|
}
|
|
if (spD0.b > 0xFF) {
|
|
spD0.b = 0xFF;
|
|
}
|
|
|
|
color_reg1.r = spD0.r;
|
|
color_reg1.g = spD0.g;
|
|
color_reg1.b = spD0.b;
|
|
|
|
f32 sp58 = 1.0f - (spC4 * spAC);
|
|
sp58 = 1.0f - (sp58 * sp58 * sp58);
|
|
color_reg0.a = 140.0f * sp58;
|
|
color_reg1.a = 140.0f * sp58;
|
|
} else {
|
|
color_reg0.r = col_dat[i].r;
|
|
color_reg0.g = col_dat[i].g;
|
|
color_reg0.b = col_dat[i].b;
|
|
|
|
color_reg1.r = col_dat[i].r;
|
|
color_reg1.g = col_dat[i].g;
|
|
color_reg1.b = col_dat[i].b;
|
|
|
|
color_reg0.a = spAC * (0.5f * (250.0f * spC4) * lenz_packet->mDistFalloff);
|
|
color_reg1.a = spAC * (0.5f * (250.0f * spC4) * lenz_packet->mDistFalloff);
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
|
|
f32 var_f31;
|
|
if (i < 2) {
|
|
var_f31 = (0.04f + (0.075f * sun_visibility)) * scale_dat[i];
|
|
if (i == 0) {
|
|
var_f31 += 0.2f * (sun_visibility * (scale_dat[i] - 5000.0f)) * (spAC * spAC);
|
|
} else {
|
|
var_f31 += 0.2f * (sun_visibility * scale_dat[i]) * (spAC * spAC);
|
|
}
|
|
var_f31 = 0.85f * var_f31;
|
|
} else if (i == 2) {
|
|
var_f31 = 4000.0f;
|
|
} else {
|
|
var_f31 = 60.0f * (sun_visibility * scale_dat[i]) * (1.0f - (lenz_packet->mDistFalloff * lenz_packet->mDistFalloff * lenz_packet->mDistFalloff));
|
|
}
|
|
|
|
if (i == 1) {
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[2]);
|
|
} else if (i == 2) {
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[3]);
|
|
} else {
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[0]);
|
|
}
|
|
|
|
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 == 1) {
|
|
sp8 = 0x1FF;
|
|
} else {
|
|
sp8 = 0xFF;
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
dKy_GxFog_set();
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
|
|
/* 8006562C-80066048 05FF6C 0A1C+00 0/0 1/1 0/0 .text dKyr_drawRain__FPA4_fPPUc */
|
|
void dKyr_drawRain(Mtx drawMtx, u8** tex) {
|
|
dKankyo_rain_Packet* rain_packet = g_env_light.mpRainPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
cXyz wind_vecpow = dKyw_get_wind_vecpow();
|
|
|
|
static u32 rot = 0;
|
|
|
|
Mtx camMtx;
|
|
cXyz pos[4];
|
|
|
|
Vec sp54, sp48;
|
|
cXyz sp3C;
|
|
cXyz sp30;
|
|
|
|
if (g_env_light.mSnowCount == 0 && !g_env_light.camera_water_in_status) {
|
|
sp30.x = 0.0f;
|
|
sp30.y = -2.0f;
|
|
sp30.z = 0.0f;
|
|
|
|
if (rain_packet->raincnt != 0) {
|
|
GXColor color_reg0;
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xFF;
|
|
color_reg0.b = 0xFF;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[0]);
|
|
GXSetNumChans(0);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
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_ZERO, 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_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
dKr_cullVtx_Set();
|
|
|
|
Mtx rotMtx;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
for (int i = 0; i < rain_packet->raincnt; i++) {
|
|
f32 temp_f30 = -1.0f;
|
|
|
|
if (!(rain_packet->mRainEff[i].mAlpha <= 0.0f)) {
|
|
if (dKy_darkworld_check()) {
|
|
color_reg0.a = 34.0f * rain_packet->mRainEff[i].mAlpha;
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "D_MN07A") == 0) {
|
|
color_reg0.a = 9.0f * rain_packet->mRainEff[i].mAlpha;
|
|
} else {
|
|
color_reg0.a = 20.0f * rain_packet->mRainEff[i].mAlpha;
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
sp3C.x = rain_packet->mRainEff[i].mBasePos.x + rain_packet->mRainEff[i].mPosition.x;
|
|
sp3C.y = rain_packet->mRainEff[i].mBasePos.y + rain_packet->mRainEff[i].mPosition.y;
|
|
sp3C.z = rain_packet->mRainEff[i].mBasePos.z + rain_packet->mRainEff[i].mPosition.z;
|
|
|
|
f32 dist = 0.1f + (sp3C.abs(camera->lookat.eye) / 1500.0f);
|
|
if (dist > 1.0f) {
|
|
dist = 1.0f;
|
|
}
|
|
|
|
f32 temp_f31 = 1.5f;
|
|
cXyz tilt;
|
|
f32 speed = 5.0f + (70.0f * dist);
|
|
|
|
tilt.x = speed * (sp30.x + (0.08f * (i & 7)) + ((10.0f * (rain_packet->mCenterDelta.x * rain_packet->mCenterDeltaMul)) + (wind_vecpow.x * (1.0f + cM_rndF(0.25f)))));
|
|
tilt.y = speed * (sp30.y + ((rain_packet->mCenterDelta.y * rain_packet->mCenterDeltaMul) + (wind_vecpow.y * (1.0f + cM_rndF(0.25f)))));
|
|
tilt.z = speed * (sp30.z + (0.08f * (i & 3)) + ((10.0f * (rain_packet->mCenterDelta.z * rain_packet->mCenterDeltaMul)) + (wind_vecpow.z * (1.0f + cM_rndF(0.25f)))));
|
|
|
|
sp54.x = -temp_f31 * temp_f30;
|
|
sp54.y = 0.0f;
|
|
sp54.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp54, &sp48);
|
|
pos[0].x = (sp3C.x + sp48.x) - tilt.x;
|
|
pos[0].y = (sp3C.y + sp48.y) - tilt.y;
|
|
pos[0].z = (sp3C.z + sp48.z) - tilt.z;
|
|
|
|
sp54.x = temp_f31 * temp_f30;
|
|
sp54.y = 0.0f;
|
|
sp54.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp54, &sp48);
|
|
pos[1].x = (sp3C.x + sp48.x) - tilt.x;
|
|
pos[1].y = (sp3C.y + sp48.y) - tilt.y;
|
|
pos[1].z = (sp3C.z + sp48.z) - tilt.z;
|
|
|
|
sp54.x = temp_f31 * temp_f30;
|
|
sp54.y = 0.0f;
|
|
sp54.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp54, &sp48);
|
|
pos[2].x = sp3C.x + sp48.x;
|
|
pos[2].y = sp3C.y + sp48.y;
|
|
pos[2].z = sp3C.z + sp48.z;
|
|
|
|
sp54.x = -temp_f31 * temp_f30;
|
|
sp54.y = 0.0f;
|
|
sp54.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp54, &sp48);
|
|
pos[3].x = sp3C.x + sp48.x;
|
|
pos[3].y = sp3C.y + sp48.y;
|
|
pos[3].z = sp3C.z + sp48.z;
|
|
|
|
for (int j = 0; j < 4; j++) {
|
|
static cXyz add_table[] = {
|
|
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);
|
|
GXPosition3f32(pos[0].x + add_table[j].x, pos[0].y + add_table[j].y, pos[0].z + add_table[j].z);
|
|
GXTexCoord2s16(0, 0);
|
|
GXPosition3f32(pos[1].x + add_table[j].x, pos[1].y + add_table[j].y, pos[1].z + add_table[j].z);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXPosition3f32(pos[2].x + add_table[j].x, pos[2].y + add_table[j].y, pos[2].z + add_table[j].z);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXPosition3f32(pos[3].x + add_table[j].x, pos[3].y + add_table[j].y, pos[3].z + add_table[j].z);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXEnd();
|
|
}
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80066048-8006653C 060988 04F4+00 0/0 1/1 0/0 .text dKyr_drawSibuki__FPA4_fPPUc */
|
|
void dKyr_drawSibuki(Mtx drawMtx, u8** tex) {
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
dKankyo_rain_Packet* rain_packet = g_env_light.mpRainPacket;
|
|
cXyz eyevect;
|
|
cXyz sp38;
|
|
|
|
if (g_env_light.mSnowCount == 0 && g_env_light.camera_water_in_status == 0 && dComIfGd_getView() != NULL) {
|
|
Mtx camMtx;
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP113") == 0 && dComIfGp_roomControl_getStayNo() == 1) {
|
|
if ((camera->lookat.eye.z < 5100.0f || (camera->lookat.eye.x < -3250.0f && camera->lookat.eye.y < -50.0f)) ||
|
|
(camera->lookat.eye.x < -2700.0f && camera->lookat.eye.z > 15750.0f))
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
f32 alpha = 255.0f;
|
|
if (rain_packet->mStatus & 1) {
|
|
alpha = 0.0f;
|
|
} else if (rain_packet->mStatus & 2) {
|
|
alpha = 200.0f;
|
|
}
|
|
|
|
cLib_addCalc(&rain_packet->mSibukiAlpha, alpha, 0.2f, 30.0f, 0.001f);
|
|
dKy_set_eyevect_calc(camera, &eyevect, 7000.0f, 4000.0f);
|
|
cXyz camdir;
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &camdir);
|
|
|
|
f32 alphaFade = 0.0f;
|
|
if (camdir.y > alphaFade) {
|
|
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 = rain_packet->mSibukiAlpha * alphaFade;
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[1]);
|
|
GXSetNumChans(0);
|
|
GXSetTevColor(GX_TEVREG0, color);
|
|
GXSetTevColor(GX_TEVREG1, color);
|
|
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_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZMode(GX_TRUE, GX_GEQUAL, GX_FALSE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
dKr_cullVtx_Set();
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
f32 scale;
|
|
if (dComIfGd_getView() != NULL) {
|
|
scale = dComIfGd_getView()->fovy / 45.0f;
|
|
scale *= scale;
|
|
if (scale >= 1.0f) {
|
|
scale = 1.0f;
|
|
}
|
|
} else {
|
|
scale = 0.2f;
|
|
}
|
|
|
|
for (int i = 0; i < g_env_light.raincnt >> 1; i++) {
|
|
cXyz pos[4];
|
|
f32 size = scale * (15.0f + cM_rndF(10.0f));
|
|
cXyz sp20;
|
|
|
|
f32 local_x = cM_rndFX(3600.0f);
|
|
f32 local_y = cM_rndFX(1500.0f);
|
|
f32 local_z = cM_rndFX(3600.0f);
|
|
|
|
sp20.x = eyevect.x + local_x;
|
|
sp20.y = eyevect.y + local_y;
|
|
sp20.z = eyevect.z + local_z;
|
|
|
|
pos[0].x = sp20.x - size;
|
|
pos[0].y = sp20.y;
|
|
pos[0].z = sp20.z - size;
|
|
|
|
pos[1].x = sp20.x + size;
|
|
pos[1].y = sp20.y;
|
|
pos[1].z = sp20.z - size;
|
|
|
|
pos[2].x = sp20.x + size;
|
|
pos[2].y = sp20.y;
|
|
pos[2].z = sp20.z + size;
|
|
|
|
pos[3].x = sp20.x - size;
|
|
pos[3].y = sp20.y;
|
|
pos[3].z = sp20.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();
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
|
|
/* 8006653C-80067488 060E7C 0F4C+00 0/0 1/1 0/0 .text dKyr_drawHousi__FPA4_fPPUc */
|
|
void dKyr_drawHousi(Mtx drawMtx, u8** tex) {
|
|
dKankyo_housi_Packet* housi_packet = g_env_light.mpHousiPacket;
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
cXyz pos[4];
|
|
GXTexObj spDC;
|
|
cXyz spD0;
|
|
Vec spC4;
|
|
Vec spB8;
|
|
|
|
bool var_r28 = 0;
|
|
if (housi_packet->field_0x5dec != 0) {
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN08") == 0) {
|
|
var_r28 = 1;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN08") != 0 ||
|
|
dComIfGp_roomControl_getStayNo() == 0 || dComIfGp_roomControl_getStayNo() == 11)
|
|
{
|
|
j3dSys.reinitGX();
|
|
f32 var_f25 = 120.0f;
|
|
|
|
if (g_env_light.field_0xea9 == 1) {
|
|
var_f25 = 140.0f;
|
|
} else if (g_env_light.camera_water_in_status != 0) {
|
|
return;
|
|
}
|
|
|
|
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 (dKy_darkworld_check() == 1 || var_r28 == 1) {
|
|
color_reg0.r = 0;
|
|
color_reg0.g = 0;
|
|
color_reg0.b = 0;
|
|
color_reg0.a = var_f25;
|
|
|
|
color_reg1.r = 0;
|
|
color_reg1.g = 0;
|
|
color_reg1.b = 0;
|
|
color_reg1.a = 0xFF;
|
|
|
|
var_f25 = 255.0f;
|
|
} else if (g_env_light.field_0xea9 == 1) {
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xFF;
|
|
color_reg0.b = 0xFF;
|
|
|
|
color_reg1.r = 0;
|
|
color_reg1.g = 0x50;
|
|
color_reg1.b = 0x50;
|
|
} else if (g_env_light.field_0xea9 == 2 &&
|
|
(g_env_light.fishing_hole_season == 1 || g_env_light.fishing_hole_season == 3))
|
|
{
|
|
GXColor sp1C = {0x32, 0x32, 0x32, 0xFF};
|
|
GXColor sp18 = {0xFF, 0xD7, 0xF0, 0xFF};
|
|
|
|
camera_class* cam_p = dComIfGp_getCamera(0);
|
|
if (g_env_light.fishing_hole_season == 3) {
|
|
sp1C.r = 0x78;
|
|
sp1C.g = 0x0A;
|
|
sp1C.b = 0x14;
|
|
|
|
sp18.r = 0x14;
|
|
sp18.g = 0x3C;
|
|
sp18.b = 0x00;
|
|
}
|
|
|
|
dKy_ParticleColor_get_bg(&cam_p->lookat.eye, NULL, &color_reg1, &color_reg0, &sp1C, &sp18,
|
|
0.0f);
|
|
var_f25 = 255.0f;
|
|
}
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
f32 temp_f26 = 1.2f;
|
|
f32 temp_f24 = 6.5f;
|
|
|
|
for (int i = 0; i < 1; i++) {
|
|
dKyr_set_btitex(&spDC, (ResTIMG*)*tex);
|
|
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);
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_NW01") == 0 ||
|
|
g_env_light.field_0xea9 == 1)
|
|
{
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
} else {
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA,
|
|
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);
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
dKr_cullVtx_Set();
|
|
|
|
rot += 1.2f;
|
|
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->field_0x5dec; j++) {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
spD0.x =
|
|
housi_packet->mHousiEff[j].mBasePos.x + housi_packet->mHousiEff[j].mPosition.x;
|
|
spD0.y =
|
|
housi_packet->mHousiEff[j].mBasePos.y + housi_packet->mHousiEff[j].mPosition.y;
|
|
spD0.z =
|
|
housi_packet->mHousiEff[j].mBasePos.z + housi_packet->mHousiEff[j].mPosition.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->mHousiEff[j].mAlpha <= 0.0f)) {
|
|
color_reg0.a =
|
|
housi_packet->mHousiEff[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->mHousiEff[j].mAlpha * var_f25;
|
|
|
|
block_14:
|
|
GXLoadTexObj(&spDC, GX_TEXMAP0);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
f32 var_f27 = housi_packet->mHousiEff[j].field_0x48 * 9.0f;
|
|
if (g_env_light.field_0xea9 == 1) {
|
|
var_f27 = housi_packet->mHousiEff[j].field_0x48 * 18.0f;
|
|
}
|
|
|
|
f32 temp_f28 =
|
|
(var_f27 * 0.2f) * cM_fsin(housi_packet->mHousiEff[j].mScale.x * 5.0f);
|
|
f32 temp_f30 =
|
|
(var_f27 * 0.2f) * cM_fcos(housi_packet->mHousiEff[j].mScale.y * 6.0f);
|
|
|
|
if (dKy_darkworld_check() == 1 || var_r28 == 1) {
|
|
cXyz sp7C[] = {
|
|
cXyz(-1.0f, -0.5f, 0.0f),
|
|
cXyz(-1.0f, 1.5f, 0.0f),
|
|
cXyz(1.0f, 1.5f, 0.0f),
|
|
cXyz(1.0f, -0.5f, 0.0f),
|
|
};
|
|
|
|
for (int k = 0; k < 4; k++) {
|
|
cXyz spAC;
|
|
cXyz spA0;
|
|
|
|
f32 temp_f26_2 = cM_ssin((f32)j * 123.0f + (f32)(g_Counter.mCounter0 * 600));
|
|
|
|
cXyz* temp_r3 = &sp7C[k];
|
|
spAC.x = temp_r3->x * (8.0f * (1.0f + (temp_f26_2 * 0.3f)));
|
|
spAC.y = temp_r3->y * (8.0f * (1.0f + (temp_f26_2 * 0.3f)));
|
|
spAC.z = temp_r3->z * (8.0f * (1.0f + (temp_f26_2 * 0.3f)));
|
|
|
|
mDoMtx_stack_c::transS(spD0.x, spD0.y, spD0.z);
|
|
mDoMtx_stack_c::YrotM(temp_f26_2 * 65536.0f);
|
|
mDoMtx_stack_c::multVec(&spAC, &spA0);
|
|
pos[k] = spA0;
|
|
}
|
|
} else if (g_env_light.field_0xea9 == 2) {
|
|
cXyz sp4C[] = {
|
|
cXyz(-1.0f, -0.9f, 0.0f),
|
|
cXyz(-1.0f, 1.1f, 0.0f),
|
|
cXyz(1.0f, 1.1f, 0.0f),
|
|
cXyz(1.0f, -0.9f, 0.0f),
|
|
};
|
|
|
|
for (int k = 0; k < 4; k++) {
|
|
cXyz sp94;
|
|
cXyz sp88;
|
|
|
|
f32 var_f24;
|
|
if (housi_packet->mHousiEff[j].mStatus == 1 ||
|
|
housi_packet->mHousiEff[j].mStatus == 3)
|
|
{
|
|
var_f24 =
|
|
0.2f +
|
|
(housi_packet->mHousiEff[j].field_0x34 *
|
|
(fabsf(cM_ssin((f32)j * 213.0f +
|
|
(f32)(g_Counter.mCounter0 * 330))) *
|
|
0.8f));
|
|
} else {
|
|
var_f24 = cM_ssin((f32)j * 123.0f +
|
|
(f32)(g_Counter.mCounter0 * 80));
|
|
}
|
|
|
|
f32 var_f2;
|
|
if (g_env_light.fishing_hole_season == 3) {
|
|
var_f2 = 15.0f;
|
|
|
|
if (housi_packet->mHousiEff[j].mStatus == 1) {
|
|
var_f24 =
|
|
housi_packet->mHousiEff[j].field_0x34 *
|
|
fabsf(cM_ssin((f32)j * 250.0f +
|
|
(f32)(g_Counter.mCounter0 * 88)));
|
|
} else {
|
|
var_f24 = cM_ssin((f32)j * 685.0f +
|
|
(f32)(g_Counter.mCounter0 * 20));
|
|
}
|
|
} else {
|
|
var_f2 = 6.0f;
|
|
}
|
|
|
|
cXyz* temp_r3_2 = &sp4C[k];
|
|
sp94.x = temp_r3_2->x * (var_f2 * (1.0f + (var_f24 * 0.3f)));
|
|
sp94.y = temp_r3_2->y * (var_f2 * (1.0f + (var_f24 * 0.3f)));
|
|
sp94.z = temp_r3_2->z * (var_f2 * (1.0f + (var_f24 * 0.3f)));
|
|
mDoMtx_stack_c::transS(spD0.x, spD0.y, spD0.z);
|
|
|
|
if (housi_packet->mHousiEff[j].mStatus == 1 ||
|
|
housi_packet->mHousiEff[j].mStatus == 3)
|
|
{
|
|
housi_packet->mHousiEff[j].field_0x38 +=
|
|
483.0f * (0.5f + (var_f24 * 0.5f));
|
|
|
|
housi_packet->mHousiEff[j].field_0x44 =
|
|
(s16)housi_packet->mHousiEff[j].field_0x38;
|
|
mDoMtx_stack_c::YrotM(housi_packet->mHousiEff[j].field_0x38);
|
|
mDoMtx_stack_c::XrotM(housi_packet->mHousiEff[j].field_0x38);
|
|
mDoMtx_stack_c::ZrotM(housi_packet->mHousiEff[j].field_0x38);
|
|
} else {
|
|
if (housi_packet->mHousiEff[j].mStatus == 2) {
|
|
if (g_env_light.fishing_hole_season == 3) {
|
|
housi_packet->mHousiEff[j].field_0x38 += var_f24 * 30.0f;
|
|
} else {
|
|
housi_packet->mHousiEff[j].field_0x38 +=
|
|
var_f24 * 100.0f;
|
|
}
|
|
}
|
|
|
|
if (housi_packet->mHousiEff[j].field_0x38 > 32765.0f) {
|
|
cLib_addCalc(&housi_packet->mHousiEff[j].field_0x44,
|
|
-16384.0f, 0.1f, 500.0f, 0.0001f);
|
|
} else {
|
|
cLib_addCalc(&housi_packet->mHousiEff[j].field_0x44,
|
|
16384.0f, 0.1f, 500.0f, 0.0001f);
|
|
}
|
|
|
|
mDoMtx_stack_c::YrotM(housi_packet->mHousiEff[j].field_0x38);
|
|
mDoMtx_stack_c::XrotM(housi_packet->mHousiEff[j].field_0x44);
|
|
mDoMtx_stack_c::ZrotM(housi_packet->mHousiEff[j].field_0x38);
|
|
}
|
|
|
|
mDoMtx_stack_c::multVec(&sp94, &sp88);
|
|
pos[k] = sp88;
|
|
}
|
|
} else {
|
|
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;
|
|
if (dKy_darkworld_check() == true || var_r28 == 1) {
|
|
var_r17 = 0xFA;
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80067488-800685DC 061DC8 1154+00 0/0 1/1 0/0 .text dKyr_drawSnow__FPA4_fPPUc */
|
|
void dKyr_drawSnow(Mtx drawMtx, u8** tex) {
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
dKankyo_snow_Packet* snow_packet = g_env_light.mpSnowPacket;
|
|
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
cXyz pos[4];
|
|
|
|
Vec sp94, sp88;
|
|
cXyz sp7C;
|
|
|
|
u8 spC = 1;
|
|
GXColor color_reg0;
|
|
GXColor color_reg1;
|
|
|
|
GXColor sp64;
|
|
GXColor sp60;
|
|
GXColor sp5C = {0xFF, 0xFF, 0xFF, 0xFF};
|
|
GXColor sp58 = {0xFF, 0xFF, 0xFF, 0xFF};
|
|
int sp54;
|
|
int sp4C = 0;
|
|
|
|
static cXyz add_table[] = {
|
|
cXyz(0.0f, 0.0f, 0.0f),
|
|
cXyz(50.0f, 50.0f, 50.0f),
|
|
cXyz(-50.0f, 20.0f, 50.0f),
|
|
cXyz(-50.0f, -20.0f, -50.0f),
|
|
};
|
|
|
|
static f32 S_fubuki_ratio = 0.0f;
|
|
|
|
if (camera != NULL) {
|
|
j3dSys.reinitGX();
|
|
if (snow_packet->field_0x6d88 != 0 || g_env_light.field_0xe90 != 0) {
|
|
if (snow_packet->field_0x6d88 == 0) {
|
|
sp54 = g_env_light.field_0xe90 * 10;
|
|
sp4C = 1;
|
|
} else {
|
|
sp54 = snow_packet->field_0x6d88;
|
|
}
|
|
|
|
if (!g_env_light.camera_water_in_status) {
|
|
dKy_ParticleColor_get_bg(&camera->lookat.eye, NULL, &sp64, &sp60, &sp5C, &sp58, 0.0f);
|
|
color_reg0.r = 178.5f + (0.3f * sp60.r);
|
|
color_reg0.g = 178.5f + (0.3f * sp60.g);
|
|
color_reg0.b = 178.5f + (0.3f * sp60.b);
|
|
|
|
color_reg1.r = 127.5f + (0.5f * sp60.r);
|
|
color_reg1.g = 127.5f + (0.5f * sp60.g);
|
|
color_reg1.b = 127.5f + (0.5f * sp60.b);
|
|
|
|
color_reg0.a = 120;
|
|
color_reg1.a = 120;
|
|
|
|
f32 sp6C = 4.0f;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (tex[0] != NULL) {
|
|
GXTexObj spA0;
|
|
dKyr_set_btitex(&spA0, (ResTIMG*)tex[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_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
dKr_cullVtx_Set();
|
|
|
|
Mtx rotMtx;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
|
|
rot += 5.0f + cM_rndFX(2.0f);
|
|
if (rot > 719.0f) {
|
|
rot = 0.0f;
|
|
}
|
|
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
if (g_env_light.field_0xe92 == 0 && sp4C == 0) {
|
|
cLib_addCalc(&S_fubuki_ratio, 0.0f, 0.25f, 0.1f, 0.001f);
|
|
if (S_fubuki_ratio > 0.0f) {
|
|
spC = 2;
|
|
}
|
|
} else {
|
|
if (g_env_light.field_0xe92) {
|
|
spC = 2;
|
|
}
|
|
cLib_addCalc(&S_fubuki_ratio, 1.0f, 0.25f, 0.1f, 0.001f);
|
|
}
|
|
|
|
f32 sp50;
|
|
if (dComIfGd_getView() != NULL) {
|
|
sp50 = dComIfGd_getView()->fovy / 45.0f;
|
|
if (sp50 >= 1.0f) {
|
|
sp50 = 1.0f;
|
|
}
|
|
} else {
|
|
sp50 = 1.0f;
|
|
}
|
|
|
|
for (int i = 0; i < sp54; i++) {
|
|
for (int j = 0; j < 2; j++) {
|
|
f32 sp44 = -1.0f;
|
|
if (g_env_light.mpSnowPacket->mSnowEff[i].mStatus != 0) {
|
|
f32 var_f30;
|
|
f32 temp_f29;
|
|
f32 temp_f31 = 1.5f + (((i & 15) / 15.0f) * cM_ssin(g_Counter.mCounter0));
|
|
temp_f29 = 0.3f * ((i & 15) / 15.0f);
|
|
|
|
color_reg0.r = (255.0f * temp_f29) + (sp60.r * (1.0f - temp_f29));
|
|
color_reg0.g = (255.0f * temp_f29) + (sp60.g * (1.0f - temp_f29));
|
|
color_reg0.b = (255.0f * temp_f29) + (sp60.b * (1.0f - temp_f29));
|
|
|
|
f32 sp40, sp3C;
|
|
if (j == 0) {
|
|
sp7C = snow_packet->mSnowEff[i].mPosition;
|
|
sp40 = snow_packet->mSnowEff[i].mScale * snow_packet->mSnowEff[i].mScale;
|
|
sp3C = (snow_packet->mSnowEff[i].mScale - sp40) + snow_packet->mSnowEff[i].mScale;
|
|
|
|
color_reg0.a = 180.0f * ((snow_packet->mSnowEff[i].mScale * 0.8f) + temp_f29);
|
|
} else {
|
|
sp7C = snow_packet->mSnowEff[i].mBasePos;
|
|
sp40 = snow_packet->mSnowEff[i].field_0x30 * snow_packet->mSnowEff[i].field_0x30;
|
|
sp3C = (snow_packet->mSnowEff[i].field_0x30 - sp40) + snow_packet->mSnowEff[i].field_0x30;
|
|
|
|
color_reg0.a = S_fubuki_ratio * (220.0f * ((0.8f * (snow_packet->mSnowEff[i].field_0x30)) + temp_f29));
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN11") == 0) {
|
|
if (dComIfGp_roomControl_getStayNo() == 4) {
|
|
if ((sp7C.x > 2079.0f && sp7C.x < 3013.0f && sp7C.y < 864.0f && sp7C.z > -6000.0f && sp7C.z < -4145.0f) ||
|
|
sp7C.x < -2960.0f || sp7C.z > -880.0f || sp7C.z < -6000.0f ||
|
|
(sp7C.z < -4920.0f && sp7C.y < 864.0f && sp7C.x < -2000.0f))
|
|
{
|
|
continue;
|
|
}
|
|
} else if (snow_packet->field_0x6d88 != 0) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
f32 sp38 = 2.0f * (i / 500.0f) * snow_packet->field_0x6d80;
|
|
f32 sp68 = sp50 * (camera->lookat.eye.abs(sp7C) / 1000.0f);
|
|
if (sp68 > 1.0f) {
|
|
sp68 = 1.0f;
|
|
}
|
|
|
|
if (g_env_light.field_0xe92 == 0) {
|
|
var_f30 = sp68 * (sp3C * (sp6C + (int)(10.0f * ((i & 15) / 15.0f))));
|
|
} else {
|
|
var_f30 = sp68 * (sp3C * (sp6C + (int)(14.0f * ((i & 15) / 15.0f))));
|
|
}
|
|
|
|
sp94.x = -var_f30 * sp44;
|
|
sp94.y = var_f30 - sp38;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[0].x = sp7C.x + sp88.x;
|
|
pos[0].y = sp7C.y + sp88.y;
|
|
pos[0].z = sp7C.z + sp88.z;
|
|
|
|
sp94.x = var_f30 * sp44;
|
|
sp94.y = var_f30;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[1].x = sp7C.x + sp88.x;
|
|
pos[1].y = sp7C.y + sp88.y;
|
|
pos[1].z = sp7C.z + sp88.z;
|
|
|
|
sp94.x = var_f30 * sp44;
|
|
sp94.y = -var_f30;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[2].x = sp7C.x + sp88.x;
|
|
pos[2].y = sp7C.y + sp88.y;
|
|
pos[2].z = sp7C.z + sp88.z;
|
|
|
|
sp94.x = -var_f30 * sp44;
|
|
sp94.y = -var_f30 - sp38;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[3].x = sp7C.x + sp88.x;
|
|
pos[3].y = sp7C.y + sp88.y;
|
|
pos[3].z = sp7C.z + sp88.z;
|
|
|
|
for (int k = 0; k < spC; k++) {
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
GXPosition3f32(pos[0].x + (temp_f31 * add_table[k].x), pos[0].y + (temp_f31 * add_table[k].y), pos[0].z + (temp_f31 * add_table[k].z));
|
|
GXTexCoord2s16(0, 0);
|
|
GXPosition3f32(pos[1].x + (temp_f31 * add_table[k].x), pos[1].y + (temp_f31 * add_table[k].y), pos[1].z + (temp_f31 * add_table[k].z));
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXPosition3f32(pos[2].x + (temp_f31 * add_table[k].x), pos[2].y + (temp_f31 * add_table[k].y), pos[2].z + (temp_f31 * add_table[k].z));
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXPosition3f32(pos[3].x + (temp_f31 * add_table[k].x), pos[3].y + (temp_f31 * add_table[k].y), pos[3].z + (temp_f31 * add_table[k].z));
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXEnd();
|
|
}
|
|
|
|
if ((g_env_light.field_0xe90 != 0 && dComIfGp_roomControl_getStayNo() == 0 && sp7C.z < 3000.0f) || dComIfGp_roomControl_getStayNo() == 3 || dComIfGp_roomControl_getStayNo() == 6 || dComIfGp_roomControl_getStayNo() == 9 || dComIfGp_roomControl_getStayNo() == 13) {
|
|
color_reg0.a = 255.0f * ((0.4f * snow_packet->mSnowEff[i].field_0x30) + temp_f29);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
f32 sp34;
|
|
f32 sp30;
|
|
if (dComIfGp_roomControl_getStayNo() == 0) {
|
|
sp30 = -24.0f;
|
|
} else if (dComIfGp_roomControl_getStayNo() == 6) {
|
|
sp30 = 952.0f;
|
|
} else if (dComIfGp_roomControl_getStayNo() == 3) {
|
|
sp30 = -24.0f;
|
|
} else if (dComIfGp_roomControl_getStayNo() == 9) {
|
|
sp30 = -52.0f;
|
|
} else if (dComIfGp_roomControl_getStayNo() == 13) {
|
|
sp30 = 2.0f;
|
|
} else {
|
|
sp30 = 0.0f;
|
|
}
|
|
|
|
sp34 = sp7C.y - sp30;
|
|
sp34 = sp30 - sp34;
|
|
|
|
sp94.x = -var_f30 * sp44;
|
|
sp94.y = var_f30 - sp38;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[0].x = sp7C.x + sp88.x;
|
|
pos[0].y = sp34 + sp88.y;
|
|
pos[0].z = sp7C.z + sp88.z;
|
|
|
|
sp94.x = (var_f30 * sp44);
|
|
sp94.y = var_f30;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[1].x = sp7C.x + sp88.x;
|
|
pos[1].y = sp34 + sp88.y;
|
|
pos[1].z = sp7C.z + sp88.z;
|
|
|
|
sp94.x = (var_f30 * sp44);
|
|
sp94.y = -var_f30;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[2].x = sp7C.x + sp88.x;
|
|
pos[2].y = sp34 + sp88.y;
|
|
pos[2].z = sp7C.z + sp88.z;
|
|
|
|
sp94.x = (-var_f30 * sp44);
|
|
sp94.y = (-var_f30 - sp38);
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[3].x = sp7C.x + sp88.x;
|
|
pos[3].y = sp34 + sp88.y;
|
|
pos[3].z = sp7C.z + sp88.z;
|
|
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
int var_r27 = 0;
|
|
GXPosition3f32(pos[0].x + (temp_f31 * add_table[var_r27].x), pos[0].y + (temp_f31 * add_table[var_r27].y), pos[0].z + (temp_f31 * add_table[var_r27].z));
|
|
GXTexCoord2s16(0, 0);
|
|
GXPosition3f32(pos[1].x + (temp_f31 * add_table[var_r27].x), pos[1].y + (temp_f31 * add_table[var_r27].y), pos[1].z + (temp_f31 * add_table[var_r27].z));
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXPosition3f32(pos[2].x + (temp_f31 * add_table[var_r27].x), pos[2].y + (temp_f31 * add_table[var_r27].y), pos[2].z + (temp_f31 * add_table[var_r27].z));
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXPosition3f32(pos[3].x + (temp_f31 * add_table[var_r27].x), pos[3].y + (temp_f31 * add_table[var_r27].y), pos[3].z + (temp_f31 * add_table[var_r27].z));
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXEnd();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 800685DC-8006950C 062F1C 0F30+00 0/0 1/1 0/0 .text dKyr_drawStar__FPA4_fPPUc */
|
|
void dKyr_drawStar(Mtx drawMtx, u8** tex) {
|
|
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 f32 rot = 0.0f;
|
|
|
|
cXyz pos[4];
|
|
|
|
Mtx camMtx;
|
|
cXyz spBC;
|
|
cXyz moon_proj;
|
|
cXyz star_proj;
|
|
|
|
Vec sp98, sp8C;
|
|
cXyz moon_pos;
|
|
|
|
u8 gwolf_howl_stage = false;
|
|
u8 draw_mirrored = false;
|
|
BOOL sp38 = false;
|
|
|
|
// Cassiopeia and Orion constellation positions
|
|
static csXyz hokuto_position[] = {
|
|
csXyz(15283, 31005, -17919),
|
|
csXyz(13525, 28369, -22265),
|
|
csXyz(8300, 31884, -20507),
|
|
csXyz(3906, 31005, -23144),
|
|
csXyz(-439, 30127, -17919),
|
|
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 VERSION == VERSION_GCN_JPN
|
|
if (g_env_light.hide_vrbox) {
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
if (star_packet->mEffectNum != 0) {
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == 0 && dComIfG_play_c::getLayerNo(0) == 0) {
|
|
gwolf_howl_stage = true;
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0 ||
|
|
((strcmp(dComIfGp_getStartStageName(), "F_SP103") == 0) && dComIfGp_roomControl_getStayNo() == 0))
|
|
{
|
|
// draw stars on the opposite skybox hemisphere as well for water reflections
|
|
draw_mirrored = true;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP103") == 0 && dKy_daynight_check()) {
|
|
sp38 = true;
|
|
}
|
|
|
|
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_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "F_SP200") == 0 && dComIfG_play_c::getLayerNo(0) == 0) {
|
|
moon_pos = envlight->moon_pos;
|
|
} else {
|
|
moon_pos = camera->lookat.eye + envlight->moon_pos;
|
|
if (sp38) {
|
|
moon_pos.x = 3900.0f + camera->lookat.eye.x;
|
|
moon_pos.y = 8052.0f + camera->lookat.eye.y;
|
|
moon_pos.z = -9072.0f + camera->lookat.eye.z;
|
|
}
|
|
}
|
|
|
|
mDoLib_project(&moon_pos, &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_SRCALPHA, GX_BL_INVSRCALPHA, 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 += 0.65f;
|
|
if (rot > 719.0f) {
|
|
rot = 0.0f;
|
|
}
|
|
|
|
spBC.x = camera->lookat.eye.x;
|
|
spBC.y = camera->lookat.eye.y;
|
|
spBC.z = camera->lookat.eye.z;
|
|
|
|
f32 sp34 = -1.0f;
|
|
int sp30 = 0;
|
|
f32 var_f30 = 0.0f;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
var_f30 = dComIfGd_getView()->fovy / 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 var_f31;
|
|
cXyz star_pos;
|
|
f32 sp2C = 300.0f;
|
|
|
|
if (i < 13) {
|
|
star_pos.x = hokuto_position[i].x;
|
|
star_pos.y = hokuto_position[i].y;
|
|
star_pos.z = hokuto_position[i].z;
|
|
|
|
if (i <= 4) {
|
|
var_f31 = 540.0f + star_packet->mEffect[0].field_0x28;
|
|
} else {
|
|
var_f31 = 400.0f + star_packet->mEffect[0].field_0x28;
|
|
}
|
|
var_f31 -= var_f30 * (0.5f * var_f31);
|
|
|
|
color_reg0.r = 0xA0;
|
|
color_reg0.g = 0x8C;
|
|
color_reg0.b = 0x96;
|
|
color_reg0.a = 0xC3;
|
|
} else {
|
|
var_f31 = 0.8f + (star_packet->mEffect[0].field_0x28 * (0.03125f * (i & 31)));
|
|
f32 temp_f29 = 1.0f - (0.004950495f * var_f28);
|
|
|
|
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 / 1200.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},
|
|
};
|
|
|
|
color_reg0 = star_col[i & 3];
|
|
color_reg0.a = 70.0f + ((i & 63) * 2);
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
cXyz sp68;
|
|
cXyz sp5C;
|
|
u16 date = dComIfGs_getDate();
|
|
sp68.x = spBC.x + star_pos.x;
|
|
sp68.y = spBC.y + star_pos.y;
|
|
sp68.z = spBC.z + star_pos.z;
|
|
|
|
mDoLib_project(&sp68, &star_proj);
|
|
|
|
moon_proj.z = 0.0f;
|
|
star_proj.z = 0.0f;
|
|
f32 moon_dist_to_star = moon_proj.abs(star_proj);
|
|
|
|
f32 moon_threshold;
|
|
if (gwolf_howl_stage) {
|
|
moon_threshold = 180.0f + (700.0f * (var_f30 * var_f30));
|
|
} else {
|
|
moon_threshold = 80.0f + (700.0f * (var_f30 * var_f30));
|
|
}
|
|
|
|
int weekday = date % 8;
|
|
if (g_env_light.getDaytime() < 180.0f) {
|
|
if (weekday != 0) {
|
|
weekday--;
|
|
} else {
|
|
weekday = 7;
|
|
}
|
|
}
|
|
|
|
if (weekday == 4 && !gwolf_howl_stage) {
|
|
// it's a New Moon, so no threshold needed
|
|
moon_threshold = 0.0f;
|
|
}
|
|
|
|
// if a star is too close to the moon then avoid drawing
|
|
if (moon_dist_to_star > moon_threshold) {
|
|
GXBegin(GX_TRIANGLES, GX_VTXFMT0, 3);
|
|
GXPosition3f32(sp68.x + (var_f31 * (pos[0].x - spBC.x)), sp68.y + (var_f31 * (pos[0].y - spBC.y)), sp68.z + (var_f31 * (pos[0].z - spBC.z)));
|
|
GXPosition3f32(sp68.x + (var_f31 * (pos[1].x - spBC.x)), sp68.y + (var_f31 * (pos[1].y - spBC.y)), sp68.z + (var_f31 * (pos[1].z - spBC.z)));
|
|
GXPosition3f32(sp68.x + (var_f31 * (pos[2].x - spBC.x)), sp68.y + (var_f31 * (pos[2].y - spBC.y)), sp68.z + (var_f31 * (pos[2].z - spBC.z)));
|
|
GXEnd();
|
|
|
|
if (draw_mirrored) {
|
|
sp5C.x = spBC.x + star_pos.x;
|
|
sp5C.y = spBC.y - star_pos.y;
|
|
sp5C.z = spBC.z + star_pos.z;
|
|
|
|
GXBegin(GX_TRIANGLES, GX_VTXFMT0, 3);
|
|
GXPosition3f32(sp5C.x + (var_f31 * (pos[0].x - spBC.x)), sp5C.y + (var_f31 * (pos[0].y - spBC.y)), sp5C.z + (var_f31 * (pos[0].z - spBC.z)));
|
|
GXPosition3f32(sp5C.x + (var_f31 * (pos[1].x - spBC.x)), sp5C.y + (var_f31 * (pos[1].y - spBC.y)), sp5C.z + (var_f31 * (pos[1].z - spBC.z)));
|
|
GXPosition3f32(sp5C.x + (var_f31 * (pos[2].x - spBC.x)), sp5C.y + (var_f31 * (pos[2].y - spBC.y)), sp5C.z + (var_f31 * (pos[2].z - spBC.z)));
|
|
GXEnd();
|
|
}
|
|
}
|
|
}
|
|
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
|
|
/* 8006950C-8006A090 063E4C 0B84+00 0/0 1/1 0/0 .text drawCloudShadow__FPA4_fPPUc */
|
|
void drawCloudShadow(Mtx drawMtx, u8** tex) {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_cloud_Packet* cloud_packet = g_env_light.mpCloudPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
Mtx sp120;
|
|
Mtx spF0;
|
|
|
|
Vec sp74, sp68;
|
|
cXyz sp5C;
|
|
GXColor color_reg0;
|
|
GXColor color_reg1;
|
|
GXColor sp48;
|
|
GXColor sp44;
|
|
GXColor sp40 = {0xFF, 0xFF, 0xFF, 0xFF};
|
|
GXColor sp3C = {0xFF, 0xFF, 0xFF, 0xFF};
|
|
GXColor sp38 = {0xFF, 0xFF, 0xFF, 0xFF};
|
|
|
|
f32 var_f29 = 1.0f;
|
|
|
|
if (cloud_packet->mCount > 0) {
|
|
j3dSys.reinitGX();
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
OS_REPORT("\ndrawCloud ikinasi return!!");
|
|
return;
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
|
|
GXTexObj texobj, fb_texobj;
|
|
if (g_env_light.mMoyaMode < 50) {
|
|
dKy_ParticleColor_get_bg(&camera->lookat.eye, NULL, &sp48, &sp44, &sp40, &sp3C, 0.0f);
|
|
f32 temp_f30 = 0.4f;
|
|
|
|
color_reg0.r = (sp38.r * temp_f30) + (sp44.r * (1.0f - temp_f30));
|
|
color_reg0.g = (sp38.g * temp_f30) + (sp44.g * (1.0f - temp_f30));
|
|
color_reg0.b = (sp38.b * temp_f30) + (sp44.b * (1.0f - temp_f30));
|
|
|
|
color_reg1.r = (0.45f * sp38.r) + (0.55f * sp44.r);
|
|
color_reg1.g = (0.45f * sp38.g) + (0.55f * sp44.g);
|
|
color_reg1.b = (0.45f * sp38.b) + (0.55f * sp44.b);
|
|
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[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);
|
|
dKy_GxFog_set();
|
|
|
|
if (g_env_light.mMoyaMode == 3 || g_env_light.mMoyaMode == 4 || g_env_light.mMoyaMode == 6 || g_env_light.mMoyaMode == 10 || g_env_light.mMoyaMode == 11) {
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_COPY);
|
|
} else {
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
|
|
}
|
|
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
dKr_cullVtx_Set();
|
|
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
|
|
rot -= 0.45f;
|
|
if (rot < 0.0f) {
|
|
rot = 719.0f;
|
|
}
|
|
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
} else {
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xFF;
|
|
color_reg0.b = 0x73;
|
|
|
|
color_reg1.r = 0x50;
|
|
color_reg1.g = 0x32;
|
|
color_reg1.b = 0;
|
|
color_reg1.a = 0xFF;
|
|
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[0], GX_TEXMAP1);
|
|
|
|
ResTIMG* fb_timg = mDoGph_gInf_c::getFrameBufferTimg();
|
|
dDlst_window_c* window = dComIfGp_getWindow(0);
|
|
camera_class* window_cam = dComIfGp_getCamera(window->getCameraID());
|
|
dKyr_set_btitex_common(&fb_texobj, fb_timg, GX_TEXMAP0);
|
|
|
|
f32 scale = 0.49f;
|
|
C_MTXLightPerspective(sp120, window_cam->fovy, window_cam->aspect, scale, -scale, 0.5f, 0.5f);
|
|
cMtx_concat(sp120, j3dSys.getViewMtx(), spF0);
|
|
|
|
rot += 2.0f;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
GXLoadTexMtxImm(spF0, GX_TEXMTX0, GX_MTX3x4);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
|
|
GXSetNumChans(1);
|
|
GXSetChanCtrl(GX_COLOR0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_NONE);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
GXSetNumTexGens(2);
|
|
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX0);
|
|
GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY);
|
|
GXSetNumTevStages(2);
|
|
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
|
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_C0, GX_CC_C1);
|
|
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_TEXA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR0A0);
|
|
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
|
|
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
|
|
GXSetZCompLoc(GX_TRUE);
|
|
GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
GXSetNumIndStages(0);
|
|
}
|
|
|
|
if (g_env_light.mMoyaMode == 7 || g_env_light.mMoyaMode == 8 || g_env_light.mMoyaMode == 10 || g_env_light.mMoyaMode == 11) {
|
|
var_f29 = g_env_light.field_0xebc;
|
|
}
|
|
|
|
for (int i = 0; i < cloud_packet->mCount; i++) {
|
|
cXyz pos[4];
|
|
f32 size = cloud_packet->mCloudEff[i].mSize;
|
|
|
|
if (!(cloud_packet->mCloudEff[i].mAlpha <= 0.01f)) {
|
|
color_reg0.a = 255.0f * (cloud_packet->mCloudEff[i].mAlpha * var_f29);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
sp5C.x = cloud_packet->mCloudEff[i].mBasePos.x + cloud_packet->mCloudEff[i].mPosition.x;
|
|
sp5C.y = cloud_packet->mCloudEff[i].mBasePos.y + cloud_packet->mCloudEff[i].mPosition.y;
|
|
sp5C.z = cloud_packet->mCloudEff[i].mBasePos.z + cloud_packet->mCloudEff[i].mPosition.z;
|
|
|
|
sp74.x = -size;
|
|
sp74.y = size;
|
|
sp74.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp74, &sp68);
|
|
pos[0].x = sp5C.x + sp68.x;
|
|
pos[0].y = sp5C.y + sp68.y;
|
|
pos[0].z = sp5C.z + sp68.z;
|
|
|
|
sp74.x = size;
|
|
sp74.y = size;
|
|
sp74.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp74, &sp68);
|
|
pos[1].x = sp5C.x + sp68.x;
|
|
pos[1].y = sp5C.y + sp68.y;
|
|
pos[1].z = sp5C.z + sp68.z;
|
|
|
|
sp74.x = size;
|
|
sp74.y = -size;
|
|
sp74.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp74, &sp68);
|
|
pos[2].x = sp5C.x + sp68.x;
|
|
pos[2].y = sp5C.y + sp68.y;
|
|
pos[2].z = sp5C.z + sp68.z;
|
|
|
|
sp74.x = -size;
|
|
sp74.y = -size;
|
|
sp74.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp74, &sp68);
|
|
pos[3].x = sp5C.x + sp68.x;
|
|
pos[3].y = sp5C.y + sp68.y;
|
|
pos[3].z = sp5C.z + sp68.z;
|
|
|
|
if (g_env_light.mMoyaMode < 50) {
|
|
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();
|
|
} else {
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
GXPosition3f32(pos[0].x, pos[0].y, pos[0].z);
|
|
GXTexCoord2s16(0, 0);
|
|
GXTexCoord2s16(0, 0);
|
|
GXPosition3f32(pos[1].x, pos[1].y, pos[1].z);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXPosition3f32(pos[2].x, pos[2].y, pos[2].z);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXPosition3f32(pos[3].x, pos[3].y, pos[3].z);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXEnd();
|
|
}
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
|
|
// drawVrkumo calls these functions as inlines somehow
|
|
// these need to be moved to MSL_C once an appropriate solution is found
|
|
inline float sinf(float x) {
|
|
return sin(x);
|
|
}
|
|
|
|
inline float cosf(float x) {
|
|
return cos(x);
|
|
}
|
|
|
|
/* 8006A090-8006B190 0649D0 1100+00 0/0 1/1 0/0 .text drawVrkumo__FPA4_fR8_GXColorPPUc */
|
|
// NONMATCHING - regalloc, j/k getting put in too low of registers?
|
|
void drawVrkumo(Mtx drawMtx, GXColor& color, u8** tex) {
|
|
dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket;
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_vrkumo_Packet* vrkumo_packet = g_env_light.mpVrkumoPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
camera_class* camera2 = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
|
|
GXTexObj texobj;
|
|
cXyz proj;
|
|
|
|
f32 rot;
|
|
f32 spCC;
|
|
int pass = 1;
|
|
f32 spC4 = 0.0f;
|
|
|
|
#if VERSION == VERSION_GCN_JPN
|
|
if (g_env_light.hide_vrbox) {
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
cXyz sp15C;
|
|
cXyz sp150;
|
|
cXyz sp144;
|
|
cXyz sp138;
|
|
cXyz sp12C;
|
|
cXyz sp120;
|
|
cXyz sp114;
|
|
cXyz sp108;
|
|
cXyz spFC;
|
|
|
|
f32 spC0;
|
|
f32 spBC;
|
|
f32 spB8;
|
|
f32 spB4;
|
|
f32 spB0;
|
|
f32 spAC;
|
|
f32 spA8;
|
|
f32 spA4;
|
|
f32 spA0;
|
|
f32 sp9C;
|
|
f32 sp98;
|
|
f32 sp94;
|
|
f32 sp90;
|
|
f32 sp8C;
|
|
|
|
int sp88;
|
|
int sp84;
|
|
int sp80 = 0;
|
|
GXColor color_reg1;
|
|
|
|
int j, k;
|
|
|
|
if (camera2 != NULL) {
|
|
spC4 = camera2->mCamera.TrimHeight();
|
|
}
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
OS_REPORT("\ndrawCloud ikinasi return!!");
|
|
return;
|
|
}
|
|
|
|
rot = cAngle::s2d(fopCamM_GetBank(camera));
|
|
|
|
sp88 = 0;
|
|
spCC = 100000.0f;
|
|
|
|
f32 unused;
|
|
f32 y_pos;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
f32 sp70 = 0.0f;
|
|
dStage_FileList_dt_c* filelist = NULL;
|
|
if (dComIfGp_roomControl_getStayNo() >= 0) {
|
|
filelist = dComIfGp_roomControl_getStatusRoomDt(dComIfGp_roomControl_getStayNo())->getFileListInfo();
|
|
}
|
|
|
|
if (filelist != NULL) {
|
|
sp70 = dStage_FileList_dt_SeaLevel(filelist);
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
if (g_kankyoHIO.field_0x0b4) {
|
|
sp70 = g_kankyoHIO.field_0x0b8;
|
|
} else {
|
|
g_kankyoHIO.field_0x0b8 = sp70;
|
|
}
|
|
#endif
|
|
|
|
unused = 1.0f - (0.09f * (camera->lookat.eye.y - sp70));
|
|
}
|
|
|
|
if (g_env_light.daytime > 105.0f && g_env_light.daytime < 240.0f && !dComIfGp_event_runCheck() && sun_packet != NULL && sun_packet->mSunAlpha > 0.0f) {
|
|
mDoLib_project(&sun_packet->mPos[0], &proj);
|
|
if (proj.x > 0.0f && proj.x < 608.0f && proj.y > spC4 && proj.y < (458.0f - spC4)) {
|
|
pass = 0;
|
|
}
|
|
}
|
|
|
|
for (; pass < 2; pass++) {
|
|
if (pass == 0) {
|
|
GXSetColorUpdate(GX_DISABLE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
} else {
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
}
|
|
|
|
for (j = 0; j < 3; j++) {
|
|
color.r = g_env_light.vrbox_kumo_bottom_col.r;
|
|
color.g = g_env_light.vrbox_kumo_bottom_col.g;
|
|
color.b = g_env_light.vrbox_kumo_bottom_col.b;
|
|
|
|
color_reg1.r = 0;
|
|
color_reg1.g = 0;
|
|
color_reg1.b = 0;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[j]);
|
|
|
|
GXSetNumChans(0);
|
|
GXSetTevColor(GX_TEVREG0, color);
|
|
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);
|
|
GXSetFog(GX_FOG_NONE, 0.0f, 1.0f, 0.1f, 1.0f, color);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
|
|
|
|
if (pass == 0) {
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZCompLoc(GX_FALSE);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_ENABLE);
|
|
} else {
|
|
GXSetAlphaCompare(GX_GREATER, 4, GX_AOP_OR, GX_GREATER, 4);
|
|
GXSetZCompLoc(GX_TRUE);
|
|
GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_DISABLE);
|
|
}
|
|
|
|
GXSetNumIndStages(0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
|
|
if (pass == 1 && j == 0) {
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
}
|
|
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
for (k = 0; k < 100; k++) {
|
|
cXyz pos[4];
|
|
|
|
if (!(vrkumo_packet->mVrkumoEff[k].mAlpha <= 0.0000000001f) && (pass != 0 || !(vrkumo_packet->mVrkumoEff[k].mAlpha < 0.45f))) {
|
|
f32 sp68;
|
|
f32 sp64;
|
|
f32 sp60;
|
|
f32 sp5C;
|
|
|
|
f32 sp58 = ((j + k) & 15) / 16.0f;
|
|
f32 sp54 = 1.0f - (sp58 * sp58 * sp58);
|
|
f32 sp50;
|
|
|
|
static f32 howa_loop_cnt = 0.0f;
|
|
|
|
#ifdef DEBUG
|
|
spAC = g_kankyoHIO.field_0x3f4;
|
|
spA8 = g_kankyoHIO.field_0x3f8;
|
|
#else
|
|
spAC = 0.6f;
|
|
spA8 = 0.84f;
|
|
#endif
|
|
|
|
if (dKy_darkworld_check()) {
|
|
spAC = 0.8f;
|
|
spA8 = 0.8f;
|
|
}
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN07A") == 0) {
|
|
spA8 = 0.65f;
|
|
}
|
|
|
|
spAC += g_env_light.mVrkumoStrength * (spA8 - spAC);
|
|
sp68 = sp54 * spAC * vrkumo_packet->mVrkumoEff[k].mDistFalloff;
|
|
|
|
sp50 = cM_fsin(j + (0.0001f * howa_loop_cnt));
|
|
sp50 *= vrkumo_packet->mVrkumoEff[k].mDistFalloff;
|
|
howa_loop_cnt += 1.5f * sp58;
|
|
|
|
sp68 += (0.05f * sp68 * sp50);
|
|
sp64 = sp68 + (sp68 * vrkumo_packet->mVrkumoEff[k].mHeight);
|
|
|
|
if (pass == 0) {
|
|
color.a = 1;
|
|
} else {
|
|
f32 sp4C = 1.0f - vrkumo_packet->mVrkumoEff[k].mDistFalloff;
|
|
|
|
color.r = (f32)g_env_light.vrbox_kumo_top_col.r + (sp4C * ((f32)g_env_light.vrbox_kumo_bottom_col.r - (f32)g_env_light.vrbox_kumo_top_col.r));
|
|
color.g = (f32)g_env_light.vrbox_kumo_top_col.g + (sp4C * ((f32)g_env_light.vrbox_kumo_bottom_col.g - (f32)g_env_light.vrbox_kumo_top_col.g));
|
|
color.b = (f32)g_env_light.vrbox_kumo_top_col.b + (sp4C * ((f32)g_env_light.vrbox_kumo_bottom_col.b - (f32)g_env_light.vrbox_kumo_top_col.b));
|
|
color.a = 255.0f * vrkumo_packet->mVrkumoEff[k].mAlpha;
|
|
|
|
if (j == 1) {
|
|
color.r *= 0.8f;
|
|
color.g *= 0.8f;
|
|
color.b *= 0.8f;
|
|
} else if (j == 2) {
|
|
color.r *= 0.92f;
|
|
color.g *= 0.92f;
|
|
color.b *= 0.92f;
|
|
}
|
|
}
|
|
|
|
if (!(vrkumo_packet->mVrkumoEff[k].mAlpha <= 0.000001f)) {
|
|
GXLoadTexObj(&texobj, GX_TEXMAP0);
|
|
GXSetTevColor(GX_TEVREG0, color);
|
|
|
|
sp60 = sp68 * (0.2f + (0.2f * (k / 100.0f)));
|
|
sp5C = sp68 * (0.55f + (0.3f * (k / 100.0f)));
|
|
spFC = vrkumo_packet->mVrkumoEff[k].mPosition;
|
|
|
|
spA4 = 0.0f;
|
|
spA0 = 0.0f;
|
|
|
|
if (j != 0) {
|
|
switch (k & 3) {
|
|
case 0:
|
|
if (j == 1) {
|
|
spA4 = sp60;
|
|
spA0 = sp5C;
|
|
} else if (j == 2) {
|
|
spA4 = sp5C;
|
|
spA0 = sp60;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (j == 1) {
|
|
spA4 = -sp60;
|
|
spA0 = sp60;
|
|
} else if (j == 2) {
|
|
spA4 = -sp5C;
|
|
spA0 = sp5C;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (j == 1) {
|
|
spA4 = sp5C;
|
|
spA0 = -sp60;
|
|
} else if (j == 2) {
|
|
spA4 = sp60;
|
|
spA0 = -sp5C;
|
|
}
|
|
break;
|
|
default:
|
|
if (j == 1) {
|
|
spA4 = -sp5C;
|
|
spA0 = sp5C;
|
|
} else if (j == 2) {
|
|
spA4 = -sp60;
|
|
spA0 = sp60;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
spC0 = JMAFastSqrt((spFC.x * spFC.x) + (spFC.z * spFC.z));
|
|
spB0 = atan2f(spFC.x, spFC.z);
|
|
spB4 = atan2f(spFC.y, spC0);
|
|
spB0 += spA0;
|
|
spB4 += spA4;
|
|
|
|
sp94 = spB4 / 1.9f;
|
|
if (sp94 > 1.0f) {
|
|
sp94 = 1.0f;
|
|
}
|
|
sp94 *= sp94 * sp94;
|
|
|
|
sp98 = 0.6f * sp68 * (1.0f + (16.0f * sp94));
|
|
sp9C = 0.9f * sp64 * (1.0f + (-4.0f * sp94));
|
|
sp8C = 0.6f * sp68 * (1.0f + (2.0f * sp94));
|
|
sp90 = 0.0f;
|
|
spB8 = spB0 + sp98;
|
|
spBC = spB4 + sp9C;
|
|
if (spBC > 1.21f) {
|
|
spBC = 1.21f;
|
|
}
|
|
|
|
sp144.x = cosf(spBC) * sinf(spB8);
|
|
sp144.y = sinf(spBC);
|
|
sp144.z = cosf(spBC) * cosf(spB8);
|
|
sp12C = sp144;
|
|
|
|
spB8 = spB0 - sp98;
|
|
spBC = spB4 + sp9C;
|
|
if (spBC > 1.21f) {
|
|
spBC = 1.21f;
|
|
}
|
|
|
|
sp144.x = cosf(spBC) * sinf(spB8);
|
|
sp144.y = sinf(spBC);
|
|
sp144.z = cosf(spBC) * cosf(spB8);
|
|
sp120 = sp144;
|
|
|
|
spB8 = spB0 - sp8C;
|
|
spBC = spB4 - sp90;
|
|
|
|
sp144.x = cosf(spBC) * sinf(spB8);
|
|
sp144.y = sinf(spBC);
|
|
sp144.z = cosf(spBC) * cosf(spB8);
|
|
sp114 = sp144;
|
|
|
|
spB8 = spB0 + sp8C;
|
|
spBC = spB4 - sp90;
|
|
|
|
sp144.x = cosf(spBC) * sinf(spB8);
|
|
sp144.y = sinf(spBC);
|
|
sp144.z = cosf(spBC) * cosf(spB8);
|
|
sp108 = sp144;
|
|
|
|
pos[0].x = sp12C.x * spCC;
|
|
pos[0].y = sp12C.y * spCC;
|
|
pos[0].z = sp12C.z * spCC;
|
|
|
|
pos[1].x = sp120.x * spCC;
|
|
pos[1].y = sp120.y * spCC;
|
|
pos[1].z = sp120.z * spCC;
|
|
|
|
pos[2].x = sp114.x * spCC;
|
|
pos[2].y = sp114.y * spCC;
|
|
pos[2].z = sp114.z * spCC;
|
|
|
|
pos[3].x = sp108.x * spCC;
|
|
pos[3].y = sp108.y * spCC;
|
|
pos[3].z = sp108.z * spCC;
|
|
|
|
pos[0] += camera->lookat.eye;
|
|
pos[1] += camera->lookat.eye;
|
|
pos[2] += camera->lookat.eye;
|
|
pos[3] += camera->lookat.eye;
|
|
|
|
sp84 = 0;
|
|
if (dComIfGd_getView()->fovy > 40.0f) {
|
|
cXyz spF0;
|
|
|
|
f32 x;
|
|
f32 y;
|
|
f32 z;
|
|
for (int sp3C = 0; sp3C < 4; sp3C++) {
|
|
spF0 = pos[sp3C];
|
|
x = 100.0f;
|
|
y = 100.0f;
|
|
z = 100.0f;
|
|
mDoLib_project(&spF0, &proj);
|
|
|
|
if (proj.x > -x && proj.x < (608.0f + x) && proj.y > -y && proj.y < (458.0f + z)) {
|
|
break;
|
|
}
|
|
|
|
if (sp3C == 3) {
|
|
sp84 = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sp84 == 0) {
|
|
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 (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0 ||
|
|
strcmp(dComIfGp_getStartStageName(), "D_MN07") == 0 ||
|
|
strcmp(dComIfGp_getStartStageName(), "D_MN08") == 0 ||
|
|
strcmp(dComIfGp_getStartStageName(), "D_MN07A") == 0 ||
|
|
strcmp(dComIfGp_getStartStageName(), "D_MN07A") == 0 ||
|
|
#if DEBUG
|
|
strcmp(dComIfGp_getStartStageName(), "MIYAGI") == 0 ||
|
|
strcmp(dComIfGp_getStartStageName(), "T_SASA0") == 0 ||
|
|
#endif
|
|
(strcmp(dComIfGp_getStartStageName(), "F_SP103") == 0 && dComIfGp_roomControl_getStayNo() == 0))
|
|
{
|
|
sp84 = 0;
|
|
if (dComIfGd_getView()->fovy > 40.0f) {
|
|
cXyz spE4;
|
|
|
|
f32 x;
|
|
f32 y;
|
|
f32 z;
|
|
for (int sp2C = 0; sp2C < 4; sp2C++) {
|
|
spE4 = pos[sp2C];
|
|
spE4.y = -pos[sp2C].y;
|
|
|
|
x = 100.0f;
|
|
y = 100.0f;
|
|
z = 100.0f;
|
|
mDoLib_project(&spE4, &proj);
|
|
|
|
if (proj.x > -x && proj.x < (608.0f + x) && proj.y > -y && proj.y < (458.0f + z)) {
|
|
break;
|
|
}
|
|
|
|
if (sp2C == 3) {
|
|
sp84 = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sp84 == 0) {
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
|
|
y_pos = -pos[0].y;
|
|
GXPosition3f32(pos[0].x, y_pos, pos[0].z);
|
|
GXTexCoord2s16(0, 0);
|
|
|
|
y_pos = -pos[1].y;
|
|
GXPosition3f32(pos[1].x, y_pos, pos[1].z);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
|
|
y_pos = -pos[2].y;
|
|
GXPosition3f32(pos[2].x, y_pos, pos[2].z);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
|
|
y_pos = -pos[3].y;
|
|
GXPosition3f32(pos[3].x, y_pos, pos[3].z);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXEnd();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sp88 = 1;
|
|
}
|
|
|
|
if (pass == 0) {
|
|
GXSetColorUpdate(GX_ENABLE);
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
dKy_GxFog_set();
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
|
|
/* 8006B190-8006B1A8 065AD0 0018+00 0/0 1/1 0/0 .text dKyr_thunder_init__Fv */
|
|
void dKyr_thunder_init() {
|
|
g_env_light.mThunderEff.mState = 0;
|
|
g_env_light.mThunderEff.field_0x2 = 0;
|
|
}
|
|
|
|
/* 8006B1A8-8006B8DC 065AE8 0734+00 0/0 1/1 0/0 .text dKyr_thunder_move__Fv */
|
|
void dKyr_thunder_move() {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
EF_THUNDER* effect = &envlight->mThunderEff;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
cXyz sp28;
|
|
int sp10 = 0;
|
|
|
|
if (memcmp(dComIfGp_getStartStageName(), "R_SP", 4) == 0) {
|
|
sp10 = 1;
|
|
if (strcmp(dComIfGp_getStartStageName(), "R_SP30") == 0 && dComIfGp_roomControl_getStayNo() == 4) {
|
|
sp10 = 2;
|
|
}
|
|
}
|
|
|
|
switch (effect->mState) {
|
|
case 0:
|
|
effect->mFlashTimer = 0.0f;
|
|
effect->field_0xc = 0.0f;
|
|
effect->field_0x10 = 0.0f;
|
|
effect->field_0x14 = cM_rndFX(10000.0f);
|
|
effect->field_0x18 = cM_rndFX(10000.0f);
|
|
|
|
if (dDemo_c::getMode() != 0) {
|
|
u8 sp8 = 0;
|
|
u32 demo_frame = dDemo_c::getFrame();
|
|
if (g_env_light.mThunderEff.field_0x2 != 0) {
|
|
sp8 = 1;
|
|
g_env_light.mThunderEff.field_0x2 = 0;
|
|
}
|
|
|
|
if (sp8 == 1) {
|
|
effect->mLightInfluence.mPosition = camera->lookat.eye;
|
|
effect->mLightInfluence.mColor.r = 0;
|
|
effect->mLightInfluence.mColor.g = 0;
|
|
effect->mLightInfluence.mColor.b = 0;
|
|
effect->mLightInfluence.mPow = 90000.0f;
|
|
effect->mLightInfluence.mFluctuation = 1.0f;
|
|
dKy_efplight_set(&effect->mLightInfluence);
|
|
effect->field_0x1c = 0.6f + cM_rndF(0.4f);
|
|
fopKyM_create(PROC_KY_THUNDER, -1, NULL, NULL, NULL);
|
|
effect->mState++;
|
|
}
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "D_MN09B") == 0 && dComIfGp_event_runCheck()) {
|
|
if (g_env_light.mThunderEff.field_0x2 != 0) {
|
|
g_env_light.mThunderEff.field_0x2 = 0;
|
|
|
|
effect->mLightInfluence.mPosition = camera->lookat.eye;
|
|
effect->mLightInfluence.mColor.r = 0;
|
|
effect->mLightInfluence.mColor.g = 0;
|
|
effect->mLightInfluence.mColor.b = 0;
|
|
effect->mLightInfluence.mPow = 90000.0f;
|
|
effect->mLightInfluence.mFluctuation = 1.0f;
|
|
dKy_efplight_set(&effect->mLightInfluence);
|
|
effect->field_0x1c = 0.6f + cM_rndF(0.4f);
|
|
fopKyM_create(PROC_KY_THUNDER, -1, NULL, NULL, NULL);
|
|
effect->mState++;
|
|
}
|
|
} else if (cM_rndF(1.0f) < 0.007f) {
|
|
effect->field_0x1c = 0.6f + cM_rndF(0.4f);
|
|
effect->mState = 11;
|
|
if (cM_rndF(1.0f) < 0.2f) {
|
|
fopKyM_create(PROC_KY_THUNDER, -1, NULL, NULL, NULL);
|
|
}
|
|
} else if (cM_rndF(1.0f) < 0.005f && g_env_light.mThunderEff.mMode < 10 && sp10 != 1) {
|
|
effect->mLightInfluence.mPosition = camera->lookat.eye;
|
|
effect->mLightInfluence.mColor.r = 0;
|
|
effect->mLightInfluence.mColor.g = 0;
|
|
effect->mLightInfluence.mColor.b = 0;
|
|
effect->mLightInfluence.mPow = 90000.0f;
|
|
effect->mLightInfluence.mFluctuation = 1.0f;
|
|
dKy_efplight_set(&effect->mLightInfluence);
|
|
effect->field_0x1c = 0.6f + cM_rndF(0.4f);
|
|
fopKyM_create(PROC_KY_THUNDER, -1, NULL, NULL, NULL);
|
|
effect->mState++;
|
|
}
|
|
break;
|
|
case 1:
|
|
case 11:
|
|
cLib_addCalc(&effect->mFlashTimer, 1.0f, 0.3f, 0.2f, 0.001f);
|
|
if (effect->mFlashTimer >= effect->field_0x1c) {
|
|
if (effect->mState < 10) {
|
|
mDoAud_mEnvSe_startNearThunderSe();
|
|
}
|
|
effect->mState++;
|
|
}
|
|
break;
|
|
case 2:
|
|
case 12:
|
|
cLib_addCalc(&effect->mFlashTimer, 0.0f, 0.1f, 0.05f, 0.001f);
|
|
if (effect->mFlashTimer <= 0.0f) {
|
|
if (effect->mState < 10) {
|
|
dKy_efplight_cut(&effect->mLightInfluence);
|
|
}
|
|
|
|
effect->mState = 0;
|
|
if (g_env_light.mThunderEff.mMode == 0) {
|
|
g_env_light.mThunderEff.mStatus = 0;
|
|
}
|
|
} else if (effect->mFlashTimer <= 0.5f && effect->mFlashTimer > 0.4f && cM_rndF(1.0f) < 0.3f) {
|
|
effect->field_0x1c = 0.6f + cM_rndF(0.4f);
|
|
if (cM_rndF(1.0f) < 0.05f) {
|
|
fopKyM_create(PROC_KY_THUNDER, -1, NULL, NULL, NULL);
|
|
}
|
|
effect->mState--;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (effect->mState != 0) {
|
|
if (effect->mState < 10) {
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &sp28);
|
|
effect->mLightInfluence.mPosition.x = camera->lookat.eye.x - (sp28.x * effect->field_0x14);
|
|
effect->mLightInfluence.mPosition.y = camera->lookat.eye.y + 2000.0f;
|
|
effect->mLightInfluence.mPosition.z = camera->lookat.eye.z - (sp28.z * effect->field_0x18);
|
|
|
|
if (sp10 == 2) {
|
|
effect->mLightInfluence.mPosition.x = 195520.0f;
|
|
effect->mLightInfluence.mPosition.y = 4818.0f;
|
|
effect->mLightInfluence.mPosition.z = 1385.0f;
|
|
}
|
|
|
|
effect->mLightInfluence.mColor.r = (u8)(effect->mFlashTimer * 75.0f);
|
|
effect->mLightInfluence.mColor.g = (u8)(effect->mFlashTimer * 130.0f);
|
|
effect->mLightInfluence.mColor.b = (u8)(effect->mFlashTimer * 150.0f);
|
|
|
|
if (g_env_light.field_0x12d6 == 0) {
|
|
if (sp10 == 0) {
|
|
dKyr_get_vectle_calc(&camera->lookat.eye, &camera->lookat.center, &sp28);
|
|
|
|
f32 temp_f31;
|
|
if (sp28.y < 0.2f) {
|
|
if (sp28.y > 0.0f) {
|
|
temp_f31 = 1.0f - (sp28.y / 0.2f);
|
|
} else {
|
|
temp_f31 = 0.0f;
|
|
}
|
|
} else {
|
|
temp_f31 = 1.0f;
|
|
}
|
|
temp_f31 = 0.75f;
|
|
|
|
f32 temp_f29 = 0.25f * (1.0f - temp_f31);
|
|
f32 temp_f30 = effect->mFlashTimer * effect->mFlashTimer * effect->mFlashTimer;
|
|
|
|
s16 sp60;
|
|
s16 sp58;
|
|
s16 sp50;
|
|
if (sp10 == 0) {
|
|
sp60 = -64.0f * temp_f31;
|
|
sp58 = -64.0f * temp_f31;
|
|
sp50 = -64.0f * temp_f31;
|
|
dKy_actor_addcol_amb_set(sp60, sp58, sp50, temp_f30);
|
|
}
|
|
|
|
sp60 = -64.0f * temp_f31;
|
|
sp58 = -64.0f * temp_f31;
|
|
sp50 = -64.0f * temp_f31;
|
|
dKy_bg_addcol_amb_set(sp60, sp58, sp50, temp_f30);
|
|
|
|
|
|
s16 sp48 = -64.0f * temp_f31;
|
|
s16 sp40 = -64.0f * temp_f31;
|
|
s16 sp38 = -64.0f * temp_f31;
|
|
dKy_bg1_addcol_amb_set(sp48, sp40, sp38, 0.4f * temp_f30);
|
|
}
|
|
|
|
dKy_vrbox_addcol_sky0_set(75, 130, 150, 0.6f * effect->mFlashTimer);
|
|
dKy_vrbox_addcol_kasumi_set(75, 130, 150, 0.5f * effect->mFlashTimer);
|
|
|
|
if (1.0f == g_env_light.field_0x1210) {
|
|
dKy_addcol_fog_set(75, 130, 150, 0.4f * effect->mFlashTimer);
|
|
}
|
|
}
|
|
} else {
|
|
dKy_vrbox_addcol_sky0_set(75, 130, 150, 0.15f * effect->mFlashTimer);
|
|
dKy_vrbox_addcol_kasumi_set(75, 130, 150, 0.35f * effect->mFlashTimer);
|
|
|
|
if (1.0f == g_env_light.field_0x1210) {
|
|
dKy_addcol_fog_set(75, 130, 150, 0.12f * effect->mFlashTimer);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8006B8DC-8006B8E0 06621C 0004+00 0/0 1/1 0/0 .text dKyr_shstar_init__Fv */
|
|
void dKyr_shstar_init() {}
|
|
|
|
/* 8006B8E0-8006B8E4 066220 0004+00 0/0 1/1 0/0 .text dKyr_shstar_move__Fv */
|
|
void dKyr_shstar_move() {}
|
|
|
|
/* 8006B8E4-8006B924 066224 0040+00 0/0 1/1 0/0 .text dKyr_odour_init__Fv */
|
|
void dKyr_odour_init() {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_odour_Packet* odour_packet = envlight->mOdourData.mpOdourPacket;
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
odour_packet->mOdourEff[i].mStatus = 0;
|
|
odour_packet->mOdourEff[i].field_0x28 = 0.0f;
|
|
odour_packet->mOdourEff[i].field_0x2c = 0.0f;
|
|
odour_packet->mOdourEff[i].field_0x24 = 0.0f;
|
|
}
|
|
}
|
|
|
|
/* 8006B924-8006BE0C 066264 04E8+00 0/0 1/1 0/0 .text dKyr_odour_move__Fv */
|
|
void dKyr_odour_move() {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKy_Odour_Data* pOdourData = &envlight->mOdourData;
|
|
dKankyo_odour_Packet* odour_packet = pOdourData->mpOdourPacket;
|
|
|
|
Mtx camMtx;
|
|
cXyz sp20(0.0f, 1.0f, 0.0f);
|
|
cXyz sp14;
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
odour_packet->field_0x17724 -= ((int)cM_rndF(150.0f) + 430);
|
|
odour_packet->field_0x17726 -= ((int)cM_rndF(50.0f) + 200);
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
EF_ODOUR_EFF* effect = &odour_packet->mOdourEff[i];
|
|
switch (effect->mStatus) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
case 11:
|
|
if (cM_rndF(1.0f) < 0.1f) {
|
|
effect->field_0x24 = 0.0f;
|
|
effect->mStatus++;
|
|
}
|
|
break;
|
|
case 2:
|
|
case 12:
|
|
case 3:
|
|
case 13:
|
|
f32 temp_f29 = odour_packet->field_0x17714.abs(effect->mBasePos);
|
|
f32 temp_f31 = temp_f29 / 4000.0f;
|
|
if (temp_f31 < 0.0f) {
|
|
temp_f31 = 0.0f;
|
|
} else if (temp_f31 > 1.0f) {
|
|
temp_f31 = 1.0f;
|
|
}
|
|
temp_f31 = 0.3f;
|
|
|
|
f32 temp_f30 = cM_scos(odour_packet->field_0x17724 + 38 * (s16)temp_f29);
|
|
effect->mPosition.x = 60.0f * (temp_f30 * temp_f31);
|
|
effect->mPosition.z = 60.0f * (temp_f30 * temp_f31);
|
|
|
|
if (effect->mStatus < 10) {
|
|
temp_f30 = cM_scos(odour_packet->field_0x17724 + ((s16)temp_f29 * 160));
|
|
effect->mPosition.y = 90.0f * ((0.8f + temp_f30) * temp_f31);
|
|
temp_f30 = cM_ssin(odour_packet->field_0x17726 + ((s16)temp_f29 * 45));
|
|
effect->mPosition.y += 110.0f * ((0.8f + temp_f30) * temp_f31);
|
|
} else {
|
|
temp_f30 = cM_scos((int)(78.0f * temp_f29) + (int)(f32)odour_packet->field_0x17724);
|
|
|
|
effect->mPosition.y = 0.0f;
|
|
effect->mPosition.x = 150.0f * (temp_f30 * temp_f31);
|
|
effect->mPosition.z = 140.0f * (temp_f30 * temp_f31);
|
|
|
|
temp_f30 = cM_ssin(((s16)temp_f29 * 45) + (int)(f32)odour_packet->field_0x17726);
|
|
effect->mPosition.x += 100.0f * (temp_f30 * temp_f31);
|
|
effect->mPosition.z += 100.0f * (temp_f30 * temp_f31);
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(0.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::ZXYrotM(effect->mRotX, effect->mRotY, 0);
|
|
mDoMtx_stack_c::multVec(&sp20, &sp14);
|
|
|
|
effect->mBasePos.x += sp14.x * effect->field_0x20;
|
|
effect->mBasePos.y += sp14.y * effect->field_0x20;
|
|
effect->mBasePos.z += sp14.z * effect->field_0x20;
|
|
|
|
if (effect->mStatus == 2 || effect->mStatus == 12) {
|
|
cLib_addCalc(&effect->field_0x24, 1.0f, 0.1f, 0.2f, 0.001f);
|
|
if (effect->field_0x24 >= 1.0f) {
|
|
effect->mStatus++;
|
|
}
|
|
} else if (effect->mStatus == 3 || effect->mStatus == 13) {
|
|
cLib_addCalc(&effect->field_0x24, 0.0f, 0.1f, 0.06f, 0.001f);
|
|
if (effect->field_0x24 <= 0.1f) {
|
|
effect->field_0x24 = 0.0f;
|
|
effect->mStatus = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8006BE0C-8006C790 06674C 0984+00 0/0 1/1 0/0 .text dKyr_odour_draw__FPA4_fPPUc */
|
|
// NONMATCHING - regalloc
|
|
void dKyr_odour_draw(Mtx drawMtx, u8** tex) {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_odour_Packet* odour_packet = envlight->mOdourData.mpOdourPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
Mtx sp120;
|
|
Mtx spF0;
|
|
cXyz sp70;
|
|
|
|
j3dSys.reinitGX();
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
OS_REPORT("\nodour_draw return!!");
|
|
return;
|
|
}
|
|
|
|
if (envlight->senses_effect_strength <= 0.0f || envlight->now_senses_effect != 1) {
|
|
return;
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
|
|
GXColor color_reg0;
|
|
GXColor color_reg1;
|
|
|
|
switch (dComIfGs_getCollectSmell()) {
|
|
case fpcNm_ITEM_SMELL_YELIA_POUCH:
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xFF;
|
|
color_reg0.b = 0xFF;
|
|
|
|
color_reg1.r = 0xFF;
|
|
color_reg1.g = 0x78;
|
|
color_reg1.b = 0xA8;
|
|
color_reg1.a = 0xFF;
|
|
break;
|
|
case fpcNm_ITEM_SMELL_FISH:
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xA1;
|
|
color_reg0.b = 0x3B;
|
|
|
|
color_reg1.r = 0xD6;
|
|
color_reg1.g = 0x60;
|
|
color_reg1.b = 0x32;
|
|
color_reg1.a = 0xFF;
|
|
break;
|
|
case fpcNm_ITEM_SMELL_CHILDREN:
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xDB;
|
|
color_reg0.b = 0xFF;
|
|
|
|
color_reg1.r = 0xE4;
|
|
color_reg1.g = 0xAC;
|
|
color_reg1.b = 0x52;
|
|
color_reg1.a = 0xFF;
|
|
break;
|
|
case fpcNm_ITEM_SMELL_MEDICINE:
|
|
color_reg0.r = 0xD5;
|
|
color_reg0.g = 0xCE;
|
|
color_reg0.b = 0xA7;
|
|
|
|
color_reg1.r = 0x55;
|
|
color_reg1.g = 0x78;
|
|
color_reg1.b = 0x27;
|
|
color_reg1.a = 0xFF;
|
|
break;
|
|
case fpcNm_ITEM_SMELL_POH:
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0xC8;
|
|
color_reg0.b = 0xFF;
|
|
|
|
color_reg1.r = 0x44;
|
|
color_reg1.g = 0x1A;
|
|
color_reg1.b = 0x6B;
|
|
color_reg1.a = 0xFF;
|
|
break;
|
|
}
|
|
|
|
GXTexObj texobj, fb_texobj;
|
|
dKyr_set_btitex_common(&texobj, (ResTIMG*)tex[0], GX_TEXMAP1);
|
|
|
|
ResTIMG* fb_timg = mDoGph_gInf_c::getFrameBufferTimg();
|
|
dDlst_window_c* window = dComIfGp_getWindow(0);
|
|
camera_class* window_cam = dComIfGp_getCamera(window->getCameraID());
|
|
dKyr_set_btitex_common(&fb_texobj, fb_timg, GX_TEXMAP0);
|
|
|
|
f32 scale = 0.49f;
|
|
C_MTXLightPerspective(sp120, window_cam->fovy, window_cam->aspect, scale, -scale, 0.5f, 0.5f);
|
|
cMtx_concat(sp120, j3dSys.getViewMtx(), spF0);
|
|
|
|
rot += 2.0f;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
GXLoadTexMtxImm(spF0, GX_TEXMTX0, GX_MTX3x4);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT);
|
|
GXSetNumChans(1);
|
|
GXSetChanCtrl(GX_COLOR0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_NONE);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
GXSetNumTexGens(2);
|
|
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX0);
|
|
GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY);
|
|
GXSetNumTevStages(2);
|
|
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
|
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_C0, GX_CC_C1);
|
|
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_TEXA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
|
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR0A0);
|
|
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_CPREV, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
|
|
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO);
|
|
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
|
|
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
|
|
GXSetZCompLoc(GX_TRUE);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
EF_ODOUR_EFF* effect = &odour_packet->mOdourEff[i];
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
cXyz pos[4];
|
|
Vec sp64, sp58;
|
|
cXyz sp4C;
|
|
|
|
f32 size = effect->field_0x2c;
|
|
if (effect->mStatus != 0 && effect->mStatus != 1 && effect->mStatus != 11) {
|
|
sp4C = effect->mBasePos + effect->mPosition;
|
|
|
|
f32 var_f31 = camera->lookat.eye.abs(sp4C);
|
|
if (var_f31 < 250.0f) {
|
|
if (var_f31 < 150.0f) {
|
|
var_f31 = 0.0f;
|
|
} else {
|
|
var_f31 = (var_f31 - 150.0f) / 150.0f;
|
|
if (var_f31 < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
} else if (var_f31 > 1.0f) {
|
|
var_f31 = 1.0f;
|
|
}
|
|
}
|
|
} else {
|
|
var_f31 = 1.0f;
|
|
}
|
|
|
|
f32 temp_f29 = var_f31 * (effect->field_0x28 * (effect->field_0x24 * (envlight->senses_effect_strength * envlight->senses_effect_strength * envlight->senses_effect_strength)));
|
|
|
|
if (effect->mStatus != 0) {
|
|
if (!(temp_f29 <= 0.000001f)) {
|
|
color_reg0.a = 255.0f * temp_f29;
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
sp70 = sp4C;
|
|
|
|
sp64.x = -size;
|
|
sp64.y = size;
|
|
sp64.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp64, &sp58);
|
|
pos[0].x = sp70.x + sp58.x;
|
|
pos[0].y = sp70.y + sp58.y;
|
|
pos[0].z = sp70.z + sp58.z;
|
|
|
|
sp64.x = size;
|
|
sp64.y = size;
|
|
sp64.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp64, &sp58);
|
|
pos[1].x = sp70.x + sp58.x;
|
|
pos[1].y = sp70.y + sp58.y;
|
|
pos[1].z = sp70.z + sp58.z;
|
|
|
|
sp64.x = size;
|
|
sp64.y = -size;
|
|
sp64.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp64, &sp58);
|
|
pos[2].x = sp70.x + sp58.x;
|
|
pos[2].y = sp70.y + sp58.y;
|
|
pos[2].z = sp70.z + sp58.z;
|
|
|
|
sp64.x = -size;
|
|
sp64.y = -size;
|
|
sp64.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp64, &sp58);
|
|
pos[3].x = sp70.x + sp58.x;
|
|
pos[3].y = sp70.y + sp58.y;
|
|
pos[3].z = sp70.z + sp58.z;
|
|
|
|
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
|
GXPosition3f32(pos[0].x, pos[0].y, pos[0].z);
|
|
GXTexCoord2s16(0, 0);
|
|
GXTexCoord2s16(0, 0);
|
|
GXPosition3f32(pos[1].x, pos[1].y, pos[1].z);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXTexCoord2s16(0xFF, 0);
|
|
GXPosition3f32(pos[2].x, pos[2].y, pos[2].z);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXTexCoord2s16(0xFF, 0xFF);
|
|
GXPosition3f32(pos[3].x, pos[3].y, pos[3].z);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXTexCoord2s16(0, 0xFF);
|
|
GXEnd();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
|
|
/* 8006C790-8006C85C 0670D0 00CC+00 0/0 1/1 0/0 .text dKyr_mud_init__Fv */
|
|
void dKyr_mud_init() {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
envlight->mpMudPacket->mpMoyaRes = (u8*)dComIfG_getObjectRes("Always", 0x53);
|
|
|
|
for (int i = 0; i < 100; i++) {
|
|
envlight->mpMudPacket->mEffect[i].mStatus = 0;
|
|
}
|
|
|
|
envlight->mpMudPacket->mEffectNum = 0;
|
|
|
|
if (!dComIfGs_isStageBossEnemy()) {
|
|
envlight->mpMudPacket->field_0x1c3c = 1.0f;
|
|
} else {
|
|
envlight->mpMudPacket->field_0x1c3c = 0.0f;
|
|
}
|
|
}
|
|
|
|
/* 8006C85C-8006D01C 06719C 07C0+00 0/0 1/1 0/0 .text dKyr_mud_move__Fv */
|
|
void dKyr_mud_move() {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_mud_Packet* mud_packet = g_env_light.mpMudPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
cXyz spA4;
|
|
cXyz sp98;
|
|
cXyz sp8C;
|
|
cXyz sp80;
|
|
cXyz wind_vecpow = dKyw_get_wind_vecpow();
|
|
cXyz sp68;
|
|
cXyz sp5C;
|
|
|
|
dBgS_GndChk gndchk;
|
|
f32 sp34 = 800.0f;
|
|
f32 temp_f31 = 700.0f;
|
|
f32 sp30 = 0.0f;
|
|
f32 sp2C = 0.0f;
|
|
|
|
if (g_env_light.field_0x1048 != 0 || (g_env_light.field_0x1048 == 0 && mud_packet->field_0x1c3c <= 0.0f)) {
|
|
mud_packet->mEffectNum = (s16)g_env_light.field_0x1048;
|
|
}
|
|
|
|
if (g_env_light.field_0x1048 != 0) {
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN05A") == 0 && g_env_light.wether_pat1 == 6) {
|
|
dComIfGs_PolyDamageOff_Set(1);
|
|
cLib_addCalc(&mud_packet->field_0x1c3c, 0.0f, 0.1f, 0.001f, 0.000001f);
|
|
} else {
|
|
cLib_addCalc(&mud_packet->field_0x1c3c, 1.0f, 0.2f, 0.05f, 0.01f);
|
|
}
|
|
} else {
|
|
cLib_addCalc(&mud_packet->field_0x1c3c, 0.0f, 0.2f, 0.05f, 0.01f);
|
|
}
|
|
|
|
if (mud_packet->mEffectNum == 0) {
|
|
return;
|
|
}
|
|
|
|
dKy_set_eyevect_calc2(camera, &spA4, sp34, sp30);
|
|
f32 sp3C = dKyw_get_wind_pow();
|
|
f32 sp38 = -99999.898f;
|
|
|
|
u8 sp8;
|
|
for (int i = mud_packet->mEffectNum - 1; i >= 0; i--) {
|
|
sp8 = 0;
|
|
|
|
switch (mud_packet->mEffect[i].mStatus) {
|
|
case 0:
|
|
mud_packet->mEffect[i].field_0x34 = 2.5f * (0.5f + cM_rndF(0.5f));
|
|
mud_packet->mEffect[i].field_0x40 = 0;
|
|
mud_packet->mEffect[i].field_0x42 = cM_rndFX(65536.0f);
|
|
mud_packet->mEffect[i].mBasePos.x = spA4.x;
|
|
mud_packet->mEffect[i].mBasePos.y = 0.0f;
|
|
mud_packet->mEffect[i].mBasePos.z = spA4.z;
|
|
mud_packet->mEffect[i].mPosition.x = cM_rndFX(temp_f31);
|
|
mud_packet->mEffect[i].mPosition.y = 0.0f;
|
|
mud_packet->mEffect[i].mPosition.z = cM_rndFX(temp_f31);
|
|
mud_packet->mEffect[i].field_0x38 = 0.0f;
|
|
mud_packet->mEffect[i].field_0x3c = 0.0f;
|
|
mud_packet->mEffect[i].field_0x28 = cM_rndF(360.0f);
|
|
mud_packet->mEffect[i].field_0x2c = cM_rndF(360.0f);
|
|
mud_packet->mEffect[i].field_0x30 = cM_rndF(360.0f);
|
|
|
|
mud_packet->mEffect[i].mStatus++;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
if (mud_packet->mEffect[i].mStatus == 1) {
|
|
f32 sp24 = 4.0f;
|
|
f32 sp28 = cM_fsin(mud_packet->mEffect[i].field_0x28);
|
|
|
|
mud_packet->mEffect[i].mPosition.x += sp28 * mud_packet->mEffect[i].field_0x34;
|
|
mud_packet->mEffect[i].mPosition.z += mud_packet->mEffect[i].field_0x34 * cM_fsin(mud_packet->mEffect[i].field_0x30);
|
|
mud_packet->mEffect[i].field_0x28 += 0.03f;
|
|
mud_packet->mEffect[i].field_0x2c += 0.02f;
|
|
mud_packet->mEffect[i].field_0x30 += 0.01f;
|
|
}
|
|
|
|
cXyz sp50;
|
|
sp68.x = mud_packet->mEffect[i].mBasePos.x + mud_packet->mEffect[i].mPosition.x;
|
|
sp68.y = 0.0f;
|
|
sp68.z = mud_packet->mEffect[i].mBasePos.z + mud_packet->mEffect[i].mPosition.z;
|
|
|
|
sp50 = spA4;
|
|
sp50.y = sp68.y;
|
|
|
|
f32 sp20 = sp68.abs(sp50);
|
|
if (sp20 > temp_f31) {
|
|
sp8 = 1;
|
|
if (mud_packet->mEffect[i].field_0x38 < 0.01f) {
|
|
mud_packet->mEffect[i].mBasePos = sp50;
|
|
|
|
if (sp68.abs(sp50) > temp_f31 + (0.1f * temp_f31)) {
|
|
mud_packet->mEffect[i].mPosition.x = cM_rndFX(temp_f31);
|
|
mud_packet->mEffect[i].mPosition.y = 0.0f;
|
|
mud_packet->mEffect[i].mPosition.z = cM_rndFX(temp_f31);
|
|
} else {
|
|
get_vectle_calc(&sp68, &sp50, &sp5C);
|
|
sp5C.x += cM_rndFX(0.2f);
|
|
sp5C.y = 0.0f;
|
|
sp5C.z += cM_rndFX(0.2f);
|
|
|
|
mud_packet->mEffect[i].mPosition.x = sp5C.x * temp_f31;
|
|
mud_packet->mEffect[i].mPosition.y = 0.0f;
|
|
mud_packet->mEffect[i].mPosition.z = sp5C.z * temp_f31;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
f32 sp1C = 0.05f;
|
|
f32 sp18 = 1.0f;
|
|
f32 sp14 = 0.0f;
|
|
|
|
mud_packet->mEffect[i].mBasePos.y = 0.0f;
|
|
mud_packet->mEffect[i].mPosition.y = sp14 - (1.0f + (f32)i);
|
|
|
|
f32 sp10 = 1.0f;
|
|
if (sp8 != 0) {
|
|
sp10 = 0.0f;
|
|
}
|
|
|
|
cLib_addCalc(&mud_packet->mEffect[i].field_0x38, sp10 * mud_packet->field_0x1c3c, 0.25f, sp1C, 0.000001f);
|
|
|
|
sp68.x = mud_packet->mEffect[i].mBasePos.x + mud_packet->mEffect[i].mPosition.x;
|
|
sp68.y = camera->lookat.eye.y;
|
|
sp68.z = mud_packet->mEffect[i].mBasePos.z + mud_packet->mEffect[i].mPosition.z;
|
|
|
|
f32 spC = sp68.abs(camera->lookat.eye);
|
|
f32 var_f30 = spC / 400.0f;
|
|
if (var_f30 > 1.0f) {
|
|
var_f30 = 1.0f;
|
|
}
|
|
|
|
mud_packet->mEffect[i].field_0x3c = var_f30;
|
|
}
|
|
}
|
|
|
|
/* 8006D01C-8006D914 06795C 08F8+00 0/0 1/1 0/0 .text dKyr_mud_draw__FPA4_fPPUc */
|
|
void dKyr_mud_draw(Mtx drawMtx, u8** tex) {
|
|
dKankyo_mud_Packet* mud_packet = g_env_light.mpMudPacket;
|
|
dKankyo_sun_Packet* sun_packet = g_env_light.mpSunPacket;
|
|
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
cXyz pos[4];
|
|
cXyz sp70;
|
|
Vec sp64;
|
|
|
|
GXColorS10 sp50;
|
|
GXColor color_reg0;
|
|
GXColor color_reg1;
|
|
|
|
camera_class* sp34 = (camera_class*)dComIfGp_getCamera(0);
|
|
s16 spC = g_env_light.bg_amb_col[1].a;
|
|
dKankyo_sunlenz_Packet* lenz_packet = g_env_light.mpSunLenzPacket;
|
|
|
|
if (mud_packet->mEffectNum != 0) {
|
|
j3dSys.reinitGX();
|
|
f32 var_f31 = 255.0f;
|
|
|
|
if (g_env_light.field_0x1300 != -1) {
|
|
spC = g_env_light.field_0x1300;
|
|
}
|
|
|
|
sp50.r = 1.3f * g_env_light.bg_amb_col[1].r;
|
|
sp50.g = 1.3f * g_env_light.bg_amb_col[1].g;
|
|
sp50.b = 1.3f * g_env_light.bg_amb_col[1].b;
|
|
|
|
if (sp50.r >= 0xFF) {
|
|
sp50.r = 0xFF;
|
|
}
|
|
if (sp50.g >= 0xFF) {
|
|
sp50.g = 0xFF;
|
|
}
|
|
if (sp50.b >= 0xFF) {
|
|
sp50.b = 0xFF;
|
|
}
|
|
|
|
color_reg0.r = sp50.r;
|
|
color_reg0.g = sp50.g;
|
|
color_reg0.b = sp50.b;
|
|
color_reg0.a = 0xFF;
|
|
|
|
var_f31 = spC;
|
|
var_f31 *= spC / 255.0f;
|
|
var_f31 *= 0.25f + (0.75f * (g_env_light.field_0x1302 / 255.0f));
|
|
|
|
if (lenz_packet != NULL && sun_packet->mVisibility > 0.000001f) {
|
|
var_f31 = (u8)(var_f31 * (1.0f - (sun_packet->mVisibility * (1.0f - (lenz_packet->mDistFalloff * lenz_packet->mDistFalloff * lenz_packet->mDistFalloff)))));
|
|
}
|
|
|
|
color_reg1.r = 0.5f * g_env_light.bg_amb_col[1].r;
|
|
color_reg1.g = 0.5f * g_env_light.bg_amb_col[1].g;
|
|
color_reg1.b = 0.5f * g_env_light.bg_amb_col[1].b;
|
|
color_reg1.a = 0xFF;
|
|
|
|
if (strcmp(dComIfGp_getStartStageName(), "D_MN05A") == 0) {
|
|
f32 temp_f29 = 1.0f - mud_packet->field_0x1c3c;
|
|
|
|
color_reg0.r = 0x60;
|
|
color_reg0.g = 0x41;
|
|
color_reg0.b = 0x45;
|
|
color_reg0.a = 0x64;
|
|
|
|
var_f31 = 100.0f;
|
|
|
|
color_reg1.r = 0xD1;
|
|
color_reg1.g = 0xEF;
|
|
color_reg1.b = 0;
|
|
|
|
color_reg0.r = (u8)(color_reg0.r + (s16)((20.0f - color_reg0.r) * temp_f29));
|
|
color_reg0.g = (u8)(color_reg0.g + (s16)((100.0f - color_reg0.g) * temp_f29));
|
|
color_reg0.b = (u8)(color_reg0.b + (s16)((120.0f - color_reg0.b) * temp_f29));
|
|
color_reg0.a = (u8)(color_reg0.a + (s16)(-(f32)color_reg0.b * temp_f29));
|
|
|
|
var_f31 = color_reg0.a;
|
|
|
|
color_reg1.r = (u8)(color_reg1.r + (s16)((20.0f - color_reg1.r) * temp_f29));
|
|
color_reg1.g = (u8)(color_reg1.g + (s16)((100.0f - color_reg1.g) * temp_f29));
|
|
color_reg1.b = (u8)(color_reg1.b + (s16)((120.0f - color_reg1.b) * temp_f29));
|
|
}
|
|
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
if (g_env_light.camera_water_in_status == 0) {
|
|
for (int i = 0; i < 1; i++) {
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[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_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
|
|
if (g_env_light.camera_water_in_status != 0) {
|
|
GXSetZMode(GX_DISABLE, GX_LEQUAL, GX_ENABLE);
|
|
} else {
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
GXSetNumIndStages(0);
|
|
dKr_cullVtx_Set();
|
|
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
|
|
for (int j = 0; j < mud_packet->mEffectNum; j++) {
|
|
fopAc_ac_c* sp28 = dComIfGp_getPlayer(0);
|
|
cXyz sp58;
|
|
sp70.x = mud_packet->mEffect[j].mBasePos.x + mud_packet->mEffect[j].mPosition.x;
|
|
sp70.y = mud_packet->mEffect[j].mBasePos.y + mud_packet->mEffect[j].mPosition.y;
|
|
sp70.z = mud_packet->mEffect[j].mBasePos.z + mud_packet->mEffect[j].mPosition.z;
|
|
|
|
color_reg0.a = mud_packet->mEffect[j].field_0x38 * var_f31;
|
|
|
|
GXLoadTexObj(&texobj, GX_TEXMAP0);
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
|
|
f32 sp30 = 1.0f;
|
|
|
|
f32 temp_f26 = 45.0f * (12.0f * sp30 * mud_packet->mEffect[j].field_0x3c);
|
|
temp_f26 *= 0.25f;
|
|
f32 temp_f30 = temp_f26;
|
|
|
|
f32 temp_f28 = mud_packet->mEffect[j].field_0x3c * cM_fsin(mud_packet->mEffect[j].field_0x28 * (5.0f * mud_packet->mEffect[j].field_0x3c));
|
|
f32 temp_f27 = mud_packet->mEffect[j].field_0x3c * cM_fcos(mud_packet->mEffect[j].field_0x2c * (5.0f * mud_packet->mEffect[j].field_0x3c));
|
|
|
|
sp64.x = temp_f30 - temp_f27;
|
|
sp64.y = 0.0f;
|
|
sp64.z = temp_f30 - temp_f28;
|
|
pos[0].x = sp70.x + sp64.x;
|
|
pos[0].y = sp70.y + sp64.y;
|
|
pos[0].z = sp70.z + sp64.z;
|
|
|
|
sp64.x = -temp_f30 - temp_f27;
|
|
sp64.y = 0.0f;
|
|
sp64.z = temp_f30 - temp_f28;
|
|
pos[1].x = sp70.x + sp64.x;
|
|
pos[1].y = sp70.y + sp64.y;
|
|
pos[1].z = sp70.z + sp64.z;
|
|
|
|
sp64.x = -temp_f30 - temp_f27;
|
|
sp64.y = 0.0f;
|
|
sp64.z = -temp_f30 - temp_f28;
|
|
pos[2].x = sp70.x + sp64.x;
|
|
pos[2].y = sp70.y + sp64.y;
|
|
pos[2].z = sp70.z + sp64.z;
|
|
|
|
sp64.x = temp_f30 - temp_f27;
|
|
sp64.y = 0.0f;
|
|
sp64.z = -temp_f30 - temp_f28;
|
|
pos[3].x = sp70.x + sp64.x;
|
|
pos[3].y = sp70.y + sp64.y;
|
|
pos[3].z = sp70.z + sp64.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();
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 8006D914-8006DA04 068254 00F0+00 0/0 1/1 1/1 .text dKyr_evil_init__Fv */
|
|
void dKyr_evil_init() {
|
|
if (g_env_light.mpEvilPacket != NULL) {
|
|
g_env_light.mpEvilPacket->mpMoyaRes = (u8*)dComIfG_getObjectRes("Always", 0x53);
|
|
g_env_light.mpEvilPacket->mpKumoLightRes = (u8*)dComIfG_getStageRes("F_kumolight_01.bti");
|
|
|
|
if (g_env_light.mpEvilPacket->mpKumoLightRes == NULL) {
|
|
g_env_light.mpEvilPacket->mpKumoLightRes = (u8*)dComIfG_getObjectRes("Always", 0x53);
|
|
}
|
|
|
|
for (int i = 0; i < 2000; i++) {
|
|
g_env_light.mpEvilPacket->mEffect[i].mStatus = 0;
|
|
}
|
|
|
|
g_env_light.mpEvilPacket->mEffectNum = 0;
|
|
}
|
|
}
|
|
|
|
/* 8006DA04-8006DA7C 068344 0078+00 0/0 1/1 0/0 .text dKyr_evil_move__Fv */
|
|
void dKyr_evil_move() {
|
|
dKankyo_evil_Packet* evil_packet = g_env_light.mpEvilPacket;
|
|
cXyz vec = dKyw_get_wind_vecpow();
|
|
|
|
dBgS_GndChk gndchk;
|
|
for (int i = 0; i < evil_packet->mEffectNum; i++) {}
|
|
}
|
|
|
|
/* 8006DA7C-8006E448 0683BC 09CC+00 1/1 0/0 0/0 .text dKyr_evil_draw2__FPA4_fPPUc */
|
|
static void dKyr_evil_draw2(Mtx drawMtx, u8** tex) {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_evil_Packet* evil_packet = envlight->mpEvilPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
cXyz spA0;
|
|
f32 sp48 = fabsf(cM_ssin(g_Counter.mCounter0 * 40));
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
if (evil_packet != NULL) {
|
|
j3dSys.reinitGX();
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
OS_REPORT("\nevil_draw return!!");
|
|
return;
|
|
}
|
|
|
|
GXColor color_reg0;
|
|
GXColor color_reg1;
|
|
|
|
color_reg1.r = 255.0f * sp48;
|
|
color_reg1.g = 120.0f * sp48;
|
|
color_reg1.b = 0;
|
|
color_reg1.a = 0xFF;
|
|
|
|
color_reg0.r = 0xFF;
|
|
color_reg0.g = 0x9F;
|
|
color_reg0.b = 0x87;
|
|
color_reg0.a = 0xFF;
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[1]);
|
|
|
|
rot += 0.7f;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
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_TEXA, GX_CA_A0, 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_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_COPY);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZCompLoc(GX_TRUE);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
|
|
for (int i = 0; i < g_env_light.field_0x1054; i++) {
|
|
EF_EVIL_EFF* effect = &evil_packet->mEffect[i];
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
cXyz pos[4];
|
|
Vec sp94, sp88;
|
|
cXyz sp7C;
|
|
f32 var_f31 = effect->field_0x38;
|
|
|
|
if (effect->mStatus != 0 && (i & 1)) {
|
|
f32 temp_f30 = 0.2f + (0.8f * fabsf(cM_ssin(effect->field_0x3c)));
|
|
sp7C = effect->mBasePos + effect->mPosition;
|
|
|
|
if ((strcmp(dComIfGp_getStartStageName(), "D_MN08") != 0 || dComIfGp_roomControl_getStayNo() != 1 || i < 1600 || !(camera->lookat.eye.x >= -5000.0f)) && !(var_f31 > 9000.0f)) {
|
|
if (dComIfGd_getView()->fovy > 40.0f) {
|
|
cXyz proj;
|
|
Vec sp34;
|
|
sp34.x = 80.0f;
|
|
sp34.y = 80.0f;
|
|
sp34.z = 80.0f;
|
|
|
|
mDoLib_project(&sp7C, &proj);
|
|
|
|
if (!(proj.x > -sp34.x) || !(proj.x < (608.0f + sp34.x)) ||
|
|
!(proj.y > -sp34.y) || !(proj.y < (458.0f + sp34.z)))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
f32 sp40;
|
|
f32 sp3C = 150.0f;
|
|
f32 sp38 = 250.0f;
|
|
|
|
f32 var_f29 = camera->lookat.eye.abs(sp7C);
|
|
if (var_f29 < sp38) {
|
|
if (var_f29 < sp3C) {
|
|
var_f29 = 0.0f;
|
|
} else {
|
|
var_f29 = (var_f29 - sp3C) / (sp38 - sp3C);
|
|
if (var_f29 < 0.0f) {
|
|
var_f29 = 0.0f;
|
|
} else if (var_f29 > 1.0f) {
|
|
var_f29 = 1.0f;
|
|
}
|
|
}
|
|
} else {
|
|
var_f29 = 1.0f;
|
|
}
|
|
|
|
sp40 = effect->field_0x24 * var_f29;
|
|
var_f31 *= 0.5f + (0.5f * var_f29);
|
|
var_f31 *= 0.2f + (0.4f * temp_f30);
|
|
if (dComIfGp_roomControl_getStayNo() == 0) {
|
|
var_f31 = 100.0f;
|
|
}
|
|
|
|
if (!(sp40 <= 0.000001f)) {
|
|
color_reg0.a = 255.0f * sp40;
|
|
|
|
if (daPy_py_c::checkNowWolfPowerUp()) {
|
|
color_reg0.r = 80.0f * temp_f30;
|
|
color_reg0.g = 0;
|
|
color_reg0.b = 0;
|
|
color_reg0.a = 0x28;
|
|
|
|
color_reg1.r = 0x1E;
|
|
color_reg1.g = 0;
|
|
color_reg1.b = 0;
|
|
color_reg1.a = 0x28;
|
|
} else {
|
|
color_reg1.r = 255.0f * temp_f30;
|
|
color_reg1.g = 120.0f * (temp_f30 * temp_f30);
|
|
color_reg1.b = 20.0f * (temp_f30 * temp_f30 * temp_f30);
|
|
|
|
color_reg0.r = 255.0f * temp_f30;
|
|
color_reg0.g = 159.0f * (temp_f30 * temp_f30);
|
|
color_reg0.b = 135.0f * (temp_f30 * temp_f30);
|
|
}
|
|
|
|
color_reg0.a = 0xFF;
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
|
|
spA0 = sp7C;
|
|
|
|
sp94.x = -var_f31;
|
|
sp94.y = var_f31;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[0].x = spA0.x + sp88.x;
|
|
pos[0].y = spA0.y + sp88.y;
|
|
pos[0].z = spA0.z + sp88.z;
|
|
|
|
sp94.x = var_f31;
|
|
sp94.y = var_f31;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[1].x = spA0.x + sp88.x;
|
|
pos[1].y = spA0.y + sp88.y;
|
|
pos[1].z = spA0.z + sp88.z;
|
|
|
|
sp94.x = var_f31;
|
|
sp94.y = -var_f31;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[2].x = spA0.x + sp88.x;
|
|
pos[2].y = spA0.y + sp88.y;
|
|
pos[2].z = spA0.z + sp88.z;
|
|
|
|
sp94.x = -var_f31;
|
|
sp94.y = -var_f31;
|
|
sp94.z = 0.0f;
|
|
cMtx_multVec(camMtx, &sp94, &sp88);
|
|
pos[3].x = spA0.x + sp88.x;
|
|
pos[3].y = spA0.y + sp88.y;
|
|
pos[3].z = spA0.z + sp88.z;
|
|
|
|
for (int j = 0; j < 1; j++) {
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
J3DShape::resetVcdVatCache();
|
|
}
|
|
}
|
|
|
|
/* 8006E448-8006E6B0 068D88 0268+00 1/1 0/0 0/0 .text dKyr_near_bosslight_check__F4cXyz
|
|
*/
|
|
static f32 dKyr_near_bosslight_check(cXyz pos) {
|
|
f32 nearest_dist = 10000000.0f;
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
if (envlight->field_0x0c18[i].field_0x26 == 1) {
|
|
if (envlight->field_0x0c18[i].mPos.abs(pos) < nearest_dist) {
|
|
nearest_dist = envlight->field_0x0c18[i].mPos.abs(pos);
|
|
}
|
|
}
|
|
}
|
|
|
|
return nearest_dist;
|
|
}
|
|
|
|
/* 8006E6B0-8006F160 068FF0 0AB0+00 0/0 1/1 0/0 .text dKyr_evil_draw__FPA4_fPPUc */
|
|
void dKyr_evil_draw(Mtx drawMtx, u8** tex) {
|
|
dScnKy_env_light_c* envlight = dKy_getEnvlight();
|
|
dKankyo_evil_Packet* evil_packet = envlight->mpEvilPacket;
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
static f32 rot = 0.0f;
|
|
|
|
Mtx camMtx;
|
|
Mtx rotMtx;
|
|
cXyz spC8;
|
|
|
|
GXColor color_reg0;
|
|
GXColor color_reg1;
|
|
f32 sp64 = fabsf(cM_ssin(g_Counter.mCounter0 * 40));
|
|
f32 sp60 = fabsf(cM_ssin(g_Counter.mCounter0 * 215));
|
|
|
|
if (evil_packet != NULL) {
|
|
j3dSys.reinitGX();
|
|
if (dComIfGd_getView() != NULL) {
|
|
MTXInverse(dComIfGd_getView()->viewMtxNoTrans, camMtx);
|
|
} else {
|
|
OS_REPORT("\nevil_draw return!!");
|
|
return;
|
|
}
|
|
|
|
color_reg0.r = 69.0f * sp64;
|
|
color_reg0.g = 45.0f * sp64;
|
|
color_reg0.b = 137.0f * sp64;
|
|
color_reg0.a = 0;
|
|
|
|
color_reg1.r = 10;
|
|
color_reg1.g = 0;
|
|
color_reg1.b = 10;
|
|
color_reg1.a = 255;
|
|
|
|
GXTexObj texobj;
|
|
dKyr_set_btitex(&texobj, (ResTIMG*)tex[0]);
|
|
|
|
rot += 1.0f;
|
|
MTXRotRad(rotMtx, 'Z', DEG_TO_RAD(rot));
|
|
MTXConcat(camMtx, rotMtx, camMtx);
|
|
|
|
GXLoadPosMtxImm(drawMtx, GX_PNMTX0);
|
|
GXSetCurrentMtx(GX_PNMTX0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0);
|
|
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBA4, 8);
|
|
GXClearVtxDesc();
|
|
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
|
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
|
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_TEXA, GX_CA_A0, 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_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET);
|
|
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
|
|
GXSetZCompLoc(GX_TRUE);
|
|
GXSetZMode(GX_ENABLE, GX_LEQUAL, GX_DISABLE);
|
|
GXSetCullMode(GX_CULL_NONE);
|
|
GXSetClipMode(GX_CLIP_DISABLE);
|
|
GXSetNumIndStages(0);
|
|
|
|
dComIfG_Ccsp()->PrepareMass();
|
|
|
|
for (int i = 0; i < g_env_light.field_0x1054; i++) {
|
|
EF_EVIL_EFF* effect = &evil_packet->mEffect[i];
|
|
camera_class* camera = (camera_class*)dComIfGp_getCamera(0);
|
|
|
|
cXyz pos[4];
|
|
Vec spBC, spB0;
|
|
cXyz spA4;
|
|
|
|
f32 temp_f30 = effect->field_0x38;
|
|
|
|
if (effect->mStatus != 0) {
|
|
spA4 = effect->mBasePos + effect->mPosition;
|
|
|
|
if (!(temp_f30 > 9000.0f)) {
|
|
if (dComIfGd_getView()->fovy > 40.0f) {
|
|
cXyz proj;
|
|
Vec sp44;
|
|
sp44.x = 80.0f;
|
|
sp44.y = 80.0f;
|
|
sp44.z = 80.0f;
|
|
|
|
mDoLib_project(&spA4, &proj);
|
|
|
|
if (!(proj.x > -sp44.x) || !(proj.x < (608.0f + sp44.x)) ||
|
|
!(proj.y > -sp44.y) || !(proj.y < (458.0f + sp44.z)))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
f32 sp5C;
|
|
f32 sp50 = 50.0f;
|
|
f32 sp4C = 800.0f;
|
|
|
|
f32 var_f31 = camera->lookat.eye.abs(spA4);
|
|
if (var_f31 < sp4C) {
|
|
if (var_f31 < sp50) {
|
|
var_f31 = 0.0f;
|
|
} else {
|
|
var_f31 = (var_f31 - sp50) / (sp4C - sp50);
|
|
if (var_f31 < 0.0f) {
|
|
var_f31 = 0.0f;
|
|
} else if (var_f31 > 1.0f) {
|
|
var_f31 = 1.0f;
|
|
}
|
|
var_f31 = 1.0f - var_f31;
|
|
var_f31 *= var_f31;
|
|
var_f31 = 1.0f - var_f31;
|
|
}
|
|
} else {
|
|
var_f31 = 1.0f;
|
|
}
|
|
|
|
f32 sp54 = effect->field_0x24 * var_f31;
|
|
temp_f30 *= var_f31;
|
|
temp_f30 = 1.8f * temp_f30;
|
|
|
|
if (!(sp54 <= 0.000001f)) {
|
|
color_reg0.a = 255.0f * sp54;
|
|
|
|
f32 bosslight_dist = dKyr_near_bosslight_check(spA4);
|
|
if (bosslight_dist < 5000.0f) {
|
|
f32 sp34 = (1.0f - (bosslight_dist / 5000.0f));
|
|
sp5C = 0.1f + (0.9f * sp34 * fabsf(cM_ssin(g_Counter.mCounter0 * ((i & 7) + 601))));
|
|
} else {
|
|
sp5C = 0.0f;
|
|
}
|
|
cLib_addCalc(&effect->field_0x2c, sp5C, 0.5f, 0.1f, 0.01f);
|
|
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
if (player != NULL && player->getKandelaarFlamePos() != NULL) {
|
|
color_reg1.r = 120.0f * effect->field_0x2c;
|
|
color_reg1.g = 140.0f * effect->field_0x2c;
|
|
color_reg1.b = 165.0f * effect->field_0x2c;
|
|
} else {
|
|
color_reg1.r = 80.0f * effect->field_0x2c;
|
|
color_reg1.g = 130.0f * effect->field_0x2c;
|
|
color_reg1.b = 155.0f * effect->field_0x2c;
|
|
}
|
|
|
|
if (dComIfGp_roomControl_getStayNo() == 0 && effect->mBasePos.y < 0.0f) {
|
|
f32 sp48 = (1.0f - effect->mBasePos.y / -3000.0f);
|
|
if (sp48 > 1.0f) {
|
|
sp48 = 1.0f;
|
|
} else if (sp48 < 0.0f) {
|
|
sp48 = 0.0f;
|
|
}
|
|
|
|
color_reg0.a = 255.0f * sp48;
|
|
}
|
|
|
|
f32 sp2C = (f32)i / (f32)g_env_light.field_0x1054;
|
|
sp2C = (i & 15) / 15.0f;
|
|
|
|
if (daPy_py_c::checkNowWolfPowerUp()) {
|
|
color_reg0.r = (int)(127.0f * fabsf(sp2C - sp64)) + 0x80;
|
|
color_reg0.g = 0x80;
|
|
color_reg0.b = (int)(127.0f * fabsf(sp2C - sp64)) + 0x80;
|
|
color_reg0.a = 0x23;
|
|
} else {
|
|
f32 sp28 = 0.0f;
|
|
if (effect->mStatus == 2) {
|
|
sp28 = 1.0f - effect->field_0x24;
|
|
}
|
|
|
|
color_reg0.r = (50.0f * sp28) + (15.0f * fabsf(sp2C - sp64));
|
|
color_reg0.g = 100.0f * sp28;
|
|
color_reg0.b = (115.0f * sp28) + (15.0f * fabsf(sp2C - sp64));
|
|
}
|
|
|
|
GXSetTevColor(GX_TEVREG0, color_reg0);
|
|
GXSetTevColor(GX_TEVREG1, color_reg1);
|
|
|
|
spC8 = spA4;
|
|
|
|
spBC.x = -temp_f30;
|
|
spBC.y = temp_f30;
|
|
spBC.z = 0.0f;
|
|
cMtx_multVec(camMtx, &spBC, &spB0);
|
|
pos[0].x = spC8.x + spB0.x;
|
|
pos[0].y = spC8.y + spB0.y;
|
|
pos[0].z = spC8.z + spB0.z;
|
|
|
|
spBC.x = temp_f30;
|
|
spBC.y = temp_f30;
|
|
spBC.z = 0.0f;
|
|
cMtx_multVec(camMtx, &spBC, &spB0);
|
|
pos[1].x = spC8.x + spB0.x;
|
|
pos[1].y = spC8.y + spB0.y;
|
|
pos[1].z = spC8.z + spB0.z;
|
|
|
|
spBC.x = temp_f30;
|
|
spBC.y = -temp_f30;
|
|
spBC.z = 0.0f;
|
|
cMtx_multVec(camMtx, &spBC, &spB0);
|
|
pos[2].x = spC8.x + spB0.x;
|
|
pos[2].y = spC8.y + spB0.y;
|
|
pos[2].z = spC8.z + spB0.z;
|
|
|
|
spBC.x = -temp_f30;
|
|
spBC.y = -temp_f30;
|
|
spBC.z = 0.0f;
|
|
cMtx_multVec(camMtx, &spBC, &spB0);
|
|
pos[3].x = spC8.x + spB0.x;
|
|
pos[3].y = spC8.y + spB0.y;
|
|
pos[3].z = spC8.z + spB0.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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
J3DShape::resetVcdVatCache();
|
|
GXSetClipMode(GX_CLIP_ENABLE);
|
|
|
|
if (!daPy_py_c::checkNowWolfPowerUp()) {
|
|
dKyr_evil_draw2(drawMtx, tex);
|
|
}
|
|
}
|
|
}
|