diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 4e0ee611..6ea625e0 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -3151,7 +3151,7 @@ void EffectRipple::draw() { glClear(GL_DEPTH_BUFFER_BIT); if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) { gl_state_active_bind_texture_2d(7, rt[counter % 3]->GetColorTex()); - rctx->disp_manager->draw(mdl::OBJ_TYPE_USER, 0, true); + rctx->disp_manager->draw(mdl::OBJ_TYPE_USER); gl_state_active_bind_texture_2d(7, 0); } diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index dbdfc02d..8ff39afb 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -32,6 +32,8 @@ static const GLuint BONE_INDEX_INDEX = 15; static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshArgs* args, int32_t texcoord_array[2], GLuint vertex_attrib_buffer_binding[16]); +static void sub_140436760(); + material_list_struct::material_list_struct() : blend_color(), has_blend_color(), emission(), has_emission() { hash = (uint32_t)-1; } @@ -1994,7 +1996,7 @@ namespace mdl { i.reset_vertex_attrib(); } - void DispManager::draw(ObjType type, int32_t depth_mask, bool a4) { + void DispManager::draw(ObjType type, int32_t depth_mask, bool reflect_texture_mask) { if (type < 0 || type >= mdl::OBJ_TYPE_MAX || get_obj_count(type) < 1) return; @@ -2082,7 +2084,7 @@ namespace mdl { break; case OBJ_TYPE_REFLECT_OPAQUE: alpha_test = 1; - if (!a4) + if (!reflect_texture_mask) func = draw_sub_mesh_reflect_reflect_map; break; case OBJ_TYPE_REFLECT_TRANSLUCENT: @@ -3108,11 +3110,14 @@ namespace mdl { return wet_param; } - void DispManager::obj_sort(const mat4* view, ObjType type, int32_t compare_func) { + void DispManager::obj_sort(const mat4* view, ObjType type, int32_t compare_func, bool a3) { std::list& list = obj[type]; if (list.size() < 1) return; + if (a3 && type == mdl::OBJ_TYPE_TRANSLUCENT) + sub_140436760(); + calc_obj_radius(view, type); switch (compare_func) { @@ -3296,3 +3301,65 @@ static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshA vertex_attrib_buffer_binding[MORPH_COLOR_INDEX] = morph_vertex_buffer; } } + +static void sub_140436760() { + camera* cam = rctx_ptr->camera; + mat4* view = &cam->view; + + for (auto& i : rctx_ptr->disp_manager->obj[mdl::OBJ_TYPE_TRANSLUCENT]) { + if (i->kind != mdl::OBJ_KIND_NORMAL) + continue; + + const obj_mesh* mesh = i->args.sub_mesh.mesh; + if (!mesh) + continue; + + const obj_sub_mesh* sub_mesh = i->args.sub_mesh.sub_mesh; + const obj_axis_aligned_bounding_box* aabb = &sub_mesh->axis_aligned_bounding_box; + if (mesh->attrib.m.billboard_y_axis && aabb->size.y > 1.0f && aabb->size.y < 1.2f) { + if (!strcmp(mesh->name, "STGD2NS064_EFF_WATESMOKE_A_BMZ_000")) + i->view_z += sub_mesh->bounding_sphere.radius; + continue; + } + + + if (i->args.sub_mesh.material->material.attrib.m.src_blend_factor == OBJ_MATERIAL_BLEND_ZERO + && i->args.sub_mesh.material->material.attrib.m.dst_blend_factor == OBJ_MATERIAL_BLEND_ONE + && aabb->size.y > 2.0f && aabb->size.y < 2.5f) { + if (strcmp(mesh->name, "STGD2NS064_EFF_DISPLAY_MZ_000") && strcmp(mesh->name, "STGD2NS064_EFF_RAY_B_MZ_000")) + continue; + } + else if (aabb->size.y > 3.0f && aabb->size.x > 3.6f && aabb->size.x < 3.7f) { + if (strcmp(mesh->name, "STGD2NS064_EFF_WATERFALL_A_MZ_000")) + continue; + } + else + continue; + + mat4 mat; + mat4_mul_translate(&i->mat, &aabb->center, &mat); + mat4_mul(&mat, view, &mat); + mat4_transpose(&mat, &mat); + + vec4 t; + *(vec3*)&t = aabb->size; + t.w = 1.0f; + + float_t view_z = vec4::dot(t ^ vec4( 0.0f, 0.0f, 0.0f, 0.0f ), mat.row2); + if (view_z < vec4::dot(t ^ vec4( 0.0f, 0.0f, -0.0f, 0.0f ), mat.row2)) + view_z = vec4::dot(t ^ vec4( 0.0f, 0.0f, -0.0f, 0.0f ), mat.row2); + if (view_z < vec4::dot(t ^ vec4( 0.0f, -0.0f, 0.0f, 0.0f ), mat.row2)) + view_z = -t.y; + if (view_z < vec4::dot(t ^ vec4( 0.0f, -0.0f, -0.0f, 0.0f ), mat.row2)) + view_z = vec4::dot(t ^ vec4( 0.0f, -0.0f, -0.0f, 0.0f ), mat.row2); + if (view_z < vec4::dot(t ^ vec4( -0.0f, 0.0f, 0.0f, 0.0f ), mat.row2)) + view_z = -t.x; + if (view_z < vec4::dot(t ^ vec4( -0.0f, 0.0f, -0.0f, 0.0f ), mat.row2)) + view_z = vec4::dot(t ^ vec4( -0.0f, 0.0f, -0.0f, 0.0f ), mat.row2); + if (view_z < vec4::dot(t ^ vec4( -0.0f, -0.0f, 0.0f, 0.0f ), mat.row2)) + view_z = vec4::dot(t ^ vec4( -0.0f, -0.0f, 0.0f, 0.0f ), mat.row2); + if (view_z < vec4::dot(t ^ vec4( -0.0f, -0.0f, -0.0f, 0.0f ), mat.row2)) + view_z = vec4::dot(t ^ vec4( -0.0f, -0.0f, -0.0f, 0.0f ), mat.row2); + i->view_z = view_z; + } +} diff --git a/src/CRE/mdl/disp_manager.hpp b/src/CRE/mdl/disp_manager.hpp index cb98735e..56840183 100644 --- a/src/CRE/mdl/disp_manager.hpp +++ b/src/CRE/mdl/disp_manager.hpp @@ -448,7 +448,7 @@ namespace mdl { void check_index_buffer(GLuint buffer); void check_vertex_arrays(); void check_vertex_buffer(GLuint buffer); - void draw(mdl::ObjType type, int32_t depth_mask = 0, bool a4 = true); + void draw(mdl::ObjType type, int32_t depth_mask = 0, bool reflect_texture_mask = true); void draw_translucent(mdl::ObjType type, int32_t alpha); /*void draw_show_vector(mdl::ObjType type, int32_t show_vector);*/ void entry_list(ObjType type, ObjData* data); @@ -498,7 +498,7 @@ namespace mdl { void get_texture_specular_offset(vec4& value); void get_texture_transform(int32_t& count, texture_transform_struct*& value); float_t get_wet_param(); - void obj_sort(const mat4* view, ObjType type, int32_t compare_func); + void obj_sort(const mat4* view, ObjType type, int32_t compare_func, bool a3 = false); void refresh(); void set_chara_color(bool value = false); void set_culling_finc(bool(*func)(const obj_bounding_sphere*, const mat4*) = 0); diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 53a5fc6b..6e66707a 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -86,9 +86,9 @@ 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(), - multisample_framebuffer(), multisample_renderbuffer(), multisample(), check_state(), - show_vector_flags(), show_vector_length(), show_vector_z_offset(), show_stage_shadow(), - effect_texture(), npr_param(), field_31C(), field_31D(), field_31E(), field_31F(), field_320(), npr() { + multisample_framebuffer(), multisample_renderbuffer(), multisample(), check_state(), show_vector_flags(), + show_vector_length(), show_vector_z_offset(), show_stage_shadow(), effect_texture(), npr_param(), + field_31C(), reflect_texture_mask(), reflect_tone_curve(), field_31F(), light_stage_ambient(), npr() { for (bool& i : pass_sw) i = true; @@ -165,10 +165,10 @@ namespace rndr { refract = false; npr_param = 0; field_31C = false; - field_31D = false; - field_31E = false; + reflect_texture_mask = false; + reflect_tone_curve = false; field_31F = false; - field_320 = false; + light_stage_ambient = false; for (bool& i : draw_pass_3d) i = true; @@ -595,7 +595,7 @@ namespace rndr { gl_state_enable_depth_test(); gl_state_set_depth_func(GL_LEQUAL); gl_state_set_depth_mask(GL_TRUE); - rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_OPAQUE, 0, field_31D); + rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_OPAQUE, 0, reflect_texture_mask); if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) { gl_state_enable_blend(); gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -605,7 +605,7 @@ namespace rndr { } if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) { - uniform_value[U_REFLECT] = field_31E; + uniform_value[U_REFLECT] = reflect_tone_curve ? 1 : 0; uniform_value[U_CLIP_PLANE] = clip_plane.data[0]; rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE); } @@ -811,15 +811,21 @@ namespace rndr { gl_state_bind_sampler(15, rctx->render_samplers[0]); gl_state_bind_sampler(16, rctx->render_samplers[0]); - uniform_value[U12] = field_320 ? 1 : 0; + uniform_value[U_STAGE_AMBIENT] = light_stage_ambient ? 1 : 0; if (alpha_z_sort) { - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT, 1); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, 1); + rctx->disp_manager->obj_sort(&rctx->view_mat, + mdl::OBJ_TYPE_TRANSLUCENT, 1, field_31F); + rctx->disp_manager->obj_sort(&rctx->view_mat, + mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2); + rctx->disp_manager->obj_sort(&rctx->view_mat, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1, field_31F); + rctx->disp_manager->obj_sort(&rctx->view_mat, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1, field_31F); + rctx->disp_manager->obj_sort(&rctx->view_mat, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1, field_31F); + rctx->disp_manager->obj_sort(&rctx->view_mat, + mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, 1, field_31F); } if (opaque_z_sort) @@ -969,14 +975,6 @@ namespace rndr { rctx->obj_scene_ubo.WriteMemory(rctx->obj_scene); - if (alpha_z_sort) { - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT, 1); - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2); - } - - if (opaque_z_sort) - rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_OPAQUE, 0); - //shaders_ft.env_vert_set(20, show_vector_length, show_vector_z_offset, 0.0f, 0.0f); for (int32_t i = 1; i < 4; i++) { if (!(show_vector_flags & (1 << (i - 1)))) diff --git a/src/CRE/render_manager.hpp b/src/CRE/render_manager.hpp index 593f8494..80c421ca 100644 --- a/src/CRE/render_manager.hpp +++ b/src/CRE/render_manager.hpp @@ -81,10 +81,10 @@ namespace rndr { texture* effect_texture; int32_t npr_param; bool field_31C; - bool field_31D; - bool field_31E; + bool reflect_texture_mask; + bool reflect_tone_curve; bool field_31F; - bool field_320; + bool light_stage_ambient; bool npr; RenderManager(); diff --git a/src/CRE/shader_ft.cpp b/src/CRE/shader_ft.cpp index 06066633..71644235 100644 --- a/src/CRE/shader_ft.cpp +++ b/src/CRE/shader_ft.cpp @@ -2087,7 +2087,7 @@ static const std::pair STAGE_uniform[] = { { U_NORMAL , false }, { U_FOG_HEIGHT , false }, { U_LIGHT_1 , false }, - { U12 , false }, + { U_STAGE_AMBIENT, false }, { U_ALPHA_TEST , true }, // 11th added }; diff --git a/src/CRE/stage.cpp b/src/CRE/stage.cpp index 8c9c4443..e69f9334 100644 --- a/src/CRE/stage.cpp +++ b/src/CRE/stage.cpp @@ -576,10 +576,10 @@ static void stage_free(stage* s) { render_manager->set_shadow_true(); rctx_ptr->render.set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; - render_manager->field_31D = false; - render_manager->field_31E = false; + render_manager->reflect_texture_mask = false; + render_manager->reflect_tone_curve = false; render_manager->field_31F = false; - render_manager->field_320 = false; + render_manager->light_stage_ambient = false; light_chara_ambient = false; if (s->auth_3d_loaded) { @@ -664,10 +664,10 @@ static void stage_set(stage* s, stage* other) { render_manager->set_reflect(false); render_manager->set_pass_sw(rndr::RND_PASSID_REFRACT, false); render_manager->set_refract(true); - render_manager->field_31D = false; - render_manager->field_31E = false; + render_manager->reflect_texture_mask = false; + render_manager->reflect_tone_curve = false; render_manager->field_31F = false; - render_manager->field_320 = false; + render_manager->light_stage_ambient = false; render_manager->set_shadow_true(); rctx_ptr->render.set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; @@ -698,16 +698,16 @@ static void stage_set(stage* s, stage* other) { render_manager->set_refract(true); } - if (other->stage_data->flags & STAGE_DATA_FLAG_1) - render_manager->field_31D = true; - if (other->stage_data->flags & STAGE_DATA_FLAG_4) - render_manager->field_31E = true; - if (other->stage_data->flags & STAGE_DATA_FLAG_8) - render_manager->field_320 = true; + if (other->stage_data->flags & STAGE_DATA_REFLECT_TEXTURE_MASK) + render_manager->reflect_texture_mask = true; + if (other->stage_data->flags & STAGE_DATA_REFLECT_TONE_CURVE) + render_manager->reflect_tone_curve = true; + if (other->stage_data->flags & STAGE_DATA_LIGHT_STAGE_AMBIENT) + render_manager->light_stage_ambient = true; if (other->stage_data->flags & STAGE_DATA_LIGHT_CHARA_AMBIENT) light_chara_ambient = true; - //if (stru_14CC92630.pv_id == 421) - //render_manager->field_31F = true; + //if (stage_param_data_coli_data.pv_id == 421) + // render_manager->field_31F = true; //sub_14064DC10(); effect_manager_set_current_stage_index(other->index); } diff --git a/src/CRE/stage_modern.cpp b/src/CRE/stage_modern.cpp index c88d900c..9a1c1588 100644 --- a/src/CRE/stage_modern.cpp +++ b/src/CRE/stage_modern.cpp @@ -574,10 +574,10 @@ static void stage_modern_free(stage_modern* s) { render_manager->set_shadow_true(); rctx_ptr->render.set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; - render_manager->field_31D = false; - render_manager->field_31E = false; + render_manager->reflect_texture_mask = false; + render_manager->reflect_tone_curve = false; render_manager->field_31F = false; - render_manager->field_320 = false; + render_manager->light_stage_ambient = false; light_chara_ambient = false; if (s->auth_3d_loaded) { @@ -655,10 +655,10 @@ static void stage_modern_set(stage_modern* s, stage_modern* other) { render_manager->set_reflect(false); render_manager->set_pass_sw(rndr::RND_PASSID_REFRACT, false); render_manager->set_refract(true); - render_manager->field_31D = false; - render_manager->field_31E = false; + render_manager->reflect_texture_mask = false; + render_manager->reflect_tone_curve = false; render_manager->field_31F = false; - render_manager->field_320 = false; + render_manager->light_stage_ambient = false; render_manager->set_shadow_true(); rctx_ptr->render.set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; diff --git a/src/CRE/static_var.hpp b/src/CRE/static_var.hpp index b2498ec4..5dfbdb3f 100644 --- a/src/CRE/static_var.hpp +++ b/src/CRE/static_var.hpp @@ -46,7 +46,7 @@ enum uniform_name { U_EXPOSURE, U_SCENE_FADE, U_FADE, - U12, + U_STAGE_AMBIENT, U_FLARE, U_FOG_HEIGHT, U_FOG, diff --git a/src/KKdLib/database/stage.hpp b/src/KKdLib/database/stage.hpp index f88433f8..e7b36db7 100644 --- a/src/KKdLib/database/stage.hpp +++ b/src/KKdLib/database/stage.hpp @@ -19,10 +19,10 @@ enum stage_data_format { }; enum stage_data_flags { - STAGE_DATA_FLAG_1 = 0x01, - STAGE_DATA_LIGHT_CHARA_AMBIENT = 0x02, - STAGE_DATA_FLAG_4 = 0x04, - STAGE_DATA_FLAG_8 = 0x08, + STAGE_DATA_REFLECT_TEXTURE_MASK = 0x01, + STAGE_DATA_LIGHT_CHARA_AMBIENT = 0x02, + STAGE_DATA_REFLECT_TONE_CURVE = 0x04, + STAGE_DATA_LIGHT_STAGE_AMBIENT = 0x08, }; enum stage_data_reflect_resolution_mode {