From da9b8716264f62316aabddb2d390d5a43a563df9 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Tue, 18 Jan 2022 15:28:10 -0800 Subject: [PATCH] Add ability to buffer data to the middle of a vbo --- include/graphics/vbo.hpp | 1 + src/graphics/vbo.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/graphics/vbo.hpp b/include/graphics/vbo.hpp index 31f3f2a..b049fbe 100644 --- a/include/graphics/vbo.hpp +++ b/include/graphics/vbo.hpp @@ -70,6 +70,7 @@ namespace gfx{ bool bind(gl_buffer_manager& b)const; //add data to the end of this buffer (starts loading at data+get_size()) bool buffer(const void* data, size_t datasize); + bool buffer(const void* data, size_t datasize, size_t start); //change capacity of buffer bool resize(size_t newcap); diff --git a/src/graphics/vbo.cpp b/src/graphics/vbo.cpp index 084ad4b..83d5b56 100644 --- a/src/graphics/vbo.cpp +++ b/src/graphics/vbo.cpp @@ -75,6 +75,19 @@ namespace gfx{ m_buffer_size += datasize; return true; } + bool vbo::buffer(const void* data, size_t datasize, size_t start){ + const size_t capacity = get_cap(); + const size_t space_from_end = capacity - start; + if(datasize > space_from_end){ + const size_t difference = datasize - space_from_end; + if(!resize(rexy::max(difference, capacity * 2))){ + return false; + } + } + glNamedBufferSubData(m_buffer, start, datasize, data); + m_buffer_size = rexy::max(m_buffer_size, datasize + start); + return true; + } bool vbo::resize(size_t newsize){ vbo tmp(newsize, get_usage()); if(!copy_buffer(tmp, *this))