FIX:vbo set to 0 after glDeleteBuffers

and Array out of bounds protection
jira:none

Change-Id: I3f7a9f99ba4b95e0351419ab9a1b0e1be161444f
This commit is contained in:
zhou.xu 2024-09-25 10:04:20 +08:00 committed by Lane.Wei
parent 060daf2428
commit 5cab5e2111
2 changed files with 26 additions and 10 deletions

View File

@ -459,6 +459,20 @@ GLModel::~GLModel()
if (mesh) { delete mesh; }
}
size_t GLModel::get_vertices_count(int i) const {
if (m_render_data.empty() || i >= m_render_data.size()) {
return 0;
}
return m_render_data[i].vertices_count > 0 ? m_render_data[i].vertices_count : m_render_data[i].geometry.vertices_count();
}
size_t GLModel::get_indices_count(int i) const {
if (m_render_data.empty() || i >= m_render_data.size()) {
return 0;
}
return m_render_data[i].indices_count > 0 ? m_render_data[i].indices_count : m_render_data[i].geometry.indices_count();
}
void GLModel::init_from(Geometry &&data, bool generate_mesh)
{
if (is_initialized()) {
@ -731,10 +745,14 @@ void GLModel::reset()
{
for (RenderData& data : m_render_data) {
// release gpu memory
if (data.ibo_id > 0)
if (data.ibo_id > 0) {
glsafe(::glDeleteBuffers(1, &data.ibo_id));
if (data.vbo_id > 0)
data.ibo_id = 0;
}
if (data.vbo_id > 0) {
glsafe(::glDeleteBuffers(1, &data.vbo_id));
data.vbo_id = 0;
}
}
m_render_data.clear();
@ -842,7 +860,7 @@ void GLModel::render() const
}
void GLModel::render_geometry() {
render_geometry(0,std::make_pair<size_t, size_t>(0, indices_count()));
render_geometry(0,std::make_pair<size_t, size_t>(0, get_indices_count()));
}
void GLModel::render_geometry(int i,const std::pair<size_t, size_t> &range)
@ -918,6 +936,7 @@ void GLModel::create_or_update_mats_vbo(unsigned int &vbo, const std::vector<Sli
{ // first bind
if (vbo>0) {
glsafe(::glDeleteBuffers(1, &vbo));
vbo = 0;
}
std::vector<Matrix4f> out_mats;
out_mats.reserve(mats.size());
@ -958,7 +977,7 @@ void GLModel::bind_mats_vbo(unsigned int instance_mats_vbo, unsigned int instanc
void GLModel::render_geometry_instance(unsigned int instance_mats_vbo, unsigned int instances_count)
{
render_geometry_instance(instance_mats_vbo, instances_count,std::make_pair<size_t, size_t>(0, indices_count()));
render_geometry_instance(instance_mats_vbo, instances_count,std::make_pair<size_t, size_t>(0, get_indices_count()));
}
void GLModel::render_geometry_instance(unsigned int instance_mats_vbo, unsigned int instances_count, const std::pair<size_t, size_t> &range)
@ -1141,7 +1160,7 @@ bool GLModel::send_to_gpu(Geometry &geometry)
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, render_data.vbo_id));
glsafe(::glBufferData(GL_ARRAY_BUFFER, data.vertices_size_bytes(), data.vertices.data(), GL_STATIC_DRAW));
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
render_data.vertices_count = vertices_count();
render_data.vertices_count = get_vertices_count();
data.vertices = std::vector<float>();
// indices

View File

@ -170,11 +170,8 @@ namespace GUI {
GLModel() = default;
virtual ~GLModel();
size_t vertices_count(int i = 0) const {
return m_render_data[i].vertices_count > 0 ? m_render_data[i].vertices_count : m_render_data[i].geometry.vertices_count();
}
size_t indices_count(int i = 0) const {
return m_render_data[i].indices_count > 0 ? m_render_data[i].indices_count : m_render_data[i].geometry.indices_count(); }
size_t get_vertices_count(int i = 0) const;
size_t get_indices_count(int i = 0) const;
TriangleMesh *mesh{nullptr};