diff --git a/src/CRE/GL/array_buffer.cpp b/src/CRE/GL/array_buffer.cpp index d3030f01..c8e89162 100644 --- a/src/CRE/GL/array_buffer.cpp +++ b/src/CRE/GL/array_buffer.cpp @@ -95,7 +95,7 @@ namespace GL { } void ArrayBuffer::WriteMemory(size_t offset, size_t size, const void* data) { - if (!buffer) + if (!buffer || !size) return; if (GL_VERSION_4_5) diff --git a/src/CRE/GL/element_array_buffer.cpp b/src/CRE/GL/element_array_buffer.cpp index a0ec9674..1bb00cfd 100644 --- a/src/CRE/GL/element_array_buffer.cpp +++ b/src/CRE/GL/element_array_buffer.cpp @@ -95,7 +95,7 @@ namespace GL { } void ElementArrayBuffer::WriteMemory(size_t offset, size_t size, const void* data) { - if (!buffer) + if (!buffer || !size) return; if (GL_VERSION_4_5) diff --git a/src/CRE/GL/shader_storage_buffer.cpp b/src/CRE/GL/shader_storage_buffer.cpp index e8e28f60..99abc20c 100644 --- a/src/CRE/GL/shader_storage_buffer.cpp +++ b/src/CRE/GL/shader_storage_buffer.cpp @@ -95,7 +95,7 @@ namespace GL { } void ShaderStorageBuffer::WriteMemory(size_t offset, size_t size, const void* data) { - if (!buffer) + if (!buffer || !size) return; if (GL_VERSION_4_5) diff --git a/src/CRE/GL/uniform_buffer.cpp b/src/CRE/GL/uniform_buffer.cpp index 44bdfa39..d6bab09c 100644 --- a/src/CRE/GL/uniform_buffer.cpp +++ b/src/CRE/GL/uniform_buffer.cpp @@ -95,7 +95,7 @@ namespace GL { } void UniformBuffer::WriteMemory(size_t offset, size_t size, const void* data) { - if (!buffer) + if (!buffer || !size) return; if (GL_VERSION_4_5) diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index f71a28c1..36fbef08 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -98,12 +98,12 @@ namespace Glitter { continue; for (Particle*& k : j->particles) { - if (!k || k->vao || k->vbo) + if (!k || k->buffer) continue; else if (k->data.type == PARTICLE_MESH || k->max_count <= 0 || init_buffers <= 0) continue; - CreateBuffer(k->max_count, k->data.type == PARTICLE_QUAD, k->vao, k->vbo, k->ebo); + CreateBuffer(k->max_count, k->data.type == PARTICLE_QUAD, k->buffer, k->vao, k->vbo, k->ebo); init_buffers--; glt_particle_manager->DecrementInitBuffersByCount(); } diff --git a/src/CRE/Glitter/glitter.cpp b/src/CRE/Glitter/glitter.cpp index 1ca1290c..8604ca4c 100644 --- a/src/CRE/Glitter/glitter.cpp +++ b/src/CRE/Glitter/glitter.cpp @@ -281,7 +281,11 @@ namespace Glitter { *angle = (float_t)M_PI - *angle; } - void CreateBuffer(size_t max_count, bool is_quad, GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo) { + void CreateBuffer(size_t max_count, bool is_quad, + Buffer*& buffer, GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo) { + free_def(buffer); + buffer = force_malloc(max_count); + glGenVertexArrays(1, &vao); gl_state_bind_vertex_array(vao, true); @@ -322,7 +326,7 @@ namespace Glitter { gl_state_bind_element_array_buffer(0); } - void DeleteBuffer(GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo) { + void DeleteBuffer(Buffer*& buffer, GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo) { ebo.Destroy(); vbo.Destroy(); @@ -330,6 +334,7 @@ namespace Glitter { glDeleteVertexArrays(1, &vao); vao = 0; } - } + free_def(buffer); + } } diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 6f3b3133..a61f666f 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -784,6 +784,7 @@ namespace Glitter { mat4 mat_rot; mat4 mat_draw; RenderElement* elements; + Buffer* buffer; size_t max_count; Random* random_ptr; DispType disp_type; @@ -1359,6 +1360,7 @@ namespace Glitter { }; Data data; + Buffer* buffer; GLuint vao; GL::ArrayBuffer vbo; GL::ElementArrayBuffer ebo; @@ -1709,8 +1711,8 @@ namespace Glitter { extern void axis_angle_from_vectors(vec3* axis, float_t* angle, const vec3* vec0, const vec3* vec1); extern void CreateBuffer(size_t max_count, bool is_quad, - GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo); - extern void DeleteBuffer(GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo); + Buffer*& buffer, GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo); + extern void DeleteBuffer(Buffer*& buffer, GLuint& vao, GL::ArrayBuffer& vbo, GL::ElementArrayBuffer& ebo); extern void glt_particle_manager_init(); extern bool glt_particle_manager_add_task(); diff --git a/src/CRE/Glitter/particle.cpp b/src/CRE/Glitter/particle.cpp index d1abe654..589002e1 100644 --- a/src/CRE/Glitter/particle.cpp +++ b/src/CRE/Glitter/particle.cpp @@ -16,7 +16,7 @@ namespace Glitter { } - Particle::Particle(GLT) : vao(), max_count(), buffer_used() { + Particle::Particle(GLT) : buffer(), vao(), max_count(), buffer_used() { version = GLT_VAL == Glitter::X ? 0x05 : 0x03; data.pivot = PIVOT_MIDDLE_CENTER; data.scale = 1.0f; @@ -47,6 +47,6 @@ namespace Glitter { } Particle::~Particle() { - Glitter::DeleteBuffer(vao, vbo, ebo); + Glitter::DeleteBuffer(buffer, vao, vbo, ebo); } } diff --git a/src/CRE/Glitter/render_group.cpp b/src/CRE/Glitter/render_group.cpp index f9fafb3e..094fa487 100644 --- a/src/CRE/Glitter/render_group.cpp +++ b/src/CRE/Glitter/render_group.cpp @@ -6,9 +6,9 @@ #include "glitter.hpp" namespace Glitter { - RenderGroup::RenderGroup() : flags(), type(), draw_type(), pivot(), - z_offset(), count(), ctrl(), disp(), texture(), mask_texture(), frame(), - elements(), max_count(), random_ptr(), disp_type(), fog_type(), vao() { + RenderGroup::RenderGroup() : flags(), type(), draw_type(), pivot(), z_offset(), + count(), ctrl(), disp(), texture(), mask_texture(), frame(), elements(), + buffer(), max_count(), random_ptr(), disp_type(), fog_type(), vao() { split_u = 1; split_v = 1; split_uv = 1.0f; @@ -80,7 +80,8 @@ namespace Glitter { bool is_quad = ptcl_inst->data.data.type == PARTICLE_QUAD; Particle* ptcl = particle->data.particle; - if (ptcl && ptcl->vao && ptcl->vbo && !ptcl->buffer_used) { + if (ptcl && ptcl->buffer && !ptcl->buffer_used) { + buffer = ptcl->buffer; max_count = ptcl->max_count; vao = ptcl->vao; vbo = ptcl->vbo; @@ -90,7 +91,7 @@ namespace Glitter { } if (use_own_buffer) - CreateBuffer(max_count, is_quad, vao, vbo, ebo); + CreateBuffer(max_count, is_quad, buffer, vao, vbo, ebo); if (!is_quad) draw_list.reserve(count); @@ -233,8 +234,8 @@ namespace Glitter { } if (use_own_buffer) - Glitter::DeleteBuffer(vao, vbo, ebo); - else if (ptcl && ptcl->vao && ptcl->vbo) + Glitter::DeleteBuffer(buffer, vao, vbo, ebo); + else if (ptcl && ptcl->buffer) ptcl->buffer_used = false; if (!free && elements) { @@ -379,7 +380,8 @@ namespace Glitter { bool is_quad = ptcl_inst->data.data.type == PARTICLE_QUAD; Particle* ptcl = particle->data.particle; - if (ptcl && ptcl->vao && ptcl->vbo && !ptcl->buffer_used) { + if (ptcl && ptcl->buffer && !ptcl->buffer_used) { + buffer = ptcl->buffer; max_count = ptcl->max_count; vao = ptcl->vao; vbo = ptcl->vbo; @@ -389,7 +391,7 @@ namespace Glitter { } if (use_own_buffer) - CreateBuffer(max_count, is_quad, vao, vbo, ebo); + CreateBuffer(max_count, is_quad, buffer, vao, vbo, ebo); if (!is_quad) draw_list.reserve(count); @@ -555,8 +557,8 @@ namespace Glitter { } if (use_own_buffer) - Glitter::DeleteBuffer(vao, vbo, ebo); - else if (ptcl && ptcl->vao && ptcl->vbo) + Glitter::DeleteBuffer(buffer, vao, vbo, ebo); + else if (ptcl && ptcl->buffer) ptcl->buffer_used = false; if (!free && elements) { diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 76a03d97..ada042cc 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -250,7 +250,7 @@ namespace Glitter { else rend_group->mat_draw = mat4_identity; - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -295,7 +295,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void F2RenderScene::CalcDispLocus(GPM, F2RenderGroup* rend_group) { @@ -353,7 +353,7 @@ namespace Glitter { mat3_transform_vector(&rctx_ptr->camera->inv_view_mat3, &x_vec, &x_vec); - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -439,7 +439,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void F2RenderScene::CalcDispQuad(GPM, F2RenderGroup* rend_group) { @@ -542,7 +542,7 @@ namespace Glitter { vec3 scale; mat4_get_scale(model_mat, &scale); - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -626,7 +626,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void F2RenderScene::CalcDispQuadNormal(GPM, @@ -691,7 +691,7 @@ namespace Glitter { mat4_transform_vector(&inv_model_mat, &x_vec, &x_vec); mat4_transform_vector(&inv_model_mat, &y_vec, &y_vec); - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -847,7 +847,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void F2RenderScene::Ctrl(GLT, float_t delta_frame) { @@ -1179,7 +1179,7 @@ namespace Glitter { else rend_group->mat_draw = mat4_identity; - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -1223,7 +1223,8 @@ namespace Glitter { } } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void XRenderScene::CalcDispLocus(GPM, XRenderGroup* rend_group) { @@ -1279,7 +1280,7 @@ namespace Glitter { mat3_transform_vector(&rctx_ptr->camera->inv_view_mat3, &x_vec, &x_vec); - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -1365,7 +1366,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void XRenderScene::CalcDispMesh(GPM, XRenderGroup* rend_group) { @@ -1653,7 +1654,7 @@ namespace Glitter { y_vec_base.y *= scale.y; } - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -1735,7 +1736,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } void XRenderScene::CalcDispQuadNormal(XRenderGroup* rend_group, mat4* model_mat, mat4* dir_mat) { @@ -1797,7 +1798,7 @@ namespace Glitter { mat4_transform_vector(&inv_model_mat, &x_vec, &x_vec); mat4_transform_vector(&inv_model_mat, &y_vec, &y_vec); - Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + Buffer* buf = rend_group->buffer; if (!buf) return; @@ -1947,7 +1948,7 @@ namespace Glitter { } rend_group->disp = disp; - rend_group->vbo.UnmapMemory(); + rend_group->vbo.WriteMemory(0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); } bool XRenderScene::CanDisp(DispType disp_type, bool a3) {