tp/src/d/actor/d_a_vrbox2.cpp

487 lines
16 KiB
C++

/**
* @file d_a_vrbox2.cpp
*
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_vrbox2.h"
#include "d/d_com_inf_game.h"
#include "d/d_procname.h"
#include "d/d_kankyo_rain.h"
#include "f_op/f_op_camera_mng.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "SSystem/SComponent/c_math.h"
static int daVrbox2_color_set(vrbox2_class* param_0);
/* 80498A78-80498ACC 000078 0054+00 1/1 0/0 0/0 .text texScrollCheck__FRf */
static void texScrollCheck(f32& param_0) {
while (param_0 < 0.0f)
param_0 += 1.0f;
while (param_0 > 1.0f)
param_0 -= 1.0f;
}
/* 80498ACC-804990DC 0000CC 0610+00 1/0 0/0 0/0 .text daVrbox2_Draw__FP12vrbox2_class */
// NONMATCHING - reg alloc
static int daVrbox2_Draw(vrbox2_class* i_this) {
camera_class* camera_p;
dKankyo_sunlenz_Packet* lenz_p;
J3DModel* kumo_model_p;
J3DModel* sun_model_p;
J3DModel* sun2_model_p;
J3DModel* kasumim_model_p;
dKankyo_sun_Packet* sun_p;
dStage_FileList_dt_c* filelist_p;
J3DModelData* sp38;
J3DModelData* sp34;
J3DModelData* sp30;
s16 temp_r19;
s16 temp_r18;
camera_p = dComIfGp_getCamera(0);
lenz_p = g_env_light.mpSunLenzPacket;
kumo_model_p = i_this->mpKumoModel;
sun_model_p = i_this->model2;
sun2_model_p = i_this->model2_und;
kasumim_model_p = i_this->mpKasumimModel;
sun_p = g_env_light.mpSunPacket;
f32 var_f31 = 0.0f;
filelist_p = NULL;
dKy_GxFog_set();
// these casts look like fake matches, but this ptr is used as both J3DModel and J3DModelData?
sp38 = (J3DModelData*)kumo_model_p;
sp34 = (J3DModelData*)sun_model_p;
sp30 = (J3DModelData*)kasumim_model_p;
for (int i = sp38->getMaterialNum() - 1; i >= 0; i--) {
J3DMaterial* material_p = sp38->getMaterialNodePointer(i);
J3DFogInfo* fogInfo_p;
if (material_p != NULL) {
fogInfo_p = material_p->getFog()->getFogInfo();
}
fogInfo_p->mType = 2;
}
for (int i = sp34->getMaterialNum() - 1; i >= 0; i--) {
J3DMaterial* material_p = sp34->getMaterialNodePointer(i);
J3DFogInfo* fogInfo_p;
if (material_p != NULL) {
fogInfo_p = material_p->getFog()->getFogInfo();
}
fogInfo_p->mType = 2;
}
for (int i = sp30->getMaterialNum() - 1; i >= 0; i--) {
J3DMaterial* material_p = sp30->getMaterialNodePointer(i);
J3DFogInfo* fogInfo_p;
if (material_p != NULL) {
fogInfo_p = material_p->getFog()->getFogInfo();
}
fogInfo_p->mType = 2;
}
if ((g_env_light.vrbox_kasumi_outer_col.r + g_env_light.vrbox_kasumi_outer_col.g +
g_env_light.vrbox_kasumi_outer_col.b + g_env_light.vrbox_sky_col.r + g_env_light.vrbox_sky_col.g +
g_env_light.vrbox_sky_col.b + g_env_light.vrbox_kumo_top_col.r + g_env_light.vrbox_kumo_top_col.g +
g_env_light.vrbox_kumo_top_col.b) == 0)
{
return 1;
}
i_this->mSunBtk.entry(i_this->model2->getModelData());
daVrbox2_color_set(i_this);
if (dComIfGp_roomControl_getStayNo() >= 0) {
filelist_p = dComIfGp_roomControl_getStatusRoomDt(dComIfGp_roomControl_getStayNo())->getFileListInfo();
}
if (filelist_p != NULL) {
var_f31 = dStage_FileList_dt_SeaLevel(filelist_p);
}
#ifdef DEBUG
if (g_kankyoHIO.vrbox.field_0x14 != 0) {
var_f31 = g_kankyoHIO.vrbox.m_horizonHeight;
} else {
g_kankyoHIO.vrbox.m_horizonHeight = var_f31;
}
#endif
f32 f29;
if (dComIfGd_getView() != NULL) {
f29 = (dComIfGd_getInvViewMtx()[1][3] - var_f31) * 0.09f;
} else {
f29 = 0.0f;
}
dComIfGd_setListSky();
mDoMtx_stack_c::transS(dComIfGd_getInvViewMtx()[0][3], dComIfGd_getInvViewMtx()[1][3] - f29,
dComIfGd_getInvViewMtx()[2][3]);
kasumim_model_p->setBaseTRMtx(mDoMtx_stack_c::get());
mDoExt_modelUpdateDL(kasumim_model_p);
mDoMtx_stack_c::transS(dComIfGd_getInvViewMtx()[0][3], dComIfGd_getInvViewMtx()[1][3] - f29,
dComIfGd_getInvViewMtx()[2][3]);
kumo_model_p->setBaseTRMtx(mDoMtx_stack_c::get());
mDoExt_modelUpdateDL(kumo_model_p);
if (dStage_stagInfo_GetArg0(dComIfGp_getStage()->getStagInfo()) != 0 && sun_model_p != NULL &&
sun_p != NULL && sun_p->mSunAlpha > 0.0f)
{
cXyz sp14;
sp14 = sun_p->mPos[0];
#ifndef DEBUG
cXyz sp8;
if (strcmp(dComIfGp_getStartStageName(), "F_SP102") == 0) {
dKyr_get_vectle_calc(&camera_p->lookat.eye, &g_env_light.sun_pos, &sp8);
sp14.x = camera_p->lookat.eye.x + (8000.0f * sp8.x);
sp14.y = camera_p->lookat.eye.y + (8000.0f * sp8.y);
sp14.z = camera_p->lookat.eye.z + (8000.0f * sp8.z);
}
#endif
temp_r19 = cLib_targetAngleX(&camera_p->lookat.eye, &sp14);
temp_r18 = cLib_targetAngleY(&camera_p->lookat.eye, &sp14);
mDoMtx_stack_c::transS(sp14.x, sp14.y, sp14.z);
mDoMtx_stack_c::YrotM((s16)temp_r18);
mDoMtx_stack_c::XrotM(0x7FFF + -temp_r19);
f32 scale;
if (g_env_light.daytime < 255.0f) {
f32 temp_f4 = 1.0f - lenz_p->mDistFalloff;
scale = 1.0f;
if (sun_p->mVisibility > 0.0f) {
scale = 1.0f + (sun_p->mVisibility * (0.4f * (temp_f4 * temp_f4)));
}
} else {
f32 var_f1;
if (g_env_light.daytime < 270.0f) {
var_f1 = dKy_get_parcent(270.0f, 240.0f, g_env_light.daytime);
} else {
var_f1 = 1.0f;
}
scale = 1.0f + (0.2f * var_f1);
}
mDoMtx_stack_c::scaleM(scale, scale, scale);
sun_model_p->setBaseTRMtx(mDoMtx_stack_c::get());
mDoExt_modelUpdateDL(sun_model_p);
if (strcmp(dComIfGp_getStartStageName(), "F_SP127") == 0) {
/* 80499B78-80499B7C 000000 0002+02 1/1 0/0 0/0 .bss mangZ$3688 */
static s16 mangZ;
sp14 = sun_p->mPos[0];
sp14.y = 300.0f + -(sp14.y * 0.85f);
temp_r19 = cLib_targetAngleX(&camera_p->lookat.eye, &sp14);
temp_r18 = cLib_targetAngleY(&camera_p->lookat.eye, &sp14);
mDoMtx_stack_c::transS(sp14.x, sp14.y, sp14.z);
mDoMtx_stack_c::YrotM((s16)temp_r18);
mDoMtx_stack_c::XrotM(0x7FFF + -temp_r19);
mDoMtx_stack_c::ZrotM(mangZ);
mDoMtx_stack_c::scaleM(scale, scale + 0.15f, scale);
mDoMtx_stack_c::ZrotM(-mangZ);
sun2_model_p->setBaseTRMtx(mDoMtx_stack_c::get());
mDoExt_modelUpdateDL(sun2_model_p);
mangZ += (s16)(483.0f + cM_rndF(100.0f));
}
}
dComIfGd_setList();
if (sun_model_p != NULL) {
i_this->mSunBtk.remove(i_this->model2->getModelData());
}
return 1;
}
/* 804990DC-804997E8 0006DC 070C+00 1/1 0/0 0/0 .text daVrbox2_color_set__FP12vrbox2_class */
static int daVrbox2_color_set(vrbox2_class* i_this) {
fopAc_ac_c* actor = i_this;
J3DMaterial* material_0;
J3DModelData* modelData;
J3DTexMtxInfo* mtx_info;
GXColor k_color;
camera_class* camera_p;
GXColorS10 color;
cXyz* windVec_p;
u32 sp10;
cXyz* sp0C;
dKankyo_sun_Packet* sun_p;
sun_p = g_env_light.mpSunPacket;
if ((g_env_light.vrbox_kasumi_outer_col.r + g_env_light.vrbox_kasumi_outer_col.g +
g_env_light.vrbox_kasumi_outer_col.b + g_env_light.vrbox_sky_col.r + g_env_light.vrbox_sky_col.g +
g_env_light.vrbox_sky_col.b + g_env_light.vrbox_kumo_top_col.r + g_env_light.vrbox_kumo_top_col.g +
g_env_light.vrbox_kumo_top_col.b) == 0)
{
return 1;
}
camera_p = dComIfGp_getCamera(0);
cXyz cam_eye;
cXyz cam_center;
cXyz camFwdXZ;
cXyz wind_vec;
windVec_p = dKyw_get_wind_vec();
f32 wind_pow = dKyw_get_wind_pow();
wind_vec = *windVec_p;
sp10 = dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo());
cam_eye = camera_p->lookat.eye;
cam_center = camera_p->lookat.center;
cam_eye.y = 0.0f;
cam_center.y = 0.0f;
dKyr_get_vectle_calc(&cam_eye, &cam_center, &camFwdXZ);
f32 temp_f30 =
cM3d_VectorProduct2d(0.0f, 0.0f, -wind_vec.x, -wind_vec.z, camFwdXZ.x, camFwdXZ.z);
f32 var_f29 = temp_f30 * 0.0005f * wind_pow;
if (strcmp(dComIfGp_getStartStageName(), "R_SP30") == 0) {
sp0C = dKyw_get_wind_vec();
var_f29 = temp_f30 * 0.0005f * (wind_pow + 0.3f);
}
modelData = i_this->mpKumoModel->getModelData();
material_0 = modelData->getMaterialNodePointer(0);
if (material_0 != NULL) {
material_0->setCullMode(0);
if (material_0->getTexMtx(0) != NULL) {
mtx_info = &material_0->getTexMtx(0)->getTexMtxInfo();
mtx_info->mSRT.mTranslationX += var_f29;
texScrollCheck(mtx_info->mSRT.mTranslationX);
}
if (material_0->getTexMtx(1) != NULL) {
mtx_info = &material_0->getTexMtx(1)->getTexMtxInfo();
mtx_info->mSRT.mTranslationX += var_f29 * 1.75f;
texScrollCheck(mtx_info->mSRT.mTranslationX);
}
}
material_0 = modelData->getMaterialNodePointer(1);
if (material_0 != NULL) {
if (material_0->getTexMtx(0) != NULL) {
mtx_info = &material_0->getTexMtx(0)->getTexMtxInfo();
mtx_info->mSRT.mTranslationX += var_f29 * 4.4f;
texScrollCheck(mtx_info->mSRT.mTranslationX);
}
if (material_0->getTexMtx(1) != NULL) {
mtx_info = &material_0->getTexMtx(1)->getTexMtxInfo();
mtx_info->mSRT.mTranslationX += var_f29 * 2.2f;
texScrollCheck(mtx_info->mSRT.mTranslationX);
}
}
modelData = i_this->mpKumoModel->getModelData();
material_0 = modelData->getMaterialNodePointer(0);
if (material_0 != NULL) {
material_0->setCullMode(0);
material_0->change();
k_color.r = g_env_light.vrbox_kumo_bottom_col.r;
k_color.g = g_env_light.vrbox_kumo_bottom_col.g;
k_color.b = g_env_light.vrbox_kumo_bottom_col.b;
k_color.a = g_env_light.vrbox_kumo_top_col.a;
material_0->setTevKColor(0, (J3DGXColor*)&k_color);
color.r = g_env_light.vrbox_kumo_shadow_col.r;
color.g = g_env_light.vrbox_kumo_shadow_col.g;
color.b = g_env_light.vrbox_kumo_shadow_col.b;
color.a = (u8)g_env_light.vrbox_kumo_top_col.a;
material_0->setTevColor(0, (J3DGXColorS10*)&color);
}
material_0 = modelData->getMaterialNodePointer(1);
if (material_0 != NULL) {
material_0->setCullMode(0);
material_0->change();
k_color.r = g_env_light.vrbox_kumo_bottom_col.r;
k_color.g = g_env_light.vrbox_kumo_bottom_col.g;
k_color.b = g_env_light.vrbox_kumo_bottom_col.b;
k_color.a = g_env_light.vrbox_kumo_top_col.a;
material_0->setTevKColor(0, (J3DGXColor*)&k_color);
color.r = g_env_light.vrbox_kumo_shadow_col.r;
color.g = g_env_light.vrbox_kumo_shadow_col.g;
color.b = g_env_light.vrbox_kumo_shadow_col.b;
color.a = g_env_light.vrbox_kumo_top_col.a;
material_0->setTevColor(0, (J3DGXColorS10*)&color);
}
modelData = i_this->mpKasumimModel->getModelData();
material_0 = modelData->getMaterialNodePointer(0);
if (material_0 != NULL) {
material_0->setCullMode(0);
material_0->change();
color.r = g_env_light.vrbox_kasumi_outer_col.r;
color.g = g_env_light.vrbox_kasumi_outer_col.g;
color.b = g_env_light.vrbox_kasumi_outer_col.b;
color.a = g_env_light.vrbox_kasumi_outer_col.a;
material_0->setTevColor(0, (J3DGXColorS10*)&color);
}
if (sun_p != NULL) {
modelData = i_this->model2->getModelData();
for (int i = 0; i < 3; i++) {
material_0 = modelData->getMaterialNodePointer(i);
if (material_0 != NULL) {
material_0->setCullMode(0);
material_0->change();
color.r = sun_p->mColor.r;
color.g = sun_p->mColor.g;
color.b = sun_p->mColor.b;
k_color = sun_p->field_0x74;
if (i == 1) {
if (g_env_light.daytime > 255.0f || g_env_light.daytime < 97.5f) {
cLib_addCalc(&sun_p->field_0x64, 1.0f, 0.2f, 0.1f, 0.0001f);
} else {
cLib_addCalc(&sun_p->field_0x64, 0.0f, 0.2f, 0.1f, 0.0001f);
}
color.a = sun_p->field_0x64 * 255.0f * sun_p->mSunAlpha;
k_color.a = color.a;
} else if (i == 2) {
color.a = sun_p->mSunAlpha * 255.0f * (1.0f - sun_p->field_0x64);
k_color.a = color.a;
} else {
color.a = sun_p->mSunAlpha * 255.0f;
k_color.a = color.a;
}
material_0->setTevColor(0, (J3DGXColorS10*)&color);
material_0->setTevKColor(0, (J3DGXColor*)&k_color);
}
}
}
return 1;
}
/* 804997E8-8049982C 000DE8 0044+00 1/0 0/0 0/0 .text daVrbox2_Execute__FP12vrbox2_class
*/
static int daVrbox2_Execute(vrbox2_class* i_this) {
i_this = i_this; // ?? fakematch? only needed for debug
if (g_env_light.daytime > 255.0f) {
i_this->mSunBtk.play();
}
return 1;
}
/* 8049982C-80499834 000E2C 0008+00 1/0 0/0 0/0 .text daVrbox2_IsDelete__FP12vrbox2_class
*/
static int daVrbox2_IsDelete(vrbox2_class* i_this) {
return 1;
}
/* 80499834-8049983C 000E34 0008+00 1/0 0/0 0/0 .text daVrbox2_Delete__FP12vrbox2_class
*/
static int daVrbox2_Delete(vrbox2_class* i_this) {
fopAcM_RegisterDeleteID(i_this, "Vrbox2");
return 1;
}
/* 8049983C-80499978 000E3C 013C+00 1/1 0/0 0/0 .text daVrbox2_solidHeapCB__FP10fopAc_ac_c */
static int daVrbox2_solidHeapCB(fopAc_ac_c* i_this) {
vrbox2_class* a_this = (vrbox2_class*)i_this;
J3DModelData* modelData = (J3DModelData*)dComIfG_getStageRes("vrbox_kumo.bmd");
JUT_ASSERT(785, modelData != NULL);
a_this->mpKumoModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11020202);
J3DModelData* kasumi_modelData;
J3DModelData* sun_modelData;
sun_modelData = (J3DModelData*)dComIfG_getStageRes("vrbox_sun.bmd");
if (sun_modelData != NULL) {
a_this->model2 = mDoExt_J3DModel__create(sun_modelData, 0x80000, 0x11020202);
JUT_ASSERT(809, a_this->model2 != NULL);
a_this->model2_und = mDoExt_J3DModel__create(sun_modelData, 0x80000, 0x11020202);
JUT_ASSERT(820, a_this->model2_und != NULL);
J3DAnmTextureSRTKey* pbtk = (J3DAnmTextureSRTKey*)dComIfG_getStageRes("vrbox_sun.btk");
JUT_ASSERT(825, pbtk != NULL);
if (!a_this->mSunBtk.init(sun_modelData, pbtk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1)) {
return 0;
}
}
kasumi_modelData = (J3DModelData*)dComIfG_getStageRes("vrbox_kasumiM.bmd");
if (kasumi_modelData != NULL) {
a_this->mpKasumimModel = mDoExt_J3DModel__create(kasumi_modelData, 0x80000, 0x11020202);
}
return a_this->mpKumoModel != NULL && a_this->model2 != NULL && a_this->model2_und != NULL;
}
/* 80499978-80499A1C 000F78 00A4+00 1/0 0/0 0/0 .text daVrbox2_Create__FP10fopAc_ac_c */
static int daVrbox2_Create(fopAc_ac_c* i_this) {
fopAcM_ct(i_this, vrbox2_class);
int phase = cPhs_COMPLEATE_e;
if (!fopAcM_entrySolidHeap(i_this, daVrbox2_solidHeapCB, 0x80004340)) {
phase = cPhs_ERROR_e;
}
return phase;
}
/* ############################################################################################## */
/* 80499B18-80499B38 -00001 0020+00 1/0 0/0 0/0 .data l_daVrbox2_Method */
static actor_method_class l_daVrbox2_Method = {
(process_method_func)daVrbox2_Create, (process_method_func)daVrbox2_Delete,
(process_method_func)daVrbox2_Execute, (process_method_func)daVrbox2_IsDelete,
(process_method_func)daVrbox2_Draw,
};
/* 80499B38-80499B68 -00001 0030+00 0/0 0/0 1/0 .data g_profile_VRBOX2 */
extern actor_process_profile_definition g_profile_VRBOX2 = {
fpcLy_CURRENT_e,
7,
fpcPi_CURRENT_e,
PROC_VRBOX2,
&g_fpcLf_Method.base,
sizeof(vrbox2_class),
0,
0,
&g_fopAc_Method.base,
4,
&l_daVrbox2_Method,
0x44000,
fopAc_ACTOR_e,
fopAc_CULLBOX_0_e,
};