From 8bded3affdfb8f70def551e300535e4ffe179a43 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 31 Mar 2026 16:26:05 +0300 Subject: [PATCH] Defined Object Silhouette --- src/CRE/mdl/disp_manager.cpp | 18 ++++++------- src/CRE/mdl/disp_manager.hpp | 8 +++--- src/CRE/render_context.cpp | 2 +- src/CRE/render_context.hpp | 2 +- src/CRE/render_manager.cpp | 38 +++++++++++++++------------ src/CRE/render_manager.hpp | 4 +-- src/CRE/rob/ex_block.cpp | 10 +++---- src/ReDIVA/data_test/auth_2d_test.cpp | 2 +- src/ReDIVA/data_test/object_test.cpp | 3 ++- src/ReDIVA/x_pv_game.cpp | 4 +-- 10 files changed, 48 insertions(+), 43 deletions(-) diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index c0fda84c..55885629 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -1714,19 +1714,19 @@ namespace mdl { case OBJ_TYPE_SHADOW_OBJECT_STAGE: func = draw_sub_mesh_shadow; break; - case OBJ_TYPE_TYPE_6: + case OBJ_TYPE_SILHOUETTE: func = draw_sub_mesh_no_mat; rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SIL; break; - case OBJ_TYPE_TYPE_7: + case OBJ_TYPE_SILHOUETTE_HIGH: func = draw_sub_mesh_no_mat; rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SIL; alpha_test = 1; min_alpha = 0.0f; - alpha_threshold = 0.99999994f; + alpha_threshold = 1.0f; break; case OBJ_TYPE_REFLECT_CHARA_OPAQUE: rend_data_ctx.state.set_cull_face_mode(GL_FRONT); @@ -1888,8 +1888,8 @@ namespace mdl { if (!depth_mask) rend_data_ctx.state.set_depth_mask(GL_TRUE); break; - case OBJ_TYPE_TYPE_6: - case OBJ_TYPE_TYPE_7: + case OBJ_TYPE_SILHOUETTE: + case OBJ_TYPE_SILHOUETTE_HIGH: rctx_ptr->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); break; @@ -2528,8 +2528,8 @@ namespace mdl { if (!(obj_flags & mdl::OBJ_NO_TRANSLUCENCY)) entry_list(OBJ_TYPE_OPAQUE, data); - if (obj_flags & mdl::OBJ_20) - entry_list(OBJ_TYPE_TYPE_6, data); + if (obj_flags & mdl::OBJ_SILHOUETTE) + entry_list(OBJ_TYPE_SILHOUETTE, data); if (obj_flags & mdl::OBJ_CHARA_REFLECT) entry_list(OBJ_TYPE_REFLECT_CHARA_OPAQUE, data); @@ -2549,8 +2549,8 @@ namespace mdl { if (obj_flags & mdl::OBJ_SHADOW) entry_list((ObjType)(OBJ_TYPE_SHADOW_CHARA + shadow_type), data); - if (obj_flags & mdl::OBJ_40) - entry_list(OBJ_TYPE_TYPE_7, data); + if (obj_flags & mdl::OBJ_SILHOUETTE_HIGH) + entry_list(OBJ_TYPE_SILHOUETTE_HIGH, data); if (obj_flags & mdl::OBJ_CHARA_REFLECT) entry_list(OBJ_TYPE_REFLECT_CHARA_OPAQUE, data); if (obj_flags & mdl::OBJ_REFLECT) { diff --git a/src/CRE/mdl/disp_manager.hpp b/src/CRE/mdl/disp_manager.hpp index 46e924e2..18d1230d 100644 --- a/src/CRE/mdl/disp_manager.hpp +++ b/src/CRE/mdl/disp_manager.hpp @@ -99,8 +99,8 @@ namespace mdl { OBJ_4 = 0x00000004, OBJ_8 = 0x00000008, OBJ_10 = 0x00000010, - OBJ_20 = 0x00000020, - OBJ_40 = 0x00000040, + OBJ_SILHOUETTE = 0x00000020, + OBJ_SILHOUETTE_HIGH = 0x00000040, OBJ_SHADOW_OBJECT = 0x00000080, OBJ_CHARA_REFLECT = 0x00000100, OBJ_REFLECT = 0x00000200, @@ -138,8 +138,8 @@ namespace mdl { OBJ_TYPE_TRANSPARENT, OBJ_TYPE_SHADOW_CHARA, OBJ_TYPE_SHADOW_STAGE, - OBJ_TYPE_TYPE_6, - OBJ_TYPE_TYPE_7, + OBJ_TYPE_SILHOUETTE, + OBJ_TYPE_SILHOUETTE_HIGH, OBJ_TYPE_SHADOW_OBJECT_CHARA, OBJ_TYPE_SHADOW_OBJECT_STAGE, OBJ_TYPE_REFLECT_CHARA_OPAQUE, diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index c49e79cb..30a82b1f 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -65,7 +65,7 @@ draw_state::render_data::render_data() : self_shadow(), shadow(), blend(), cull_ draw_state::draw_state() : wireframe(), wireframe_overlay(), shader_debug_flag(), use_global_material(), fog_height(), ex_data_mat(), field_68() { shader = true; - shader_index = -1; + show_flags = -1; show = -1; fresnel = 7.0f; } diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 9e94a5d7..4ccd921d 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -77,7 +77,7 @@ struct draw_state { bool fog_height; bool ex_data_mat; bool shader; - int32_t shader_index; + int32_t show_flags; int32_t show; global_material_struct global_material; int32_t field_68; diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index e61fcaa9..d8b64cba 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -103,8 +103,8 @@ namespace rndr { }; RenderManager::RenderManager() : pass_sw(), reflect_blur_num(), reflect_blur_filter(), - render(), sync_gpu(), cpu_time(), gpu_time(), draw_pass_3d(), field_11E(), field_11F(), - field_120(), show_ref_map(), reflect_type(), clear(), tex_index(), width(), height(), + render(), sync_gpu(), cpu_time(), gpu_time(), draw_pass_3d(), field_11E(), silhouette(), + silhouette_high(), show_ref_map(), reflect_type(), clear(), tex_index(), width(), height(), multisample_framebuffer(), multisample_renderbuffer(), multisample(), check_state(), show_vector_flags(), show_vector_length(), show_vector_z_offset(), show_stage_shadow(), effect_texture(), npr_param(), npr_mask(), reflect_texture_mask(), reflect_tone_curve(), field_31F(), light_stage_ambient(), npr() { @@ -173,8 +173,8 @@ namespace rndr { shadow = true; opaque_z_sort = true; alpha_z_sort = true; - field_11F = false; - field_120 = false; + silhouette = false; + silhouette_high = false; reflect_blur_num = 1; reflect_blur_filter = BLUR_FILTER_4; @@ -531,7 +531,7 @@ namespace rndr { rend_data_ctx.state.begin_event("reflect"); reflect_draw = true; - RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); + RenderTexture& refl_tex = get_render_texture(0); if (sss->set(rend_data_ctx, refl_tex)) { rndr::Render* rend = render; @@ -646,7 +646,7 @@ namespace rndr { render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("pass_reflect"); - RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); + RenderTexture& refl_tex = get_render_texture(0); RenderTexture& refl_buf_tex = rctx->reflect_buffer; refl_tex.Bind(rend_data_ctx.state); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFLECT_OPAQUE) @@ -773,7 +773,7 @@ namespace rndr { void RenderManager::pass_refract(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("pass_refract"); - RenderTexture& refract_texture = rctx->render_manager->get_render_texture(1); + RenderTexture& refract_texture = get_render_texture(1); refract_texture.Bind(rend_data_ctx.state); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_OPAQUE) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSPARENT) @@ -952,8 +952,6 @@ namespace rndr { if (alpha_z_sort) { rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT, 1, cam, field_31F); - rctx->disp_manager->obj_sort(rend_data_ctx, - mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2, cam); rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_POST_GLITTER, 1, cam, field_31F); rctx->disp_manager->obj_sort(rend_data_ctx, @@ -962,15 +960,20 @@ namespace rndr { mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_POST_OPAQUE, 1, cam, field_31F); } + if (alpha_z_sort) + rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2, cam); + if (opaque_z_sort) rctx->disp_manager->obj_sort(rend_data_ctx, mdl::OBJ_TYPE_OPAQUE, 0, cam); - if (draw_pass_3d[DRAW_PASS_3D_OPAQUE]) { - rend_data_ctx.state.enable_depth_test(); - rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + if (silhouette) + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SILHOUETTE, cam); + + if (draw_pass_3d[DRAW_PASS_3D_OPAQUE]) rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_OPAQUE, cam); - rend_data_ctx.state.disable_depth_test(); - } + rend_data_ctx.state.disable_depth_test(); Glitter::glt_particle_manager->DispScenes(rend_data_ctx, Glitter::DISP_OPAQUE, cam); @@ -978,8 +981,9 @@ namespace rndr { rend_data_ctx.state.set_depth_mask(GL_TRUE); if (draw_pass_3d[DRAW_PASS_3D_TRANSPARENT]) rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TRANSPARENT, cam); - if (rctx->render_manager->field_120) - rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_TYPE_7, cam); + + if (silhouette_high) + rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SILHOUETTE_HIGH, cam); render->calc_exposure_chara_data(rend_data_ctx, cam); @@ -1173,7 +1177,7 @@ namespace rndr { RenderTexture* rt; RenderTexture* contour_rt; if (reflect_draw) { - rt = &rctx->render_manager->get_render_texture(0); + rt = &get_render_texture(0); contour_rt = &rctx->reflect_buffer; } else { diff --git a/src/CRE/render_manager.hpp b/src/CRE/render_manager.hpp index 5a880f42..5d3ac4eb 100644 --- a/src/CRE/render_manager.hpp +++ b/src/CRE/render_manager.hpp @@ -65,8 +65,8 @@ namespace rndr { bool alpha_z_sort; bool draw_pass_3d[DRAW_PASS_3D_MAX]; bool field_11E; - bool field_11F; - bool field_120; + bool silhouette; + bool silhouette_high; bool show_ref_map; int32_t reflect_type; // stage_data_reflect_type bool clear; diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index ee6fb2ae..7f942558 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -3814,11 +3814,11 @@ void ExExpressionBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, std::string func_str; expression = str_utils_get_next_string(expression, func_str, ' '); stack_val->type = EX_EXPRESSION_BLOCK_STACK_VARIABLE; - int32_t v40 = func_str[0] - '0'; - if (v40 < 9) { - bone_node* v42 = itm_eq_obj->get_bone_node(func_str.c_str() + 2, bone_data); - if (v42) - stack_val->var.value = v42->get_exp_data_component(v40, stack_val->type); + int32_t index = func_str[0] - '0'; + if (index >= 0 && index < 9) { + bone_node* node = itm_eq_obj->get_bone_node(func_str.c_str() + 2, bone_data); + if (node) + stack_val->var.value = node->get_exp_data_component(index, stack_val->type); else { stack_val->type = EX_EXPRESSION_BLOCK_STACK_NUMBER; stack_val->number.value = 0.0f; diff --git a/src/ReDIVA/data_test/auth_2d_test.cpp b/src/ReDIVA/data_test/auth_2d_test.cpp index 3e641323..cd143581 100644 --- a/src/ReDIVA/data_test/auth_2d_test.cpp +++ b/src/ReDIVA/data_test/auth_2d_test.cpp @@ -279,7 +279,7 @@ void DtmAet::disp() { font.init_font_data(0); print_work.set_font(&font); - print_work.set_prio(spr::SPR_PRIO_29); + print_work.set_prio(spr::SPR_PRIO_DEBUG); print_work.set_position(*(vec2*)&pos); print_work.set_resolution_mode(i.second.mode); print_work.set_color(color_red); diff --git a/src/ReDIVA/data_test/object_test.cpp b/src/ReDIVA/data_test/object_test.cpp index 30e36803..929c52a0 100644 --- a/src/ReDIVA/data_test/object_test.cpp +++ b/src/ReDIVA/data_test/object_test.cpp @@ -305,7 +305,8 @@ void DataTestObjectManager::disp() { uint32_t obj_set_id = aft_obj_db->get_object_set_id(object_set_index); uint32_t obj_id = objset_info_storage_get_obj_by_index(obj_set_id, obj_index)->id; - rctx_ptr->disp_manager->set_obj_flags((mdl::ObjFlags)(mdl::OBJ_40 | mdl::OBJ_20 | obj_flags)); + rctx_ptr->disp_manager->set_obj_flags( + (mdl::ObjFlags)(mdl::OBJ_SILHOUETTE_HIGH | mdl::OBJ_SILHOUETTE | obj_flags)); vec3 rotation = this->rotation * DEG_TO_RAD_FLOAT; mat4 mat; diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 9de6f344..ee1fc5a6 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -7831,14 +7831,14 @@ bool x_pv_game::ctrl() { pv_data.dsc_data_ptr = pv_data.dsc.data.data(); pv_data.dsc_data_ptr_end = pv_data.dsc_data_ptr + pv_data.dsc.data.size(); - pv_data.ctrl(false, 0.0f, 0.0f); + pv_data.ctrl(false, (float_t)(frame_float * (1.0 / 60.0)), 0.0f); light_auth_3d_id.set_enable(true); light_auth_3d_id.set_camera_root_update(false); light_auth_3d_id.set_paused(false); light_auth_3d_id.set_repeat(false); light_auth_3d_id.set_visibility(true); - light_auth_3d_id.set_req_frame(0.0f); + light_auth_3d_id.set_req_frame((float_t)frame_float); #if BAKE_PV826 if (pv_id == 826) {