Преглед изворни кода

Add support for dynamic index buffers

Daniele Bartolini пре 12 година
родитељ
комит
dd88bc835c

+ 48 - 0
engine/renderers/Renderer.h

@@ -55,6 +55,8 @@ public:
 	void destroy_vertex_buffer_impl(VertexBufferId id);
 
 	void create_index_buffer_impl(IndexBufferId id, size_t count, const void* indices);
+	void create_dynamic_index_buffer_impl(IndexBufferId id, size_t count);
+	void update_index_buffer_impl(IndexBufferId id, size_t offset, size_t count, const void* indices);
 	void destroy_index_buffer_impl(IndexBufferId id);
 
 	void create_texture_impl(TextureId id, uint32_t width, uint32_t height, PixelFormat format, const void* data);
@@ -147,6 +149,26 @@ public:
 		return id;
 	}
 
+	inline IndexBufferId create_dynamic_index_buffer(size_t count)
+	{
+		const IndexBufferId id = m_index_buffers.create();
+
+		m_submit->m_commands.write(COMMAND_CREATE_DYNAMIC_INDEX_BUFFER);
+		m_submit->m_commands.write(id);
+		m_submit->m_commands.write(count);
+
+		return id;
+	}
+
+	inline void update_index_buffer(IndexBufferId id, size_t offset, size_t count, const void* indices)
+	{
+		m_submit->m_commands.write(COMMAND_UPDATE_INDEX_BUFFER);
+		m_submit->m_commands.write(id);
+		m_submit->m_commands.write(offset);
+		m_submit->m_commands.write(count);
+		m_submit->m_commands.write(indices);
+	}
+
 	/// Destroys the @a id index buffer.
 	inline void destroy_index_buffer(IndexBufferId id)
 	{
@@ -342,6 +364,32 @@ public:
 					create_index_buffer_impl(id, count, indices);
 					break;
 				}
+				case COMMAND_CREATE_DYNAMIC_INDEX_BUFFER:
+				{
+					IndexBufferId id;
+					size_t count;
+
+					cmds.read(id);
+					cmds.read(count);
+
+					create_dynamic_index_buffer_impl(id, count);
+					break;
+				}
+				case COMMAND_UPDATE_INDEX_BUFFER:
+				{
+					IndexBufferId id;
+					size_t offset;
+					size_t count;
+					void* indices;
+
+					cmds.read(id);
+					cmds.read(offset);
+					cmds.read(count);
+					cmds.read(indices);
+
+					update_index_buffer_impl(id, offset, count, indices);
+					break;
+				}
 				case COMMAND_DESTROY_INDEX_BUFFER:
 				{
 					IndexBufferId id;

+ 2 - 0
engine/renderers/RendererTypes.h

@@ -185,6 +185,8 @@ enum CommandType
 	COMMAND_DESTROY_VERTEX_BUFFER,
 
 	COMMAND_CREATE_INDEX_BUFFER,
+	COMMAND_CREATE_DYNAMIC_INDEX_BUFFER,
+	COMMAND_UPDATE_INDEX_BUFFER,
 	COMMAND_DESTROY_INDEX_BUFFER,
 
 	COMMAND_CREATE_TEXTURE,

+ 12 - 0
engine/renderers/gl/GLRenderer.cpp

@@ -489,6 +489,18 @@ void Renderer::create_index_buffer_impl(IndexBufferId id, size_t count, const vo
 	m_impl->m_index_buffers[id.index].create(count, indices);
 }
 
+//-----------------------------------------------------------------------------
+void Renderer::create_dynamic_index_buffer_impl(IndexBufferId id, size_t count)
+{
+	m_impl->m_index_buffers[id.index].create(count, NULL);
+}
+
+//-----------------------------------------------------------------------------
+void Renderer::update_index_buffer_impl(IndexBufferId id, size_t offset, size_t count, const void* indices)
+{
+	m_impl->m_index_buffers[id.index].update(offset, count, indices);	
+}
+
 //-----------------------------------------------------------------------------
 void Renderer::destroy_index_buffer_impl(IndexBufferId id)
 {

+ 11 - 1
engine/renderers/gl/GLRenderer.h

@@ -138,12 +138,22 @@ struct IndexBuffer
 	{
 		GL_CHECK(glGenBuffers(1, &m_id));
 		GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id));
-		GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(GLushort), indices, GL_STATIC_DRAW));
+		GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(GLushort), indices,
+					(indices == NULL) ? GL_STREAM_DRAW : GL_STATIC_DRAW));
 		GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
 
 		m_index_count = count;
 	}
 
+	//-----------------------------------------------------------------------------
+	void update(size_t offset, size_t count, const void* indices)
+	{
+		GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id));
+		GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset * sizeof(uint16_t),
+									count * sizeof(uint16_t), indices));
+		GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+	}
+
 	//-----------------------------------------------------------------------------
 	void destroy()
 	{