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

Add support to dynamic vertex buffers

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

+ 26 - 0
engine/renderers/Renderer.h

@@ -50,6 +50,7 @@ public:
 	void render_impl();
 
 	void create_vertex_buffer_impl(VertexBufferId id, size_t count, VertexFormat format, const void* vertices);
+	void create_dynamic_vertex_buffer_impl(VertexBufferId id, size_t count, VertexFormat format);
 	void update_vertex_buffer_impl(VertexBufferId id, size_t offset, size_t count, const void* vertices);
 	void destroy_vertex_buffer_impl(VertexBufferId id);
 
@@ -98,6 +99,18 @@ public:
 		return id;
 	}
 
+	inline VertexBufferId create_dynamic_vertex_buffer(size_t count, VertexFormat format)
+	{
+		const VertexBufferId id = m_vertex_buffers.create();
+
+		m_submit->m_commands.write(COMMAND_CREATE_DYNAMIC_VERTEX_BUFFER);
+		m_submit->m_commands.write(id);
+		m_submit->m_commands.write(count);
+		m_submit->m_commands.write(format);
+
+		return id;
+	}
+
 	/// Updates the data associated with the given vertex buffer @a id.
 	/// @a vertices is the array containig @a count vertex data elements of the format
 	/// specified at the creation of the buffer.
@@ -280,6 +293,19 @@ public:
 					create_vertex_buffer_impl(id, count, format, vertices);
 					break;
 				}
+				case COMMAND_CREATE_DYNAMIC_VERTEX_BUFFER:
+				{
+					VertexBufferId id;
+					size_t count;
+					VertexFormat format;
+
+					cmds.read(id);
+					cmds.read(count);
+					cmds.read(format);
+
+					create_dynamic_vertex_buffer_impl(id, count, format);
+					break;
+				}
 				case COMMAND_UPDATE_VERTEX_BUFFER:
 				{
 					VertexBufferId id;

+ 1 - 0
engine/renderers/RendererTypes.h

@@ -180,6 +180,7 @@ enum CommandType
 	COMMAND_SHUTDOWN_RENDERER,
 
 	COMMAND_CREATE_VERTEX_BUFFER,
+	COMMAND_CREATE_DYNAMIC_VERTEX_BUFFER,
 	COMMAND_UPDATE_VERTEX_BUFFER,
 	COMMAND_DESTROY_VERTEX_BUFFER,
 

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

@@ -465,6 +465,12 @@ void Renderer::create_vertex_buffer_impl(VertexBufferId id, size_t count, Vertex
 	m_impl->m_vertex_buffers[id.index].create(count, format, vertices);
 }
 
+//-----------------------------------------------------------------------------
+void Renderer::create_dynamic_vertex_buffer_impl(VertexBufferId id, size_t count, VertexFormat format)
+{
+	m_impl->m_vertex_buffers[id.index].create(count, format, NULL);
+}
+
 //-----------------------------------------------------------------------------
 void Renderer::update_vertex_buffer_impl(VertexBufferId id, size_t offset, size_t count, const void* vertices)
 {

+ 2 - 2
engine/renderers/gl/GLRenderer.h

@@ -99,8 +99,8 @@ struct VertexBuffer
 	{
 		GL_CHECK(glGenBuffers(1, &m_id));
 		GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id));
-		GL_CHECK(glBufferData(GL_ARRAY_BUFFER, count * Vertex::bytes_per_vertex(format), vertices, GL_STATIC_DRAW));
-		// GL_STREAM_DRAW
+		GL_CHECK(glBufferData(GL_ARRAY_BUFFER, count * Vertex::bytes_per_vertex(format), vertices,
+			(vertices == NULL) ? GL_STREAM_DRAW : GL_STATIC_DRAW));
 		GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0));
 
 		m_count = count;