From a80fec73fb92be71867e9567c5e36587f37d60c3 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 30 Jun 2023 03:35:57 +0300 Subject: [PATCH] Fix objects breakdown --- src/CRE/render_context.cpp | 116 +++++++++++++++---------------------- src/CRE/render_context.hpp | 42 ++++++-------- 2 files changed, 64 insertions(+), 94 deletions(-) diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 5e140d9c..97d2f3d0 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -271,13 +271,11 @@ namespace mdl { disp_manager->add_vertex_array(&args.etc, this->mat); } - 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 vertex_buffer, - GLuint index_buffer, vec4* blend_color, vec4* emission, GLuint morph_vertex_buffer, -#if SHARED_OBJECT_BUFFER - size_t vertex_buffer_offset, size_t morph_vertex_buffer_offset, -#endif + 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 vertex_buffer, GLuint index_buffer,*/ + obj_mesh_vertex_buffer* vertex_buffer, obj_mesh_index_buffer* index_buffer, vec4* blend_color, + vec4* emission, /*GLuint morph_vertex_buffer,*/ obj_mesh_vertex_buffer* morph_vertex_buffer, int32_t instances_count, mat4* instances_mat, void(*func)(const ObjSubMeshArgs*)) { kind = mdl::OBJ_KIND_NORMAL; this->mat = *mat; @@ -294,10 +292,6 @@ namespace mdl { args->vertex_buffer = vertex_buffer; args->index_buffer = index_buffer; args->morph_vertex_buffer = morph_vertex_buffer; -#if SHARED_OBJECT_BUFFER - args->vertex_buffer_offset = vertex_buffer_offset; - args->morph_vertex_buffer_offset = morph_vertex_buffer_offset; -#endif 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++) @@ -495,13 +489,12 @@ namespace mdl { const obj_sub_mesh* sub_mesh = args->sub_mesh; const obj_material_data* material = args->material; - GLuint vertex_buffer = args->vertex_buffer; - GLuint morph_vertex_buffer = args->morph_vertex_buffer; -#if SHARED_OBJECT_BUFFER - size_t vertex_buffer_offset = args->vertex_buffer_offset; - size_t morph_vertex_buffer_offset = args->morph_vertex_buffer_offset; -#endif - GLuint index_buffer = args->index_buffer; + //GLuint vertex_buffer = args->vertex_buffer; + obj_mesh_vertex_buffer* vertex_buffer = args->vertex_buffer; + //GLuint morph_vertex_buffer = args->morph_vertex_buffer; + obj_mesh_vertex_buffer* morph_vertex_buffer = args->morph_vertex_buffer; + //GLuint index_buffer = args->index_buffer; + obj_mesh_index_buffer* index_buffer = args->index_buffer; int32_t texcoord_array[2] = { -1, -1 }; int32_t color_tex_index = 0; @@ -532,10 +525,6 @@ namespace mdl { for (DispManager::vertex_array& i : vertex_array_cache) if (i.alive_time >= 0 && i.vertex_buffer == vertex_buffer && i.morph_vertex_buffer == morph_vertex_buffer -#if SHARED_OBJECT_BUFFER - && i.vertex_buffer_offset == vertex_buffer_offset - && i.morph_vertex_buffer_offset == morph_vertex_buffer_offset -#endif && i.index_buffer == index_buffer && i.vertex_format == vertex_format && i.size_vertex == size_vertex && i.compressed == compressed && !memcmp(i.vertex_attrib_buffer_binding, @@ -586,10 +575,6 @@ namespace mdl { vertex_array->vertex_buffer = vertex_buffer; vertex_array->morph_vertex_buffer = morph_vertex_buffer; -#if SHARED_OBJECT_BUFFER - vertex_array->vertex_buffer_offset = vertex_buffer_offset; - vertex_array->morph_vertex_buffer_offset = morph_vertex_buffer_offset; -#endif vertex_array->index_buffer = index_buffer; vertex_array->alive_time = 60; vertex_array->vertex_format = vertex_format; @@ -600,12 +585,15 @@ 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(vertex_buffer); + //gl_state_bind_array_buffer(vertex_buffer); + gl_state_bind_array_buffer(vertex_buffer->get_buffer()); if (index_buffer) - gl_state_bind_element_array_buffer(index_buffer, true); + //gl_state_bind_element_array_buffer(index_buffer, true); + gl_state_bind_element_array_buffer(index_buffer->buffer, true); #if SHARED_OBJECT_BUFFER - size_t offset = vertex_buffer_offset; + //size_t offset = vertex_buffer_offset; + size_t offset = vertex_buffer->get_offset(); #else size_t offset = 0; #endif @@ -796,12 +784,14 @@ namespace mdl { } if (morph_vertex_buffer) { - gl_state_bind_array_buffer(morph_vertex_buffer); + //gl_state_bind_array_buffer(morph_vertex_buffer); + gl_state_bind_array_buffer(morph_vertex_buffer->get_buffer()); #if SHARED_OBJECT_BUFFER - offset = morph_vertex_buffer_offset; + //size_t offset = morph_vertex_buffer_offset; + size_t offset = morph_vertex_buffer->get_offset(); #else - offset = 0; + size_t offset = 0; #endif if (vertex_format & OBJ_VERTEX_POSITION) { if (!vertex_array->vertex_attrib_array[MORPH_POSITION_INDEX]) { @@ -2309,27 +2299,21 @@ namespace mdl { if (!data) continue; - GLuint morph_vertex_buffer = 0; - if (obj_morph_vertex_buf) - morph_vertex_buffer = obj_morph_vertex_buf[i].get_buffer(); + //GLuint morph_vertex_buffer = 0; + //if (obj_morph_vertex_buf) + // morph_vertex_buffer = obj_morph_vertex_buf[i].get_buffer(); + obj_mesh_vertex_buffer* morph_vertex_buffer + = obj_morph_vertex_buf ? &obj_morph_vertex_buf[i] : 0; - GLuint index_buffer = 0; - if (obj_index_buf) - index_buffer = obj_index_buf[i].buffer; + //GLuint index_buffer = 0; + //if (obj_index_buf) + // index_buffer = obj_index_buf[i].buffer; + obj_mesh_index_buffer* index_buffer = &obj_index_buf[i]; - GLuint vertex_buffer = 0; - if (obj_vertex_buf) - vertex_buffer = obj_vertex_buf[i].get_buffer(); - -#if SHARED_OBJECT_BUFFER - size_t morph_vertex_buffer_offset = 0; - if (obj_morph_vertex_buf) - morph_vertex_buffer_offset = obj_morph_vertex_buf[i].get_offset(); - - size_t vertex_buffer_offset = 0; - if (obj_vertex_buf) - vertex_buffer_offset = obj_vertex_buf[i].get_offset(); -#endif + //GLuint vertex_buffer = 0; + //if (obj_vertex_buf) + // vertex_buffer = obj_vertex_buf[i].get_buffer(); + obj_mesh_vertex_buffer* vertex_buffer = &obj_vertex_buf[i]; 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"); @@ -2410,12 +2394,7 @@ namespace mdl { data->init_sub_mesh(this, mat, object->bounding_sphere.radius, sub_mesh, mesh, material, textures, num_bone_index, mats, vertex_buffer, index_buffer, -#if SHARED_OBJECT_BUFFER - &_blend_color, &_emission, morph_vertex_buffer, - vertex_buffer_offset, morph_vertex_buffer_offset, instances_count, instances_mat, func); -#else &_blend_color, &_emission, morph_vertex_buffer, instances_count, instances_mat, func); -#endif if (obj_flags & mdl::OBJ_SHADOW_OBJECT) { entry_list((ObjType)(OBJ_TYPE_SHADOW_OBJECT_CHARA @@ -2724,13 +2703,12 @@ namespace mdl { const obj_sub_mesh* sub_mesh = args->sub_mesh; const obj_material_data* material = args->material; - GLuint vertex_buffer = args->vertex_buffer; - GLuint morph_vertex_buffer = args->morph_vertex_buffer; -#if SHARED_OBJECT_BUFFER - size_t vertex_buffer_offset = args->vertex_buffer_offset; - size_t morph_vertex_buffer_offset = args->morph_vertex_buffer_offset; -#endif - GLuint index_buffer = args->index_buffer; + //GLuint vertex_buffer = args->vertex_buffer; + obj_mesh_vertex_buffer* vertex_buffer = args->vertex_buffer; + //GLuint morph_vertex_buffer = args->morph_vertex_buffer; + obj_mesh_vertex_buffer* morph_vertex_buffer = args->morph_vertex_buffer; + //GLuint index_buffer = args->index_buffer; + obj_mesh_index_buffer* index_buffer = args->index_buffer; int32_t texcoord_array[2] = { -1, -1 }; int32_t color_tex_index = 0; @@ -2760,10 +2738,6 @@ namespace mdl { for (DispManager::vertex_array& i : vertex_array_cache) if (i.alive_time > 0 && i.vertex_buffer == vertex_buffer && i.morph_vertex_buffer == morph_vertex_buffer -#if SHARED_OBJECT_BUFFER - && i.vertex_buffer_offset == vertex_buffer_offset - && i.morph_vertex_buffer_offset == morph_vertex_buffer_offset -#endif && i.index_buffer == index_buffer && i.vertex_format == vertex_format && i.size_vertex == size_vertex && i.compressed == compressed && !memcmp(i.vertex_attrib_buffer_binding, @@ -4123,8 +4097,12 @@ 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 vertex_buffer = args->vertex_buffer; - GLuint morph_vertex_buffer = args->morph_vertex_buffer; + //GLuint vertex_buffer = args->vertex_buffer; + GLuint vertex_buffer = args->vertex_buffer + ? args->vertex_buffer->get_buffer() : 0; + //GLuint morph_vertex_buffer = args->morph_vertex_buffer; + GLuint morph_vertex_buffer = args->morph_vertex_buffer + ? args->morph_vertex_buffer->get_buffer() : 0; bool compressed = mesh->attrib.m.compressed; GLsizei size_vertex = (GLsizei)mesh->size_vertex; diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 507fd869..15503306 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -269,20 +269,18 @@ namespace mdl { const std::vector* textures; int32_t mat_count; const mat4* mats; - GLuint vertex_array; - GLuint vertex_buffer; - GLuint index_buffer; + //GLuint vertex_buffer; + obj_mesh_vertex_buffer* vertex_buffer; + //GLuint index_buffer; + obj_mesh_index_buffer* index_buffer; bool set_blend_color; bool chara_color; vec4 blend_color; vec4 emission; bool self_shadow; shadow_type_enum shadow; - GLuint morph_vertex_buffer; -#if SHARED_OBJECT_BUFFER - size_t vertex_buffer_offset; - size_t morph_vertex_buffer_offset; -#endif + //GLuint morph_vertex_buffer; + obj_mesh_vertex_buffer* morph_vertex_buffer; float_t morph_weight; int32_t texture_pattern_count; texture_pattern_struct texture_pattern_array[TEXTURE_PATTERN_COUNT]; @@ -432,13 +430,11 @@ namespace mdl { Args args; void init_etc(DispManager* disp_manager, const mat4* mat, mdl::EtcObj* etc); - 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 vertex_buffer, - GLuint index_buffer, vec4* blend_color, vec4* emission, GLuint morph_vertex_buffer, -#if SHARED_OBJECT_BUFFER - size_t vertex_buffer_offset, size_t morph_vertex_buffer_offset, -#endif + 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 vertex_buffer, GLuint index_buffer,*/ + obj_mesh_vertex_buffer* vertex_buffer, obj_mesh_index_buffer* index_buffer, vec4* blend_color, + vec4* emission, /*GLuint morph_vertex_buffer,*/ obj_mesh_vertex_buffer* 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); @@ -495,16 +491,12 @@ namespace mdl { struct DispManager { struct vertex_array { -#if SHARED_OBJECT_BUFFER - GLuint vertex_buffer; - size_t vertex_buffer_offset; - GLuint morph_vertex_buffer; - size_t morph_vertex_buffer_offset; -#else - GLuint vertex_buffer; - GLuint morph_vertex_buffer; -#endif - GLuint index_buffer; + //GLuint vertex_buffer; + obj_mesh_vertex_buffer* vertex_buffer; + //GLuint morph_vertex_buffer; + obj_mesh_vertex_buffer* morph_vertex_buffer; + //GLuint index_buffer; + obj_mesh_index_buffer* index_buffer; int32_t alive_time; GLuint vertex_array; bool vertex_attrib_array[16];