From fdce27ef4df05b6d4ca15d7cb70d85615924fde1 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 12 Jan 2024 22:02:15 +0300 Subject: [PATCH] Local objects --- src/DivaGL/mdl/disp_manager.cpp | 71 +++++++++++++++++++-------------- src/DivaGL/mdl/disp_manager.hpp | 8 ++++ src/DivaGL/render_context.hpp | 2 + src/DivaGL/render_manager.cpp | 11 +++-- 4 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index 5cadcdd..536b841 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -1458,7 +1458,7 @@ namespace mdl { std::vector alpha_center; std::vector mat_center; - for (ObjData*& i : obj[type]) { + for (ObjData*& i : get_obj_list(type)) { vec3 center = 0.0f; bool v50 = false; switch (i->kind) { @@ -1564,7 +1564,7 @@ namespace mdl { } void DispManager::draw(ObjType type, int32_t depth_mask, bool a4) { - if (get_obj_count(type) < 1) + if (type < 0 || type >= mdl::OBJ_TYPE_LOCAL_MAX || get_obj_count(type) < 1) return; int32_t alpha_test = 0; @@ -1588,7 +1588,7 @@ namespace mdl { switch (type) { case OBJ_TYPE_TRANSLUCENT: case OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS: - //case OBJ_TYPE_TRANSLUCENT_LOCAL: + case OBJ_TYPE_TRANSLUCENT_LOCAL: if (depth_mask) func = draw_sub_mesh_translucent; else @@ -1598,7 +1598,7 @@ namespace mdl { alpha_threshold = 0.0f; break; case OBJ_TYPE_TRANSPARENT: - //case OBJ_TYPE_TRANSPARENT_LOCAL: + case OBJ_TYPE_TRANSPARENT_LOCAL: alpha_test = 1; min_alpha = 0.1f; alpha_threshold = 0.5f; @@ -1676,7 +1676,7 @@ namespace mdl { rctx->obj_batch.g_max_alpha = { 0.0f, 0.0f, alpha_threshold, min_alpha }; uniform->arr[U_ALPHA_TEST] = alpha_test; - for (ObjData*& i : obj[type]) { + for (ObjData*& i : get_obj_list(type)) { switch (i->kind) { case OBJ_KIND_NORMAL: { draw_sub_mesh(&i->args.sub_mesh, &i->mat, func); @@ -1723,7 +1723,7 @@ namespace mdl { } void DispManager::draw_translucent(ObjType type, int32_t alpha) { - if (get_obj_count(type) < 1) + if (type < 0 || type >= mdl::OBJ_TYPE_LOCAL_MAX || get_obj_count(type) < 1) return; int32_t alpha_test = 0; @@ -1748,7 +1748,7 @@ namespace mdl { case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1: case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2: case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3: - //case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL: + case OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL: gl_state_set_depth_mask(GL_FALSE); alpha_test = 1; min_alpha = 0.0f; @@ -1757,7 +1757,7 @@ namespace mdl { case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_1: case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2: case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_3: - //case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL: + case OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL: alpha_test = 1; min_alpha = 0.1f; alpha_threshold = 0.5f; @@ -1766,7 +1766,7 @@ namespace mdl { rctx->obj_batch.g_max_alpha = { 0.0f, 0.0f, alpha_threshold, min_alpha }; uniform->arr[U_ALPHA_TEST] = alpha_test; - for (ObjData*& i : obj[type]) { + for (ObjData*& i : get_obj_list(type)) { switch (i->kind) { case OBJ_KIND_NORMAL: { int32_t a = (int32_t)(i->args.sub_mesh.blend_color.w * 255.0f); @@ -1818,7 +1818,7 @@ namespace mdl { uniform_value_reset(); gl_state_get(); - for (ObjData*& i : obj[type]) { + for (ObjData*& i : get_obj_list(type)) { switch (i->type) { case OBJ_KIND_NORMAL: { draw_sub_mesh_show_vector(&i->args.sub_mesh, @@ -1835,7 +1835,7 @@ namespace mdl { }*/ void DispManager::entry_list(ObjType type, ObjData* data) { - obj[type].push_back(data); + get_obj_list(type).push_back(data); } static int32_t obj_axis_aligned_bounding_box_check_visibility( @@ -2154,8 +2154,8 @@ namespace mdl { if (obj_flags & mdl::OBJ_ALPHA_ORDER_1) entry_list(OBJ_TYPE_OPAQUE_ALPHA_ORDER_1, data); else if (obj_flags & mdl::OBJ_ALPHA_ORDER_2) - entry_list(/*local ? OBJ_TYPE_OPAQUE_ALPHA_ORDER_2_LOCAL - : */OBJ_TYPE_OPAQUE_ALPHA_ORDER_2, data); + entry_list(local ? OBJ_TYPE_OPAQUE_ALPHA_ORDER_2_LOCAL + : OBJ_TYPE_OPAQUE_ALPHA_ORDER_2, data); else entry_list(OBJ_TYPE_OPAQUE_ALPHA_ORDER_3, data); } @@ -2163,8 +2163,8 @@ namespace mdl { if (obj_flags & mdl::OBJ_ALPHA_ORDER_1) entry_list(OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_1, data); else if (obj_flags & mdl::OBJ_ALPHA_ORDER_2) - entry_list(/*local ? OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL - : */OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2, data); + entry_list(local ? OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL + : OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2, data); else entry_list(OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_3, data); } @@ -2176,8 +2176,8 @@ namespace mdl { if (obj_flags & mdl::OBJ_ALPHA_ORDER_1) entry_list(OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, data); else if (obj_flags & mdl::OBJ_ALPHA_ORDER_2) - entry_list(/*local ? OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL - : */OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, data); + entry_list(local ? OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL + : OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, data); else entry_list(OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, data); } @@ -2194,8 +2194,8 @@ namespace mdl { if (attrib.punch_through) { if (!(obj_flags & mdl::OBJ_NO_TRANSLUCENCY)) - entry_list(/*local ? OBJ_TYPE_TRANSPARENT_LOCAL - : */OBJ_TYPE_TRANSPARENT, data); + entry_list(local ? OBJ_TYPE_TRANSPARENT_LOCAL + : OBJ_TYPE_TRANSPARENT, data); if (obj_flags & mdl::OBJ_CHARA_REFLECT) entry_list(OBJ_TYPE_REFLECT_CHARA_OPAQUE, data); @@ -2208,8 +2208,8 @@ namespace mdl { } else { if (!(obj_flags & mdl::OBJ_NO_TRANSLUCENCY)) - entry_list(/*local ? OBJ_TYPE_OPAQUE_LOCAL - : */OBJ_TYPE_OPAQUE, data); + entry_list(local ? OBJ_TYPE_OPAQUE_LOCAL + : OBJ_TYPE_OPAQUE, data); if (obj_flags & mdl::OBJ_20) entry_list(OBJ_TYPE_TYPE_6, data); @@ -2230,9 +2230,9 @@ namespace mdl { } else if (!(obj_flags & mdl::OBJ_NO_TRANSLUCENCY)) { if (!attrib.translucent_priority) - /*if (local) + if (local) entry_list(OBJ_TYPE_TRANSLUCENT_LOCAL, data); - else */if (mesh->attrib.m.translucent_sort_by_radius + else if (mesh->attrib.m.translucent_sort_by_radius || obj_flags & mdl::OBJ_TRANSLUCENT_SORT_BY_RADIUS) { entry_list(OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, data); } @@ -2285,13 +2285,13 @@ namespace mdl { if (obj_flags & mdl::OBJ_ALPHA_ORDER_1) entry_list(OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, data); else if (obj_flags & mdl::OBJ_ALPHA_ORDER_2) - entry_list(/*local ? OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL - : */OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, data); + entry_list(local ? OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL + : OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, data); else if (obj_flags & mdl::OBJ_ALPHA_ORDER_3) entry_list(OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, data); else - entry_list(/*local ? OBJ_TYPE_TRANSLUCENT_LOCAL - : */OBJ_TYPE_TRANSLUCENT, data); + entry_list(local ? OBJ_TYPE_TRANSLUCENT_LOCAL + : OBJ_TYPE_TRANSLUCENT, data); } return true; } @@ -2466,10 +2466,10 @@ namespace mdl { if (etc->color.a == 0xFF) { if (!local && (obj_flags & OBJ_SHADOW)) entry_list((mdl::ObjType)(OBJ_TYPE_SHADOW_CHARA + shadow_type), data); - entry_list(/*local ? OBJ_TYPE_OPAQUE_LOCAL : */OBJ_TYPE_OPAQUE, data); + entry_list(local ? OBJ_TYPE_OPAQUE_LOCAL : OBJ_TYPE_OPAQUE, data); } else - entry_list(/*local ? OBJ_TYPE_TRANSLUCENT_LOCAL : */OBJ_TYPE_TRANSLUCENT, data); + entry_list(local ? OBJ_TYPE_TRANSLUCENT_LOCAL : OBJ_TYPE_TRANSLUCENT, data); } void DispManager::entry_obj_user(const mat4* mat, UserArgsFunc func, void* data, ObjType type) { @@ -2592,6 +2592,12 @@ namespace mdl { return chara_color; } + prj::list& DispManager::get_obj_list(mdl::ObjType type) { +#pragma warning(suppress: 33010) +#pragma warning(suppress: 33011) + return type >= mdl::OBJ_TYPE_MAX ? rctx->obj_local[type - mdl::OBJ_TYPE_MAX] : disp_manager->obj[type]; + } + void DispManager::get_morph(object_info& object, float_t& weight) { weight = morph.weight; object = morph.object; @@ -2615,7 +2621,7 @@ namespace mdl { } int32_t DispManager::get_obj_count(ObjType type) { - return (int32_t)obj[type].size(); + return (int32_t)get_obj_list(type).size(); } ObjFlags DispManager::get_obj_flags() { @@ -2661,7 +2667,7 @@ namespace mdl { } void DispManager::obj_sort(mat4* view, ObjType type, int32_t compare_func) { - prj::list& list = obj[type]; + prj::list& list = get_obj_list(type); if (list.size() < 1) return; @@ -2708,6 +2714,9 @@ namespace mdl { for (prj::list& i : obj) i.clear(); + for (prj::list& i : rctx->obj_local) + i.clear(); + buffer_reset(); } diff --git a/src/DivaGL/mdl/disp_manager.hpp b/src/DivaGL/mdl/disp_manager.hpp index d3e9401..9ecae66 100644 --- a/src/DivaGL/mdl/disp_manager.hpp +++ b/src/DivaGL/mdl/disp_manager.hpp @@ -106,6 +106,13 @@ namespace mdl { OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, OBJ_TYPE_USER, OBJ_TYPE_MAX, + OBJ_TYPE_OPAQUE_LOCAL = OBJ_TYPE_MAX, + OBJ_TYPE_TRANSLUCENT_LOCAL, + OBJ_TYPE_TRANSPARENT_LOCAL, + OBJ_TYPE_OPAQUE_ALPHA_ORDER_2_LOCAL, + OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL, + OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, + OBJ_TYPE_LOCAL_MAX, }; } @@ -451,6 +458,7 @@ namespace mdl { GLuint get_vertex_array(const ObjSubMeshArgs* args); GLuint get_vertex_array(const mdl::EtcObj* etc); bool get_chara_color(); + prj::list& get_obj_list(mdl::ObjType type); void get_morph(object_info& object, float_t& weight); void get_obj_center(mat4& mat, const mdl::ObjSubMeshArgs* args, vec3& center); int32_t get_obj_count(ObjType type); diff --git a/src/DivaGL/render_context.hpp b/src/DivaGL/render_context.hpp index efe8748..d02d423 100644 --- a/src/DivaGL/render_context.hpp +++ b/src/DivaGL/render_context.hpp @@ -312,6 +312,8 @@ struct render_context { int32_t screen_width; int32_t screen_height; + prj::list obj_local[mdl::OBJ_TYPE_LOCAL_MAX - mdl::OBJ_TYPE_MAX]; + render_context(); ~render_context(); diff --git a/src/DivaGL/render_manager.cpp b/src/DivaGL/render_manager.cpp index a24e395..124a6ea 100644 --- a/src/DivaGL/render_manager.cpp +++ b/src/DivaGL/render_manager.cpp @@ -710,7 +710,7 @@ namespace rndr { disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1); disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1); disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1); - //disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, 1); + disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, 1); } if (opaque_z_sort) @@ -1587,9 +1587,9 @@ static int32_t draw_pass_3d_get_translucent_count() { count += disp_manager->get_obj_count(mdl::OBJ_TYPE_OPAQUE_ALPHA_ORDER_3); count += disp_manager->get_obj_count(mdl::OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_3); count += disp_manager->get_obj_count(mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3); - //count += disp_manager->get_obj_count(mdl::OBJ_TYPE_OPAQUE_ALPHA_ORDER_2_LOCAL); - //count += disp_manager->get_obj_count(mdl::OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL); - //count += disp_manager->get_obj_count(mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL); + count += disp_manager->get_obj_count(mdl::OBJ_TYPE_OPAQUE_ALPHA_ORDER_2_LOCAL); + count += disp_manager->get_obj_count(mdl::OBJ_TYPE_TRANSPARENT_ALPHA_ORDER_2_LOCAL); + count += disp_manager->get_obj_count(mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL); return count; } @@ -1745,8 +1745,7 @@ static int32_t draw_pass_3d_translucent_count_layers(int32_t* alpha_array, static void draw_pass_3d_translucent_has_objects(bool* arr, mdl::ObjType type) { disp_manager->calc_obj_radius(&rctx->view_mat, type); - prj::list& vec = disp_manager->obj[type]; - for (mdl::ObjData*& i : vec) + for (mdl::ObjData*& i : disp_manager->get_obj_list(type)) switch (i->kind) { case mdl::OBJ_KIND_NORMAL: { int32_t alpha = (int32_t)(i->args.sub_mesh.blend_color.w * 255.0f);