/** * @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, };