[core] Enable dynamic updates of index buffers.
This commit is contained in:
@@ -226,16 +226,25 @@ void Context::updateVertexBuffer(UniqueBuffer& buffer, const void* data, std::si
|
||||
MBGL_CHECK_ERROR(glBufferSubData(GL_ARRAY_BUFFER, 0, size, data));
|
||||
}
|
||||
|
||||
UniqueBuffer Context::createIndexBuffer(const void* data, std::size_t size) {
|
||||
UniqueBuffer Context::createIndexBuffer(const void* data, std::size_t size, const BufferUsage usage) {
|
||||
BufferID id = 0;
|
||||
MBGL_CHECK_ERROR(glGenBuffers(1, &id));
|
||||
UniqueBuffer result { std::move(id), { this } };
|
||||
bindVertexArray = 0;
|
||||
globalVertexArrayState.indexBuffer = result;
|
||||
MBGL_CHECK_ERROR(glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW));
|
||||
MBGL_CHECK_ERROR(glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, static_cast<GLenum>(usage)));
|
||||
return result;
|
||||
}
|
||||
|
||||
void Context::updateIndexBuffer(UniqueBuffer& buffer, const void* data, std::size_t size) {
|
||||
// Be sure to unbind any existing vertex array object before binding the index buffer
|
||||
// so that we don't mess up another VAO
|
||||
bindVertexArray = 0;
|
||||
globalVertexArrayState.indexBuffer = buffer;
|
||||
MBGL_CHECK_ERROR(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, size, data));
|
||||
}
|
||||
|
||||
|
||||
UniqueTexture Context::createTexture() {
|
||||
if (pooledTextures.empty()) {
|
||||
pooledTextures.resize(TextureMax);
|
||||
|
||||
@@ -75,11 +75,18 @@ public:
|
||||
}
|
||||
|
||||
template <class DrawMode>
|
||||
IndexBuffer<DrawMode> createIndexBuffer(IndexVector<DrawMode>&& v) {
|
||||
IndexBuffer<DrawMode> createIndexBuffer(IndexVector<DrawMode>&& v, const BufferUsage usage=BufferUsage::StaticDraw) {
|
||||
return IndexBuffer<DrawMode> {
|
||||
createIndexBuffer(v.data(), v.byteSize())
|
||||
v.indexSize(),
|
||||
createIndexBuffer(v.data(), v.byteSize(), usage)
|
||||
};
|
||||
}
|
||||
|
||||
template <class DrawMode>
|
||||
void updateIndexBuffer(IndexBuffer<DrawMode>& buffer, IndexVector<DrawMode>&& v) {
|
||||
assert(v.indexSize() == buffer.indexCount);
|
||||
updateIndexBuffer(buffer.buffer, v.data(), v.byteSize());
|
||||
}
|
||||
|
||||
template <RenderbufferType type>
|
||||
Renderbuffer<type> createRenderbuffer(const Size size) {
|
||||
@@ -250,7 +257,8 @@ private:
|
||||
|
||||
UniqueBuffer createVertexBuffer(const void* data, std::size_t size, const BufferUsage usage);
|
||||
void updateVertexBuffer(UniqueBuffer& buffer, const void* data, std::size_t size);
|
||||
UniqueBuffer createIndexBuffer(const void* data, std::size_t size);
|
||||
UniqueBuffer createIndexBuffer(const void* data, std::size_t size, const BufferUsage usage);
|
||||
void updateIndexBuffer(UniqueBuffer& buffer, const void* data, std::size_t size);
|
||||
UniqueTexture createTexture(Size size, const void* data, TextureFormat, TextureUnit);
|
||||
void updateTexture(TextureID, Size size, const void* data, TextureFormat, TextureUnit);
|
||||
UniqueFramebuffer createFramebuffer();
|
||||
|
||||
@@ -35,6 +35,7 @@ private:
|
||||
template <class DrawMode>
|
||||
class IndexBuffer {
|
||||
public:
|
||||
std::size_t indexCount;
|
||||
UniqueBuffer buffer;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user