From b85ee3a3a5f5b52182bc7174758b769714270d4d Mon Sep 17 00:00:00 2001 From: water Date: Tue, 10 Aug 2021 22:13:34 -0400 Subject: [PATCH] fix possible bug in direct renderer --- game/graphics/opengl_renderer/DirectRenderer.cpp | 11 ++++++----- game/graphics/opengl_renderer/DirectRenderer.h | 2 +- game/graphics/opengl_renderer/OpenGLRenderer.cpp | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/game/graphics/opengl_renderer/DirectRenderer.cpp b/game/graphics/opengl_renderer/DirectRenderer.cpp index de92a7defe..343b6c8633 100644 --- a/game/graphics/opengl_renderer/DirectRenderer.cpp +++ b/game/graphics/opengl_renderer/DirectRenderer.cpp @@ -63,7 +63,6 @@ void DirectRenderer::flush_pending(SharedRenderState* render_state) { return; } - // lg::warn("DirectRenderer flush with {} triangles.", m_prim_buffer.vert_count / 3); // update opengl state if (m_prim_gl_state_needs_gl_update) { update_gl_prim(render_state); @@ -87,16 +86,18 @@ void DirectRenderer::flush_pending(SharedRenderState* render_state) { // render! // update buffers: glBindBuffer(GL_ARRAY_BUFFER, m_ogl.vertex_buffer); - glBufferSubData(GL_ARRAY_BUFFER, 0, m_ogl.vertex_buffer_bytes, m_prim_buffer.verts.data()); + glBufferSubData(GL_ARRAY_BUFFER, 0, m_prim_buffer.verts.size() * sizeof(math::Vector), + m_prim_buffer.verts.data()); glBindBuffer(GL_ARRAY_BUFFER, m_ogl.color_buffer); - glBufferSubData(GL_ARRAY_BUFFER, 0, m_ogl.color_buffer_bytes, m_prim_buffer.rgba_u8.data()); + glBufferSubData(GL_ARRAY_BUFFER, 0, m_prim_buffer.rgba_u8.size() * sizeof(math::Vector), + m_prim_buffer.rgba_u8.data()); if (m_prim_gl_state.texture_enable) { glBindBuffer(GL_ARRAY_BUFFER, m_ogl.st_buffer); - glBufferSubData(GL_ARRAY_BUFFER, 0, m_ogl.st_buffer_bytes, m_prim_buffer.sts.data()); + glBufferSubData(GL_ARRAY_BUFFER, 0, m_prim_buffer.sts.size() * sizeof(math::Vector), + m_prim_buffer.sts.data()); } // setup attributes: - glBindBuffer(GL_ARRAY_BUFFER, m_ogl.vertex_buffer); glEnableVertexAttribArray(0); glVertexAttribPointer(0, // location 0 in the shader diff --git a/game/graphics/opengl_renderer/DirectRenderer.h b/game/graphics/opengl_renderer/DirectRenderer.h index c0cf0ad9b2..f8fd87dcb9 100644 --- a/game/graphics/opengl_renderer/DirectRenderer.h +++ b/game/graphics/opengl_renderer/DirectRenderer.h @@ -147,7 +147,7 @@ class DirectRenderer : public BucketRenderer { int max_verts = 0; // leave 6 free on the end so we always have room to flush one last primitive. - bool is_full() { return max_verts < (vert_count - 6); } + bool is_full() { return max_verts < (vert_count + 18); } void push(const math::Vector& rgba, const math::Vector& vert, const math::Vector& st); diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 81b91e7a11..22cc5209ed 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -41,8 +41,8 @@ void OpenGLRenderer::init_bucket_renderers() { init_bucket_renderer("bucket0", BucketId::BUCKET0); // TODO what the heck is drawing to debug-draw-0 on init? - init_bucket_renderer("debug-draw-0", BucketId::DEBUG_DRAW_0, 1024 * 8); - init_bucket_renderer("debug-draw-1", BucketId::DEBUG_DRAW_1, 1024 * 8); + init_bucket_renderer("debug-draw-0", BucketId::DEBUG_DRAW_0, 102); + init_bucket_renderer("debug-draw-1", BucketId::DEBUG_DRAW_1, 102); // for now, for any unset renderers, just set them to an EmptyBucketRenderer. for (size_t i = 0; i < m_bucket_renderers.size(); i++) {