From 386cdbba5b3a8ed0223ef4c1a4456e2967de3827 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 6 Dec 2023 22:25:47 +0300 Subject: [PATCH] Added Alpha and Mat Center --- src/DivaGL/mdl/disp_manager.cpp | 142 ++++++++++++++++++++++++-------- src/DivaGL/mdl/disp_manager.hpp | 25 +++++- src/DivaGL/render_manager.cpp | 3 +- 3 files changed, 132 insertions(+), 38 deletions(-) diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index 70749a4..d0ed1e6 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -1144,6 +1144,88 @@ namespace mdl { buff_offset = 0; } + void DispManager::calc_obj_radius(mat4* view, mdl::ObjType type) { + std::vector alpha_center; + std::vector mat_center; + + for (ObjData*& i : obj[type]) { + vec3 center = 0.0f; + bool v50 = false; + switch (i->kind) { + case OBJ_KIND_NORMAL: { + mat4 mat = i->mat; + if (i->args.sub_mesh.mesh->attrib.m.billboard) + model_mat_face_camera_view(view, &mat, &mat); + else if (i->args.sub_mesh.mesh->attrib.m.billboard_y_axis) + model_mat_face_camera_position(view, &mat, &mat); + + get_obj_center(mat, &i->args.sub_mesh, center); + + v50 = !!i->args.sub_mesh.material->material.attrib.m.flag_30; + i->radius = i->args.sub_mesh.mesh->bounding_sphere.radius; + } break; + case OBJ_KIND_ETC: + case OBJ_KIND_USER: + mat4_get_translation(&i->mat, ¢er); + break; + case OBJ_KIND_TRANSLUCENT: + vec3 center_sum = 0.0f; + for (int32_t j = 0; j < i->args.translucent.count; j++) { + vec3 _center = 0.0f; + get_obj_center(i->mat, i->args.translucent.sub_mesh[j], _center); + if (i->args.translucent.sub_mesh[j]->material->material.attrib.m.flag_30) { + v50 = true; + break; + } + + center_sum += _center; + } + + if (!v50) + center = center_sum * (1.0f / (float_t)i->args.translucent.count); + break; + } + + if (show_alpha_center && type == OBJ_TYPE_TRANSLUCENT) + alpha_center.push_back(center); + if (show_mat_center && type == OBJ_TYPE_TRANSLUCENT && v50) + mat_center.push_back(center); + + mat4_transform_point(view, ¢er, ¢er); + i->view_z = center.z; + } + + if (show_alpha_center && type == OBJ_TYPE_TRANSLUCENT) + for (vec3& i : alpha_center) { + mdl::EtcObj etc; + etc.init(ETC_OBJ_SPHERE); + etc.color = { 0xFF, 0x00, 0x00, 0xFF }; + etc.data.sphere.radius = 0.05f; + etc.data.sphere.slices = 8; + etc.data.sphere.stacks = 8; + etc.data.sphere.wire = false; + + mat4 mat; + mat4_translate(&i, &mat); + mdl::DispManager::entry_obj_etc(&mat, &etc); + } + + if (show_mat_center && type == OBJ_TYPE_TRANSLUCENT) + for (vec3& i : alpha_center) { + mdl::EtcObj etc; + etc.init(ETC_OBJ_SPHERE); + etc.color = { 0x00, 0x00, 0xFF, 0xFF }; + etc.data.sphere.radius = 0.05f; + etc.data.sphere.slices = 8; + etc.data.sphere.stacks = 8; + etc.data.sphere.wire = false; + + mat4 mat; + mat4_translate(&i, &mat); + mdl::DispManager::entry_obj_etc(&mat, &etc); + } + } + void DispManager::check_vertex_arrays() { for (DispManager::vertex_array& i : vertex_array_cache) if (i.alive_time > 0 && --i.alive_time <= 0) { @@ -1289,7 +1371,7 @@ namespace mdl { i->args.user.func(i->args.user.data); } break; case OBJ_KIND_TRANSLUCENT: { - for (uint32_t j = 0; j < i->args.translucent.count; j++) + for (int32_t j = 0; j < i->args.translucent.count; j++) draw_sub_mesh(i->args.translucent.sub_mesh[j], &i->mat, func); } break; } @@ -1376,7 +1458,7 @@ namespace mdl { draw_sub_mesh(&i->args.sub_mesh, &i->mat, func); } break; case OBJ_KIND_TRANSLUCENT: { - for (uint32_t j = 0; j < i->args.translucent.count; j++) { + for (int32_t j = 0; j < i->args.translucent.count; j++) { ObjSubMeshArgs* args = i->args.translucent.sub_mesh[j]; int32_t a = (int32_t)(args->blend_color.w * 255.0f); a = clamp_def(a, 0, 255); @@ -1426,7 +1508,7 @@ namespace mdl { &i->mat, show_vector); } break; case OBJ_KIND_TRANSLUCENT: { - for (uint32_t j = 0; j < i->args.translucent.count; j++) + for (int32_t j = 0; j < i->args.translucent.count; j++) draw_sub_mesh_show_vector(i->args.translucent.sub_mesh[j], &i->mat, show_vector); } break; @@ -2074,19 +2156,36 @@ namespace mdl { return chara_color; } - ObjFlags DispManager::get_obj_flags() { - return obj_flags; - } - void DispManager::get_morph(object_info& object, float_t& weight) { weight = morph.weight; object = morph.object; } + void DispManager::get_obj_center(mat4& mat, const mdl::ObjSubMeshArgs* args, vec3& center) { + const vec3 bounding_sphere_center = args->sub_mesh->bounding_sphere.center; + if (args->mat_count <= 0 || !args->sub_mesh->num_bone_index) { + mat4_transform_point(&mat, &bounding_sphere_center, ¢er); + return; + } + + vec3 center_sum = 0.0f; + int32_t num_bone_index = args->sub_mesh->num_bone_index; + for (int32_t i = 0; i < num_bone_index; i++) { + vec3 _center; + mat4_transform_point(&args->mats[i], &bounding_sphere_center, &_center); + center_sum += _center; + } + center = center_sum * (1.0f / (float_t)num_bone_index); + } + int32_t DispManager::get_obj_count(ObjType type) { return (int32_t)obj[type].size(); } + ObjFlags DispManager::get_obj_flags() { + return obj_flags; + } + shadow_type_enum DispManager::get_shadow_type() { return shadow_type; } @@ -2130,34 +2229,7 @@ namespace mdl { if (list.size() < 1) return; - for (ObjData*& i : list) { - vec3 center; - mat4_get_translation(&i->mat, ¢er); - if (i->kind == OBJ_KIND_NORMAL) { - mat4 mat = i->mat; - if (i->args.sub_mesh.mesh->attrib.m.billboard) - model_mat_face_camera_view(view, &mat, &mat); - else if (i->args.sub_mesh.mesh->attrib.m.billboard_y_axis) - model_mat_face_camera_position(view, &mat, &mat); - - const obj_sub_mesh* sub_mesh = i->args.sub_mesh.sub_mesh; - if (i->args.sub_mesh.mat_count < 1 || !sub_mesh->num_bone_index) - mat4_transform_point(&mat, &sub_mesh->bounding_sphere.center, ¢er); - else { - vec3 center_sum = 0.0f; - for (uint32_t j = 0; j < sub_mesh->num_bone_index; j++) { - center = sub_mesh->bounding_sphere.center; - mat4_transform_point(&i->args.sub_mesh.mats[j], ¢er, ¢er); - center_sum += center; - } - center_sum *= 1.0f / (float_t)sub_mesh->num_bone_index; - } - i->radius = i->args.sub_mesh.mesh->bounding_sphere.radius; - } - - mat4_transform_point(view, ¢er, ¢er); - i->view_z = center.z; - } + calc_obj_radius(view, type); switch (compare_func) { case 0: diff --git a/src/DivaGL/mdl/disp_manager.hpp b/src/DivaGL/mdl/disp_manager.hpp index 641ada5..b6575b9 100644 --- a/src/DivaGL/mdl/disp_manager.hpp +++ b/src/DivaGL/mdl/disp_manager.hpp @@ -176,6 +176,8 @@ namespace mdl { struct EtcObjTeapot { float_t size; + + EtcObjTeapot(); }; static_assert(sizeof(mdl::EtcObjTeapot) == 0x04, "\"mdl::EtcObjTeapot\" struct should have a size of 0x04"); @@ -185,6 +187,8 @@ namespace mdl { int32_t h; int32_t ws; int32_t hs; + + EtcObjGrid(); }; static_assert(sizeof(mdl::EtcObjGrid) == 0x10, "\"mdl::EtcObjGrid\" struct should have a size of 0x10"); @@ -192,6 +196,8 @@ namespace mdl { struct EtcObjCube { vec3 size; bool wire; + + EtcObjCube(); }; static_assert(sizeof(mdl::EtcObjCube) == 0x10, "\"mdl::EtcObjCube\" struct should have a size of 0x10"); @@ -201,6 +207,8 @@ namespace mdl { int32_t slices; int32_t stacks; bool wire; + + EtcObjSphere(); }; static_assert(sizeof(mdl::EtcObjSphere) == 0x10, "\"mdl::EtcObjSphere\" struct should have a size of 0x10"); @@ -208,6 +216,8 @@ namespace mdl { struct EtcObjPlane { int32_t w; int32_t h; + + EtcObjPlane(); }; static_assert(sizeof(mdl::EtcObjPlane) == 0x08, "\"mdl::EtcObjPlane\" struct should have a size of 0x08"); @@ -218,18 +228,24 @@ namespace mdl { int32_t slices; int32_t stacks; bool wire; + + EtcObjCone(); }; static_assert(sizeof(mdl::EtcObjCone) == 0x14, "\"mdl::EtcObjCone\" struct should have a size of 0x14"); struct EtcObjLine { vec3 pos[2]; + + EtcObjLine(); }; static_assert(sizeof(mdl::EtcObjLine) == 0x18, "\"mdl::EtcObjLine\" struct should have a size of 0x18"); struct EtcObjCross { float_t size; + + EtcObjCross(); }; static_assert(sizeof(mdl::EtcObjCross) == 0x04, "\"mdl::EtcObjCross\" struct should have a size of 0x04"); @@ -244,6 +260,8 @@ namespace mdl { EtcObjCone cone; EtcObjLine line; EtcObjCross cross; + + Data(); }; EtcObjType type; @@ -253,6 +271,7 @@ namespace mdl { GLsizei count; // Added size_t offset; // Added + EtcObj(); void init(EtcObjType type); }; @@ -268,7 +287,7 @@ namespace mdl { static_assert(sizeof(mdl::UserArgs) == 0x10, "\"mdl::UserArgs\" struct should have a size of 0x10"); struct ObjTranslucentArgs { - uint32_t count; + int32_t count; ObjSubMeshArgs* sub_mesh[40]; }; @@ -383,6 +402,7 @@ namespace mdl { ObjData* alloc_obj_data(ObjKind kind); mat4* alloc_mat4_array(int32_t count); void buffer_reset(); + void calc_obj_radius(mat4* view, mdl::ObjType type); void check_vertex_arrays(); void draw(mdl::ObjType type, int32_t depth_mask = 0, bool a4 = true); void draw_translucent(mdl::ObjType type, int32_t alpha); @@ -414,9 +434,10 @@ namespace mdl { GLuint get_vertex_array(const ObjSubMeshArgs* args); GLuint get_vertex_array(const mdl::EtcObj* etc); bool get_chara_color(); - ObjFlags get_obj_flags(); 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); + ObjFlags get_obj_flags(); shadow_type_enum get_shadow_type(); void get_texture_color_coeff(vec4& value); void get_texture_color_offset(vec4& value); diff --git a/src/DivaGL/render_manager.cpp b/src/DivaGL/render_manager.cpp index bc5a874..bc50cfd 100644 --- a/src/DivaGL/render_manager.cpp +++ b/src/DivaGL/render_manager.cpp @@ -1735,6 +1735,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) switch (i->kind) { @@ -1744,7 +1745,7 @@ static void draw_pass_3d_translucent_has_objects(bool* arr, mdl::ObjType type) { arr[alpha] = true; } break; case mdl::OBJ_KIND_TRANSLUCENT: { - for (uint32_t j = 0; j < i->args.translucent.count; j++) { + for (int32_t j = 0; j < i->args.translucent.count; j++) { int32_t alpha = (int32_t)(i->args.translucent.sub_mesh[j]->blend_color.w * 255.0f); alpha = clamp_def(alpha, 0, 255); arr[alpha] = true;