diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index 978b32a3..9e277891 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -4470,7 +4470,7 @@ static void auth_3d_m_object_hrc_disp(auth_3d_m_object_hrc* moh, auth_3d* auth, disp_manager.set_obj_flags(flags); disp_manager.set_shadow_type(shadow_type); - shadow* shad = rctx->render_manager.shadow_ptr; + Shadow* shad = rctx->render_manager.shadow_ptr; if (shad && flags & mdl::OBJ_SHADOW) { disp_manager.set_shadow_type(SHADOW_STAGE); @@ -6330,7 +6330,7 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende break; } - shadow* shad = rctx->render_manager.shadow_ptr; + Shadow* shad = rctx->render_manager.shadow_ptr; if (shad) { vec3 pos = *(vec3*)&m->row3; pos.y -= 0.2f; diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index d75b7862..8c85978b 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -3092,9 +3092,9 @@ namespace rndr { for (bool& i : draw_pass_3d) i = true; - shadow_ptr = new ::shadow; + shadow_ptr = new Shadow; if (shadow_ptr) - shadow_ptr->init_data(); + shadow_ptr->InitData(); for (int32_t i = 0; i < 9; i++) { const struc_189* v2 = &stru_140A24420[i]; @@ -3565,7 +3565,7 @@ void render_context::disp() { draw_state.stats_prev = draw_state.stats; draw_state.stats.reset(); app::TaskWork::Disp(); - render_manager.shadow_ptr->ctrl(this); + render_manager.shadow_ptr->Ctrl(this); int32_t sprite_index = sprite_manager_get_index(); //sprite_manager_set_index(3); sprite_manager_set_index(0); @@ -3780,47 +3780,18 @@ void render_context::light_param_data_face_set(light_param_face* face) { this->face.set_direction(face->direction); } -shadow::shadow() : field_8(), field_158(), view_point(), interest(), -field_1A8(), view_point_shared(), interest_shared(), field_2F0() { - view_region = 1.2f; - range = 1.0f; - for (int32_t i = 0; i < 2; i++) { - view_point[i] = 1.0f; - field_1C0[i] = 0.0f; - field_1C8[i] = 0.0f; - field_200[i] = i; - } - view_mat[0] = mat4_identity; - view_mat[1] = mat4_identity; - blur_filter = BLUR_FILTER_9; - near_blur = 1; - field_2BC = 2; - far_blur = 1; - distance = 4.0f; - field_2C4 = 0.4f; - z_near = 0.1f; - z_far = 20.0f; - field_2D0 = 1.4f; - field_2D4 = 10000.0f; - field_2D8 = 80.0f; - field_2DC = 2.0f; - field_2E0 = 0.05f; - ambient = 0.4f; - field_2EC = 0; - direction = vec3(0.0f, -1.0f, -1.0f) * (1.0f / sqrtf(2.0f)); - field_2E8 = false; - self_shadow = true; - blur_filter_enable[0] = true; - blur_filter_enable[1] = true; - field_2F5 = false; - field_208 = (z_far - z_near) * 0.5f; +Shadow::Shadow() : curr_render_textures(), view_region(), range(), field_1C0(), field_1C8(), +field_200(), field_208(), near_blur(), blur_filter(), far_blur(), field_2BC(), distance(), +field_2C4(), z_near(), z_far(), field_2D0(), field_2D4(), field_2D8(), field_2DC(), field_2E0(), +ambient(), field_2E8(), field_2EC(), field_2F0(), self_shadow(), blur_filter_enable(), field_2F5() { + ResetData(); } -shadow::~shadow() { - +Shadow::~Shadow() { + Reset(); } -void shadow::ctrl(render_context* rctx) { +void Shadow::Ctrl(render_context* rctx) { for (int32_t i = 0; i < 2; i++) field_2F0[i] = false; @@ -4065,7 +4036,7 @@ void shadow::ctrl(render_context* rctx) { i.clear(); } -int32_t shadow::init_data() { +int32_t Shadow::InitData() { struct shadow_texture_init_params { int32_t width; int32_t height; @@ -4085,12 +4056,12 @@ int32_t shadow::init_data() { shadow_texture_init_params* v3 = init_params; for (int32_t i = 0; i < 8; i++, v3++) - if (field_8[i].init(v3->width, v3->height, + if (render_textures[i].init(v3->width, v3->height, v3->max_level, v3->color_format, v3->depth_format) < 0) return -1; for (int32_t i = 0; i < 4; i++) { - gl_state_bind_texture_2d(field_8[i == 3 ? 7 : i].color_texture->tex); + gl_state_bind_texture_2d(render_textures[i == 3 ? 7 : i].color_texture->tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); static const vec4 border_color = 1.0f; @@ -4101,6 +4072,51 @@ int32_t shadow::init_data() { return 0; } +void Shadow::Reset() { + for (render_texture& i : render_textures) + i.free(); + + ResetData(); +} + +void Shadow::ResetData() { + view_region = 1.2f; + range = 1.0f; + + for (int32_t i = 0; i < 2; i++) { + view_point[i] = 1.0f; + field_1C0[i] = 0.0f; + field_1C8[i] = 0.0f; + field_200[i] = i; + } + + for (render_texture*& i : curr_render_textures) + i = 0; + + view_mat[0] = mat4_identity; + view_mat[1] = mat4_identity; + blur_filter = BLUR_FILTER_9; + near_blur = 1; + field_2BC = 2; + far_blur = 1; + distance = 4.0f; + field_2C4 = 0.4f; + z_near = 0.1f; + z_far = 20.0f; + field_2D0 = 1.4f; + field_2D4 = 10000.0f; + field_2D8 = 80.0f; + field_2DC = 2.0f; + field_2E0 = 0.05f; + ambient = 0.4f; + field_2EC = 0; + direction = vec3(0.0f, -1.0f, -1.0f) * (1.0f / sqrtf(2.0f)); + field_2E8 = false; + self_shadow = true; + field_2F5 = false; + field_208 = (z_far - z_near) * 0.5f; +} + static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshArgs* args, int32_t texcoord_array[2], GLuint vertex_attrib_buffer_binding[16]) { const obj_mesh* mesh = args->mesh; diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 78a7ec36..32407025 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -169,7 +169,7 @@ namespace rndr { } struct render_context; -struct shadow; +struct Shadow; struct draw_state_stats { int32_t object_draw_count; @@ -625,7 +625,7 @@ namespace mdl { namespace rndr { struct RenderManager { bool pass_sw[rndr::RND_PASSID_NUM]; - shadow* shadow_ptr; + Shadow* shadow_ptr; bool reflect; bool refract; int32_t reflect_blur_num; @@ -927,9 +927,9 @@ struct render_context { void light_param_data_face_set(light_param_face* face); }; -struct shadow { - render_texture field_8[8]; // Extra for buf - render_texture* field_158[4]; // Extra for buf +struct Shadow { + render_texture render_textures[8]; // Extra for buf + render_texture* curr_render_textures[4]; // Extra for buf float_t view_region; float_t range; vec3 view_point[2]; @@ -965,9 +965,11 @@ struct shadow { bool blur_filter_enable[2]; bool field_2F5; - shadow(); - ~shadow(); + Shadow(); + ~Shadow(); - void ctrl(render_context* rctx); - int32_t init_data(); + void Ctrl(render_context* rctx); + int32_t InitData(); + void Reset(); + void ResetData(); }; diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 5651eb3e..35f73c7b 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -22,9 +22,9 @@ static void blur_filter_apply(render_context* rctx, GLuint tex_0, GLuint tex_1, blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset); static void draw_pass_shadow_begin_make_shadowmap(render_context* rctx, - shadow* shad, int32_t index, int32_t a3); + Shadow* shad, int32_t index, int32_t a3); static void draw_pass_shadow_end_make_shadowmap(render_context* rctx, - shadow* shad, int32_t index, int32_t a3); + Shadow* shad, int32_t index, int32_t a3); static void draw_pass_shadow_filter(render_context* rctx, render_texture* a1, render_texture* a2, render_texture* a3, float_t sigma, float_t far_texel_offset, bool enable_lit_proj); static void draw_pass_shadow_esm_filter(render_context* rctx, @@ -34,7 +34,7 @@ static void draw_pass_sss_contour(render_context* rctx, post_process* pp); static void draw_pass_sss_filter(render_context* rctx, sss_data* sss); static int32_t draw_pass_3d_get_translucent_count(render_context* rctx); static void draw_pass_3d_shadow_reset(render_context* rctx); -static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx); +static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx); extern void draw_pass_3d_translucent(render_context* rctx, bool opaque_enable, bool transparent_enable, bool translucent_enable, mdl::ObjType opaque, mdl::ObjType transparent, mdl::ObjType translucent); @@ -194,15 +194,15 @@ namespace rndr { v3 = true; } - ::shadow* shad = shadow_ptr; + Shadow* shad = shadow_ptr; if (shadow && v3) { int32_t v11[2]; v11[0] = shad->field_200[0]; v11[1] = shad->field_200[1]; - shad->field_158[0] = &shad->field_8[0]; - shad->field_158[1] = &shad->field_8[1]; - shad->field_158[2] = &shad->field_8[2]; - shad->field_158[3] = &shad->field_8[7]; // Extra for buf + shad->curr_render_textures[0] = &shad->render_textures[0]; + shad->curr_render_textures[1] = &shad->render_textures[1]; + shad->curr_render_textures[2] = &shad->render_textures[2]; + shad->curr_render_textures[3] = &shad->render_textures[7]; // Extra for buf for (int32_t i = 0, j = 0; i < 2; i++) { if (!v10[i]) @@ -220,14 +220,14 @@ namespace rndr { } } else { - shad->field_158[0] = &shad->field_8[0]; - shad->field_158[1] = &shad->field_8[1]; - shad->field_158[2] = &shad->field_8[2]; - shad->field_158[3] = &shad->field_8[7]; // Extra for buf + shad->curr_render_textures[0] = &shad->render_textures[0]; + shad->curr_render_textures[1] = &shad->render_textures[1]; + shad->curr_render_textures[2] = &shad->render_textures[2]; + shad->curr_render_textures[3] = &shad->render_textures[7]; // Extra for buf for (int32_t i = 1; i < 3; i++) for (int32_t j = 0; j < 4; j++) { - shad->field_158[i]->bind(j); + shad->curr_render_textures[i]->bind(j); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } @@ -926,9 +926,9 @@ void draw_pass_set_camera(render_context* rctx) { } static void draw_pass_shadow_begin_make_shadowmap(render_context* rctx, - shadow* shad, int32_t index, int32_t a3) { - texture* tex = shad->field_158[0]->color_texture; - shad->field_158[0]->bind(); + Shadow* shad, int32_t index, int32_t a3) { + texture* tex = shad->curr_render_textures[0]->color_texture; + shad->curr_render_textures[0]->bind(); glViewport(0, 0, tex->width, tex->height); glScissor(0, 0, tex->width, tex->height); gl_state_enable_depth_test(); @@ -970,22 +970,24 @@ static void draw_pass_shadow_begin_make_shadowmap(render_context* rctx, } static void draw_pass_shadow_end_make_shadowmap(render_context* rctx, - shadow* shad, int32_t index, int32_t a3) { + Shadow* shad, int32_t index, int32_t a3) { gl_state_disable_depth_test(); gl_state_disable_scissor_test(); rctx->draw_state.shader_index = -1; if (a3 == shad->field_2EC - 1) { - draw_pass_shadow_filter(rctx, &shad->field_8[3], &shad->field_8[4], shad->field_158[0], + draw_pass_shadow_filter(rctx, &shad->render_textures[3], + &shad->render_textures[4], shad->curr_render_textures[0], shad->field_2DC, shad->field_2E0 / (shad->field_208 * 2.0f), false); - draw_pass_shadow_esm_filter(rctx, &shad->field_8[5], &shad->field_8[6], &shad->field_8[3]); + draw_pass_shadow_esm_filter(rctx, &shad->render_textures[5], + &shad->render_textures[6], &shad->render_textures[3]); } - render_texture* rend_tex = shad->field_158[1 + index]; - render_texture* rend_buf_tex = shad->field_158[3]; + render_texture* rend_tex = shad->curr_render_textures[1 + index]; + render_texture* rend_buf_tex = shad->curr_render_textures[3]; rend_tex->bind(); - render_texture* src = shad->field_158[0]; + render_texture* src = shad->curr_render_textures[0]; image_filter_scale(rctx, rend_tex->color_texture->tex, src->color_texture->tex, 1.0f); if (shad->blur_filter_enable[index]) { @@ -1363,10 +1365,10 @@ static void draw_pass_3d_shadow_reset(render_context* rctx) { rctx->draw_state.light = false; } -static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { +static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx) { if (shad->self_shadow && shad->field_2EC > 0) { - gl_state_active_bind_texture_2d(19, shad->field_8[3].color_texture->tex); - gl_state_active_bind_texture_2d(20, shad->field_8[5].color_texture->tex); + gl_state_active_bind_texture_2d(19, shad->render_textures[3].color_texture->tex); + gl_state_active_bind_texture_2d(20, shad->render_textures[5].color_texture->tex); gl_state_active_texture(0); float_t esm_param = (shad->field_2D8 * shad->field_208 * 2.0f) * 1.442695f; rctx->obj_scene.g_esm_param = { esm_param, 0.0f, 0.0f, 0.0f }; @@ -1420,7 +1422,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { continue; } - gl_state_active_bind_texture_2d(6 + j, shad->field_158[1 + i]->color_texture->tex); + gl_state_active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->color_texture->tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); j++; } @@ -1445,7 +1447,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { rctx->draw_state.light = false; for (int32_t i = 0; i < 2; i++) - gl_state_active_bind_texture_2d(6 + i, shad->field_158[1 + i]->color_texture->tex); + gl_state_active_bind_texture_2d(6 + i, shad->curr_render_textures[1 + i]->color_texture->tex); gl_state_active_texture(0); rctx->obj_scene.g_shadow_ambient = 1.0f; diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index 403f5cfb..a386939b 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -13412,7 +13412,7 @@ void rob_chara_item_equip::disp(int32_t chara_id, render_context* rctx) { enum_or(flags, mdl::OBJ_REFRACT); mdl::DispManager& disp_manager = rctx->disp_manager; - shadow* shad = rctx->render_manager.shadow_ptr; + Shadow* shad = rctx->render_manager.shadow_ptr; if (shadow_type != -1) { if (field_A0 & 0x04) { vec3 pos = position; diff --git a/src/CRE/stage.cpp b/src/CRE/stage.cpp index 4cc46c0e..a2a0cf11 100644 --- a/src/CRE/stage.cpp +++ b/src/CRE/stage.cpp @@ -434,7 +434,7 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* mat4_mult_vec3_trans(view, ¢er, ¢er); float_t radius = sphere->radius; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; float_t v9 = shad->view_region * shad->range; if ((center.x + radius) < -v9 || (center.x - radius) > v9 @@ -448,14 +448,14 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* static bool object_bounding_sphere_check_visibility_shadow_chara(obj_bounding_sphere* sphere, mat4* view) { mat4 mat; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; mat4_look_at(&shad->view_point[0], &shad->interest[0], &mat); return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat); } static bool object_bounding_sphere_check_visibility_shadow_stage(obj_bounding_sphere* sphere, mat4* view) { mat4 mat; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; mat4_look_at(&shad->view_point[1], &shad->interest[1], &mat); return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat); } diff --git a/src/CRE/stage_modern.cpp b/src/CRE/stage_modern.cpp index 23ce4f21..22a9515d 100644 --- a/src/CRE/stage_modern.cpp +++ b/src/CRE/stage_modern.cpp @@ -450,7 +450,7 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* mat4_mult_vec3_trans(view, ¢er, ¢er); float_t radius = sphere->radius; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; float_t view_region = shad->view_region * shad->range; if ((center.x + radius) < -view_region || (center.x - radius) > view_region @@ -464,14 +464,14 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* static bool object_bounding_sphere_check_visibility_shadow_chara(obj_bounding_sphere* sphere, mat4* view) { mat4 mat; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; mat4_look_at(&shad->view_point[0], &shad->interest[0], &mat); return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat); } static bool object_bounding_sphere_check_visibility_shadow_stage(obj_bounding_sphere* sphere, mat4* view) { mat4 mat; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; mat4_look_at(&shad->view_point[1], &shad->interest[1], &mat); return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat); } diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.cpp b/src/ReDIVA/pv_game/pv_game_pv_data.cpp index c0a4ccdf..91321cf1 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.cpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.cpp @@ -1293,7 +1293,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, playdata->shadow = enable == 1; - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; if (shad) if (chara_id == 1) shad->blur_filter_enable[1] = playdata->shadow; @@ -2439,10 +2439,10 @@ void pv_game_pv_data::init(::pv_game* pv_game, bool music_play) { sub_14013C8C0()->difficulty, sub_14013C8C0()->edition); find_set_motion(diff); - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; if (shad) { - shad->blur_filter_enable[0] = 0x1; - shad->blur_filter_enable[1] = 0x1; + shad->blur_filter_enable[0] = true; + shad->blur_filter_enable[1] = true; } pv_game->data.play_data.lyric_color = 0xFFFFFFFF; @@ -2543,7 +2543,7 @@ void pv_game_pv_data::reset_camera_post_process() { pp->tone_map->set_tone_trans(0.0f, 1.0f); pp->tone_map->set_saturate_coeff(1.0f); - shadow* shad = rctx_ptr->render_manager.shadow_ptr; + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; if (shad) for (bool& i : shad->blur_filter_enable) i = true; diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 1f524a8e..fc1353e2 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -4659,6 +4659,12 @@ bool x_pv_game::Ctrl() { dsc_data.dsc_data_ptr = dsc_data.dsc.data.data(); dsc_data.dsc_data_ptr_end = dsc_data.dsc_data_ptr + dsc_data.dsc.data.size(); + Shadow* shad = rctx_ptr->render_manager.shadow_ptr; + if (shad) { + shad->blur_filter_enable[0] = true; + shad->blur_filter_enable[1] = true; + } + state_old = 9; } break; case 9: {