diff --git a/src/CRE/draw_object.cpp b/src/CRE/draw_object.cpp index 7e7a08ea..4723e5a5 100644 --- a/src/CRE/draw_object.cpp +++ b/src/CRE/draw_object.cpp @@ -897,7 +897,7 @@ static void draw_object_vertex_attrib_reset_default(const mdl::ObjSubMeshArgs* a if (vertex_format & OBJ_VERTEX_BONE_DATA) uniform_value[U_BONE_MAT] = 0; - if (args->morph_array_buffer) { + if (args->morph_vertex_buffer) { uniform_value[U_MORPH] = 0; uniform_value[U_MORPH_COLOR] = 0; } @@ -915,7 +915,7 @@ static void draw_object_vertex_attrib_reset_reflect(const mdl::ObjSubMeshArgs* a if (vertex_format & OBJ_VERTEX_BONE_DATA) uniform_value[U_BONE_MAT] = 0; - if (args->morph_array_buffer) { + if (args->morph_vertex_buffer) { uniform_value[U_MORPH] = 0; uniform_value[U_MORPH_COLOR] = 0; } @@ -965,7 +965,7 @@ static void draw_object_vertex_attrib_set_default(render_context* rctx, const md else uniform_value[U_BONE_MAT] = 0; - if (args->morph_array_buffer) { + if (args->morph_vertex_buffer) { uniform_value[U_MORPH] = 1; if (vertex_format & OBJ_VERTEX_COLOR0) @@ -1010,7 +1010,7 @@ static void draw_object_vertex_attrib_set_reflect(render_context* rctx, const md else uniform_value[U_BONE_MAT] = 0; - if (args->morph_array_buffer) { + if (args->morph_vertex_buffer) { uniform_value[U_MORPH] = 1; if (vertex_format & OBJ_VERTEX_COLOR0) diff --git a/src/CRE/post_process.cpp b/src/CRE/post_process.cpp index 334b1ab0..7e31f7f7 100644 --- a/src/CRE/post_process.cpp +++ b/src/CRE/post_process.cpp @@ -384,7 +384,7 @@ void post_process::draw_lens_flare(camera* cam) { sun_quad_ubo.WriteMapMemory(shader_data); glBeginQuery(GL_SAMPLES_PASSED, lens_shaft_query[next_query_index]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); mat4_translate_mult(&cam->view, (vec3*)&v44, &mat); @@ -399,7 +399,7 @@ void post_process::draw_lens_flare(camera* cam) { sun_quad_ubo.WriteMapMemory(shader_data); glBeginQuery(GL_SAMPLES_PASSED, lens_flare_query[next_query_index]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); diff --git a/src/CRE/post_process/exposure.cpp b/src/CRE/post_process/exposure.cpp index 3926c83e..0ed7a908 100644 --- a/src/CRE/post_process/exposure.cpp +++ b/src/CRE/post_process/exposure.cpp @@ -231,7 +231,7 @@ void post_process_exposure::get_exposure_chara_data(void* pp_data, camera* cam) pp->sun_quad_ubo.WriteMapMemory(shader_data); glBeginQuery(GL_SAMPLES_PASSED, chara->query[next_query_index]); - shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); if (chara->query_data[next_query_index] == -1) diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index ba1232af..9d480f5a 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -156,8 +156,8 @@ texture_transform_struct::texture_transform_struct(uint32_t id, mat4& mat) : id( namespace mdl { void ObjData::init_sub_mesh(DispManager* disp_manager, const mat4* mat, float_t radius, obj_sub_mesh* sub_mesh, obj_mesh* mesh, obj_material_data* material, - std::vector* textures, int32_t mat_count, mat4* mats, GLuint array_buffer, - GLuint element_array_buffer, vec4* blend_color, vec4* emission, int32_t morph_array_buffer, + std::vector* textures, int32_t mat_count, mat4* mats, GLuint vertex_buffer, + GLuint index_buffer, vec4* blend_color, vec4* emission, int32_t morph_vertex_buffer, int32_t instances_count, mat4* instances_mat, void(*func)(const ObjSubMeshArgs*)) { kind = mdl::OBJ_KIND_NORMAL; this->mat = *mat; @@ -171,9 +171,9 @@ namespace mdl { args->textures = textures; args->mat_count = mat_count; args->mats = mats; - args->array_buffer = array_buffer; - args->element_array_buffer = element_array_buffer; - args->morph_array_buffer = morph_array_buffer; + args->vertex_buffer = vertex_buffer; + args->index_buffer = index_buffer; + args->morph_vertex_buffer = morph_vertex_buffer; args->texture_pattern_count = disp_manager->texture_pattern_count; for (int32_t i = 0; i < disp_manager->texture_pattern_count && i < TEXTURE_PATTERN_COUNT; i++) @@ -355,9 +355,9 @@ namespace mdl { const obj_sub_mesh* sub_mesh = args->sub_mesh; const obj_material_data* material = args->material; - GLuint array_buffer = args->array_buffer; - GLuint morph_array_buffer = args->morph_array_buffer; - GLuint element_array_buffer = args->element_array_buffer; + GLuint vertex_buffer = args->vertex_buffer; + GLuint morph_vertex_buffer = args->morph_vertex_buffer; + GLuint index_buffer = args->index_buffer; int32_t texcoord_array[2] = { -1, -1 }; int32_t color_tex_index = 0; @@ -386,8 +386,9 @@ namespace mdl { DispManager::vertex_array* vertex_array = 0; for (DispManager::vertex_array& i : vertex_array_cache) - if (i.alive_time >= 0 && i.array_buffer == array_buffer && i.morph_array_buffer == morph_array_buffer - && i.element_array_buffer == element_array_buffer && i.vertex_format == vertex_format + if (i.alive_time >= 0 && i.vertex_buffer == vertex_buffer + && i.morph_vertex_buffer == morph_vertex_buffer + && i.index_buffer == index_buffer && i.vertex_format == vertex_format && i.size_vertex == size_vertex && i.compressed == compressed && !memcmp(i.vertex_attrib_buffer_binding, vertex_attrib_buffer_binding, sizeof(vertex_attrib_buffer_binding)) @@ -436,9 +437,9 @@ namespace mdl { glVertexAttrib4f( BONE_INDEX_INDEX, 0.0f, 0.0f, 0.0f, 0.0f); } - vertex_array->array_buffer = array_buffer; - vertex_array->morph_array_buffer = morph_array_buffer; - vertex_array->element_array_buffer = element_array_buffer; + vertex_array->vertex_buffer = vertex_buffer; + vertex_array->morph_vertex_buffer = morph_vertex_buffer; + vertex_array->index_buffer = index_buffer; vertex_array->alive_time = 60; vertex_array->vertex_format = vertex_format; vertex_array->size_vertex = size_vertex; @@ -448,9 +449,9 @@ namespace mdl { vertex_attrib_buffer_binding, sizeof(vertex_attrib_buffer_binding)); gl_state_bind_vertex_array(vertex_array->vertex_array); - gl_state_bind_array_buffer(array_buffer); - if (element_array_buffer) - gl_state_bind_element_array_buffer(element_array_buffer, true); + gl_state_bind_array_buffer(vertex_buffer); + if (index_buffer) + gl_state_bind_element_array_buffer(index_buffer, true); size_t offset = 0; if (vertex_format & OBJ_VERTEX_POSITION) { @@ -639,8 +640,8 @@ namespace mdl { vertex_array->vertex_attrib_array[UNKNOWN_INDEX] = false; } - if (morph_array_buffer) { - gl_state_bind_array_buffer(morph_array_buffer); + if (morph_vertex_buffer) { + gl_state_bind_array_buffer(morph_vertex_buffer); offset = 0; if (vertex_format & OBJ_VERTEX_POSITION) { @@ -835,7 +836,7 @@ namespace mdl { gl_state_bind_array_buffer(0); gl_state_bind_vertex_array(0); - if (element_array_buffer) + if (index_buffer) gl_state_bind_element_array_buffer(0); } @@ -893,8 +894,8 @@ namespace mdl { void DispManager::check_vertex_arrays() { for (DispManager::vertex_array& i : vertex_array_cache) if (i.alive_time > 0 && --i.alive_time <= 0) { - i.array_buffer = 0; - i.morph_array_buffer = 0; + i.vertex_buffer = 0; + i.morph_vertex_buffer = 0; } } @@ -1240,6 +1241,12 @@ namespace mdl { std::vector* textures, vec4* blend_color, mat4* bone_mat, ::obj* object_morph, obj_mesh_vertex_buffer* obj_morph_vertex_buf, int32_t instances_count, mat4* instances_mat, void(*func)(const ObjSubMeshArgs*), bool enable_bone_mat, bool local) { + if (!obj_vertex_buf || !obj_index_buf) { + printf_debug("mdl::DispManager::entry_obj: no vertex or index object buffer to draw;\n"); + printf_debug(" Object: %s\n", object->name); + return false; + } + ::camera* cam = rctx_ptr->camera; cam->update_data(); @@ -1347,17 +1354,23 @@ namespace mdl { if (!data) continue; - GLuint morph_array_buffer = 0; + GLuint morph_vertex_buffer = 0; if (obj_morph_vertex_buf) - morph_array_buffer = obj_morph_vertex_buf[i].get_buffer(); + morph_vertex_buffer = obj_morph_vertex_buf[i].get_buffer(); - GLuint element_array_buffer = 0; + GLuint index_buffer = 0; if (obj_index_buf) - element_array_buffer = obj_index_buf[i].buffer; + index_buffer = obj_index_buf[i].buffer; - GLuint array_buffer = 0; + GLuint vertex_buffer = 0; if (obj_vertex_buf) - array_buffer = obj_vertex_buf[i].get_buffer(); + vertex_buffer = obj_vertex_buf[i].get_buffer(); + + if (!vertex_buffer || !index_buffer || obj_morph_vertex_buf && !morph_vertex_buffer) { + printf_debug("mdl::DispManager::entry_obj: no vertex or index mesh buffer to draw;\n"); + printf_debug(" Object: %s; Mesh: %s; Sub Mesh: %d\n", object->name, mesh->name, j); + continue; + } uint32_t material_hash = hash_utf8_murmurhash(material->material.name); @@ -1431,8 +1444,8 @@ namespace mdl { } data->init_sub_mesh(this, mat, object->bounding_sphere.radius, sub_mesh, - mesh, material, textures, num_bone_index, mats, array_buffer, element_array_buffer, - &_blend_color, &_emission, morph_array_buffer, instances_count, instances_mat, func); + mesh, material, textures, num_bone_index, mats, vertex_buffer, index_buffer, + &_blend_color, &_emission, morph_vertex_buffer, instances_count, instances_mat, func); if (obj_flags & mdl::OBJ_SHADOW_OBJECT) { entry_list((ObjType)(OBJ_TYPE_SHADOW_OBJECT_CHARA @@ -1535,11 +1548,8 @@ namespace mdl { || obj_flags & mdl::OBJ_TRANSLUCENT_NO_SHADOW) { entry_list(OBJ_TYPE_TRANSLUCENT_NO_SHADOW, data); } - else { + else entry_list(OBJ_TYPE_TRANSLUCENT, data); - entry_list(OBJ_TYPE_TRANSLUCENT_LITPROJ_0, data); - entry_list(OBJ_TYPE_TRANSLUCENT_LITPROJ_1, data); - } else if (translucent_priority_count < 40) translucent_priority[translucent_priority_count++] = &data->args.sub_mesh; } @@ -1729,9 +1739,9 @@ namespace mdl { const obj_sub_mesh* sub_mesh = args->sub_mesh; const obj_material_data* material = args->material; - GLuint array_buffer = args->array_buffer; - GLuint morph_array_buffer = args->morph_array_buffer; - GLuint element_array_buffer = args->element_array_buffer; + GLuint vertex_buffer = args->vertex_buffer; + GLuint morph_vertex_buffer = args->morph_vertex_buffer; + GLuint index_buffer = args->index_buffer; int32_t texcoord_array[2] = { -1, -1 }; int32_t color_tex_index = 0; @@ -1760,8 +1770,9 @@ namespace mdl { DispManager::vertex_array* vertex_array = 0; for (DispManager::vertex_array& i : vertex_array_cache) - if (i.alive_time > 0 && i.array_buffer == array_buffer && i.morph_array_buffer == morph_array_buffer - && i.element_array_buffer == element_array_buffer && i.vertex_format == vertex_format + if (i.alive_time > 0 && i.vertex_buffer == vertex_buffer + && i.morph_vertex_buffer == morph_vertex_buffer + && i.index_buffer == index_buffer && i.vertex_format == vertex_format && i.size_vertex == size_vertex && i.compressed == compressed && !memcmp(i.vertex_attrib_buffer_binding, vertex_attrib_buffer_binding, sizeof(vertex_attrib_buffer_binding)) @@ -2975,51 +2986,51 @@ static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshA const obj_mesh* mesh = args->mesh; const obj_sub_mesh* sub_mesh = args->sub_mesh; - GLuint array_buffer = args->array_buffer; - GLuint morph_array_buffer = args->morph_array_buffer; + GLuint vertex_buffer = args->vertex_buffer; + GLuint morph_vertex_buffer = args->morph_vertex_buffer; bool compressed = mesh->attrib.m.compressed; GLsizei size_vertex = (GLsizei)mesh->size_vertex; obj_vertex_format vertex_format = mesh->vertex_format; if (vertex_format & OBJ_VERTEX_POSITION) - vertex_attrib_buffer_binding[POSITION_INDEX] = array_buffer; + vertex_attrib_buffer_binding[POSITION_INDEX] = vertex_buffer; if (vertex_format & OBJ_VERTEX_NORMAL) - vertex_attrib_buffer_binding[NORMAL_INDEX] = array_buffer; + vertex_attrib_buffer_binding[NORMAL_INDEX] = vertex_buffer; if (vertex_format & OBJ_VERTEX_TANGENT) - vertex_attrib_buffer_binding[TANGENT_INDEX] = array_buffer; + vertex_attrib_buffer_binding[TANGENT_INDEX] = vertex_buffer; for (int32_t i = 0; i < 2; i++) { int32_t texcoord_index = texcoord_array[i]; if (texcoord_index >= 0) if (vertex_format & (OBJ_VERTEX_TEXCOORD0 << texcoord_index)) - vertex_attrib_buffer_binding[TEXCOORD0_INDEX + i] = array_buffer; + vertex_attrib_buffer_binding[TEXCOORD0_INDEX + i] = vertex_buffer; } if (vertex_format & OBJ_VERTEX_COLOR0) - vertex_attrib_buffer_binding[COLOR0_INDEX] = array_buffer; + vertex_attrib_buffer_binding[COLOR0_INDEX] = vertex_buffer; if (vertex_format & OBJ_VERTEX_BONE_DATA) { - vertex_attrib_buffer_binding[BONE_WEIGHT_INDEX] = array_buffer; - vertex_attrib_buffer_binding[BONE_INDEX_INDEX] = array_buffer; + vertex_attrib_buffer_binding[BONE_WEIGHT_INDEX] = vertex_buffer; + vertex_attrib_buffer_binding[BONE_INDEX_INDEX] = vertex_buffer; } if (!compressed && vertex_format & OBJ_VERTEX_UNKNOWN) - vertex_attrib_buffer_binding[UNKNOWN_INDEX] = array_buffer; + vertex_attrib_buffer_binding[UNKNOWN_INDEX] = vertex_buffer; - if (args->morph_array_buffer) { + if (args->morph_vertex_buffer) { if (vertex_format & OBJ_VERTEX_POSITION) - vertex_attrib_buffer_binding[MORPH_POSITION_INDEX] = morph_array_buffer; + vertex_attrib_buffer_binding[MORPH_POSITION_INDEX] = morph_vertex_buffer; if (vertex_format & OBJ_VERTEX_NORMAL) - vertex_attrib_buffer_binding[MORPH_NORMAL_INDEX] = morph_array_buffer; + vertex_attrib_buffer_binding[MORPH_NORMAL_INDEX] = morph_vertex_buffer; if (vertex_format & OBJ_VERTEX_TANGENT) - vertex_attrib_buffer_binding[MORPH_TANGENT_INDEX] = morph_array_buffer; + vertex_attrib_buffer_binding[MORPH_TANGENT_INDEX] = morph_vertex_buffer; if (vertex_format & OBJ_VERTEX_TEXCOORD0) - vertex_attrib_buffer_binding[MORPH_TEXCOORD0_INDEX] = morph_array_buffer; + vertex_attrib_buffer_binding[MORPH_TEXCOORD0_INDEX] = morph_vertex_buffer; if (vertex_format & OBJ_VERTEX_TEXCOORD1) - vertex_attrib_buffer_binding[MORPH_TEXCOORD1_INDEX] = morph_array_buffer; + vertex_attrib_buffer_binding[MORPH_TEXCOORD1_INDEX] = morph_vertex_buffer; if (vertex_format & OBJ_VERTEX_COLOR0) - vertex_attrib_buffer_binding[MORPH_COLOR_INDEX] = morph_array_buffer; + vertex_attrib_buffer_binding[MORPH_COLOR_INDEX] = morph_vertex_buffer; } } diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index c10de89f..44bb10d2 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -107,15 +107,9 @@ namespace mdl { enum ObjType { OBJ_TYPE_OPAQUE = 0, - OBJ_TYPE_OPAQUE_LITPROJ_0, // Added - OBJ_TYPE_OPAQUE_LITPROJ_1, // Added OBJ_TYPE_TRANSLUCENT, - OBJ_TYPE_TRANSLUCENT_LITPROJ_0, // Added - OBJ_TYPE_TRANSLUCENT_LITPROJ_1, // Added OBJ_TYPE_TRANSLUCENT_NO_SHADOW, OBJ_TYPE_TRANSPARENT, - OBJ_TYPE_TRANSPARENT_LITPROJ_0, // Added - OBJ_TYPE_TRANSPARENT_LITPROJ_1, // Added OBJ_TYPE_SHADOW_CHARA, OBJ_TYPE_SHADOW_STAGE, OBJ_TYPE_TYPE_6, @@ -273,15 +267,15 @@ namespace mdl { int32_t mat_count; const mat4* mats; GLuint vertex_array; - GLuint array_buffer; - GLuint element_array_buffer; + GLuint vertex_buffer; + GLuint index_buffer; bool set_blend_color; bool chara_color; vec4 blend_color; vec4 emission; bool self_shadow; shadow_type_enum shadow; - GLuint morph_array_buffer; + GLuint morph_vertex_buffer; float_t morph_weight; int32_t texture_pattern_count; texture_pattern_struct texture_pattern_array[TEXTURE_PATTERN_COUNT]; @@ -393,8 +387,8 @@ namespace mdl { void init_sub_mesh(DispManager* disp_manager, const mat4* mat, float_t radius, obj_sub_mesh* sub_mesh, obj_mesh* mesh, obj_material_data* material, - std::vector* textures, int32_t mat_count, mat4* mats, GLuint array_buffer, - GLuint element_array_buffer, vec4* blend_color, vec4* emission, int32_t morph_array_buffer, + std::vector* textures, int32_t mat_count, mat4* mats, GLuint vertex_buffer, + GLuint index_buffer, vec4* blend_color, vec4* emission, int32_t morph_vertex_buffer, int32_t instances_count, mat4* instances_mat, void(*func)(const ObjSubMeshArgs*)); void init_translucent(const mat4* mat, ObjTranslucentArgs* translucent); void init_user(const mat4* mat, UserArgsFunc func, void* data); @@ -451,9 +445,9 @@ namespace mdl { struct DispManager { struct vertex_array { - GLuint array_buffer; - GLuint morph_array_buffer; - GLuint element_array_buffer; + GLuint vertex_buffer; + GLuint morph_vertex_buffer; + GLuint index_buffer; int32_t alive_time; GLuint vertex_array; bool vertex_attrib_array[16]; diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 3be0fc4e..a47f0566 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -163,9 +163,9 @@ namespace rndr { if (rctx->litproj->set(rctx)) { rctx->obj_scene_ubo.WriteMapMemory(rctx->obj_scene); - rctx->disp_manager.draw(mdl::OBJ_TYPE_OPAQUE_LITPROJ_0); - rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSPARENT_LITPROJ_0); - rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSLUCENT_LITPROJ_0); + rctx->disp_manager.draw(mdl::OBJ_TYPE_OPAQUE); + rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSPARENT); + rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSLUCENT); rctx->draw_state.shader_index = -1; uniform_value[U0A] = 0; @@ -180,12 +180,12 @@ namespace rndr { rctx->obj_scene_ubo.WriteMapMemory(rctx->obj_scene); - rctx->disp_manager.draw(mdl::OBJ_TYPE_OPAQUE_LITPROJ_1); - rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSPARENT_LITPROJ_1); - rctx->disp_manager.obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_LITPROJ_1, 1); + rctx->disp_manager.draw(mdl::OBJ_TYPE_OPAQUE); + rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSPARENT); + rctx->disp_manager.obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT, 1); gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gl_state_enable_blend(); - rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSLUCENT_LITPROJ_1); + rctx->disp_manager.draw(mdl::OBJ_TYPE_TRANSLUCENT); gl_state_disable_blend(); rctx->draw_state.shader_index = -1; gl_state_bind_framebuffer(0); diff --git a/src/ReDIVA/classes/data_view/draw_task.cpp b/src/ReDIVA/classes/data_view/draw_task.cpp index 374c9436..4824968e 100644 --- a/src/ReDIVA/classes/data_view/draw_task.cpp +++ b/src/ReDIVA/classes/data_view/draw_task.cpp @@ -11,15 +11,9 @@ static const char* draw_object_type_name[] = { "Opaque", - "Opaque [Show Vector]", - "Opaque [Show Vector]", "Translucent", - "Translucent [Show Vector]", - "Translucent [Show Vector]", "Translucent (No Shadow)", "Transparent", - "Transparent [Show Vector]", - "Transparent [Show Vector]", "Shadow Chara", "Shadow Stage", "Type 6", diff --git a/src/ReDIVA/data_edit.cpp b/src/ReDIVA/data_edit.cpp index 50aaa488..741bb631 100644 --- a/src/ReDIVA/data_edit.cpp +++ b/src/ReDIVA/data_edit.cpp @@ -5,6 +5,7 @@ #if defined(ReDIVA_DEV) #include "data_edit.hpp" +#include "../CRE/rob/motion.hpp" #include "../CRE/rob/rob.hpp" #include "../CRE/ogg_vorbis.hpp" #include "../CRE/sound.hpp" diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 4479c359..58b05cda 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -6691,16 +6691,16 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, obj_vertex_data* vertex = mesh->vertex_array; for (uint32_t l = 0; l < num_vertex; l++, vertex++) { if (vertex->bone_index.x != -1) - bone_indices.insert(vertex->bone_index.x / 3); + bone_indices.insert(vertex->bone_index.x); if (vertex->bone_index.y != -1) - bone_indices.insert(vertex->bone_index.y / 3); + bone_indices.insert(vertex->bone_index.y); if (vertex->bone_index.z != -1) - bone_indices.insert(vertex->bone_index.z / 3); + bone_indices.insert(vertex->bone_index.z); if (vertex->bone_index.w != -1) - bone_indices.insert(vertex->bone_index.w / 3); + bone_indices.insert(vertex->bone_index.w); } } @@ -6736,8 +6736,8 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, for (uint32_t m = 0; m < num_submesh; m++, sub_mesh++) { x_pv_game_split_auth_3d_hrc_obj_sub_mesh& bone_vertices_sub_mesh = bone_vertices_mesh.sub_meshes[m]; + bone_vertices_mesh.vertices.reserve(sub_mesh->num_index); } - bone_vertices_mesh.vertices.reserve(sub_mesh->num_index); } } @@ -6755,7 +6755,7 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, uint32_t num_index = sub_mesh->num_index; for (uint32_t m = 0; m < num_index; m++, index++) { obj_vertex_data vertex = vertex_array[*index]; - int32_t bone_index = bone_index_array[vertex.bone_index.x / 3]; + int32_t bone_index = bone_index_array[vertex.bone_index.x]; x_pv_game_split_auth_3d_hrc_obj_mesh& bone_vertices_mesh = bones_vertices[bone_index].meshes[k]; x_pv_game_split_auth_3d_hrc_obj_sub_mesh& bone_vertices_sub_mesh @@ -6832,13 +6832,23 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, obj_mesh* mesh_array = src_obj->mesh_array; uint32_t num_mesh = src_obj->num_mesh; - obj_mesh* mesh_array_new = alloc->allocate(num_mesh); + uint32_t act_num_mesh = 0; for (uint32_t k = 0; k < num_mesh; k++) { x_pv_game_split_auth_3d_hrc_obj_mesh& bone_vertices_mesh = bone_vertices.meshes[k]; + if (bone_vertices_mesh.vertices.size()) + act_num_mesh++; + } + + obj_mesh* mesh_array_new = alloc->allocate(act_num_mesh); + for (uint32_t k = 0, k1 = 0; k < num_mesh; k++) { + x_pv_game_split_auth_3d_hrc_obj_mesh& bone_vertices_mesh + = bone_vertices.meshes[k]; + if (!bone_vertices_mesh.vertices.size()) + continue; obj_mesh* src_mesh = &mesh_array[k]; - obj_mesh* dst_mesh = &mesh_array_new[k]; + obj_mesh* dst_mesh = &mesh_array_new[k1++]; dst_mesh->flags = src_mesh->flags; @@ -6887,12 +6897,10 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, aabb_max_mesh = vec3::max(aabb_max_mesh, aabb_max_submesh); vec3 center = (aabb_max_submesh + aabb_min_submesh) * 0.5f; - vec3 size = aabb_max_submesh - center; - dst_submesh->bounding_sphere.center = center; - dst_submesh->bounding_sphere.radius = max_def(size.x, max_def(size.y, size.z)) * (float_t)(M_SQRT2 / 2.0); + dst_submesh->bounding_sphere.radius = vec3::length(aabb_max_submesh - aabb_min_submesh) * 0.5f; dst_submesh->axis_aligned_bounding_box.center = center; - dst_submesh->axis_aligned_bounding_box.size = size; + dst_submesh->axis_aligned_bounding_box.size = aabb_max_submesh - center; dst_submesh->first_index = 0; @@ -6908,8 +6916,8 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, vec3 center = (aabb_max_mesh + aabb_min_mesh) * 0.5f; vec3 size = aabb_max_mesh - center; - dst_mesh->bounding_sphere.center = center; - dst_mesh->bounding_sphere.radius = max_def(size.x, max_def(size.y, size.z)) * (float_t)(M_SQRT2 / 2.0); + dst_mesh->bounding_sphere.center = (aabb_max_mesh + aabb_min_mesh) * 0.5f; + dst_mesh->bounding_sphere.radius = vec3::length(aabb_max_mesh - aabb_min_mesh) * 0.5f; dst_mesh->vertex_format = src_mesh->vertex_format; if (src_mesh->vertex_format & OBJ_VERTEX_BONE_DATA) { @@ -6930,13 +6938,10 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, memcpy(dst_mesh->name, src_mesh->name, 0x40); } dst_obj->mesh_array = mesh_array_new; - dst_obj->num_mesh = num_mesh; + dst_obj->num_mesh = act_num_mesh; - vec3 center = (aabb_max_obj + aabb_min_obj) * 0.5f; - vec3 size = aabb_max_obj - center; - - dst_obj->bounding_sphere.center = center; - dst_obj->bounding_sphere.radius = max_def(size.x, max_def(size.y, size.z)) * (float_t)(M_SQRT2 / 2.0); + dst_obj->bounding_sphere.center = (aabb_max_obj + aabb_min_obj) * 0.5f; + dst_obj->bounding_sphere.radius = vec3::length(aabb_max_obj - aabb_min_obj) * 0.5f; obj_material_data* material_array = src_obj->material_array; uint32_t num_material = src_obj->num_material;