[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20411] branches/bb_dev/source/gameengine/ Rasterizer/RAS_OpenGLRasterizer: Missing files from last commit (Patch:[ #17523] BGE VBO patch by Samuel Anjam (toonist))

Dalai Felinto dfelinto at gmail.com
Mon May 25 23:29:50 CEST 2009


Revision: 20411
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20411
Author:   dfelinto
Date:     2009-05-25 23:29:50 +0200 (Mon, 25 May 2009)

Log Message:
-----------
Missing files from last commit (Patch:[#17523] BGE VBO patch by Samuel Anjam (toonist))
- patch updated for recent trunk.

This patch implement a VBO option to handle skinned meshes.
It doesn't give better performance than Display List (at least not in un-skinned meshes).

But this is an important addition to in the near future implement full GLSL skinned objects.

Modified Paths:
--------------
    branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
    branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h

Modified: branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
===================================================================
--- branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp	2009-05-25 21:26:30 UTC (rev 20410)
+++ branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp	2009-05-25 21:29:50 UTC (rev 20411)
@@ -103,6 +103,169 @@
 	RAS_OpenGLRasterizer::Exit();
 }
 
+void RAS_VAOpenGLRasterizer::ClearVboSlot(class RAS_VboSlot *slot)
+{
+	if(!GLEW_ARB_vertex_buffer_object) return;
+	if(slot->m_verts) delete slot->m_verts;
+	if(slot->m_vertVbo) glDeleteBuffers(1, &slot->m_vertVbo);
+	if(slot->m_indexVbo) glDeleteBuffers(1, &slot->m_indexVbo);
+	if(slot->m_normalVbo) glDeleteBuffers(1, &slot->m_normalVbo);
+	if(slot->m_tangentVbo) glDeleteBuffers(1, &slot->m_tangentVbo);
+	if(slot->m_colorVbo) glDeleteBuffers(1, &slot->m_colorVbo);
+	if(slot->m_texCoordVbo[0]) glDeleteBuffers(1, &slot->m_texCoordVbo[0]);
+	if(slot->m_texCoordVbo[1]) glDeleteBuffers(1, &slot->m_texCoordVbo[1]);
+
+	slot->m_verts = 0;
+	slot->m_vertVbo = 0;
+	slot->m_indexVbo = 0;
+	slot->m_normalVbo = 0;
+	slot->m_tangentVbo = 0;
+	slot->m_colorVbo = 0;
+	slot->m_texCoordVbo[0] = 0;
+	slot->m_texCoordVbo[1] = 0;
+}
+
+void RAS_VAOpenGLRasterizer::InitVboSlot(class RAS_DisplayArray* array, class RAS_MeshSlot *ms)
+{
+	if(array->m_vertex.size() == 0 || array->m_index.size() == 0
+		|| !GLEW_ARB_vertex_buffer_object) return;
+	// clean up any previous data before creating a new slot
+	if(array->m_vboSlot) delete array->m_vboSlot;
+	array->m_vboSlot = new RAS_VboSlot(this);
+	/* uploading data to vertex buffer objects doesn't allow
+	stride so we have to grab the data from RAS_TexVert and
+	initialize new arrays which we then use to upload the
+	data to the vbos*/
+	float *normals = 0;
+	float *tangents = 0;
+	float *texCoords0 = 0;
+	float *texCoords1 = 0;
+	unsigned char *colors = 0;
+	bool isColors = glIsEnabled(GL_COLOR_ARRAY);
+	array->m_vboSlot->m_verts = new float[array->m_vertex.size()*3];
+	normals = new float[array->m_vertex.size()*3];
+	tangents = new float[array->m_vertex.size()*4];
+	texCoords0 = new float[array->m_vertex.size()*2];
+	texCoords1 = new float[array->m_vertex.size()*2];
+	colors = new unsigned char[array->m_vertex.size()*4];
+	// upload the data
+	unsigned int num0 = 0;
+	unsigned int num1 = 0;
+	unsigned int num2 = 0;
+	unsigned int vertnum = 0;
+	for(vertnum = 0; vertnum < array->m_vertex.size(); vertnum++)
+	{
+		memcpy(&array->m_vboSlot->m_verts[num0], array->m_vertex[vertnum].getXYZ(), sizeof(float)*3);
+		memcpy(&normals[num0], array->m_vertex[vertnum].getNormal(), sizeof(float)*3);
+		memcpy(&texCoords0[num1], array->m_vertex[vertnum].getUV1(), sizeof(float)*2);
+		memcpy(&texCoords1[num1], array->m_vertex[vertnum].getUV2(), sizeof(float)*2);
+		memcpy(&tangents[num2], array->m_vertex[vertnum].getTangent(), sizeof(float)*4);
+		memcpy(&colors[num2], array->m_vertex[vertnum].getRGBA(), sizeof(int));
+		num0+=3;
+		num1+=2;
+		num2+=4;
+	}
+	// create the vertex buffer objects
+	glGenBuffersARB(1, &array->m_vboSlot->m_vertVbo);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, array->m_vboSlot->m_vertVbo);
+	glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*array->m_vertex.size()*3,
+		array->m_vboSlot->m_verts, GL_DYNAMIC_DRAW_ARB);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+	glGenBuffersARB(1, &array->m_vboSlot->m_normalVbo);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, array->m_vboSlot->m_normalVbo);
+	glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*array->m_vertex.size()*3,
+		normals, GL_STATIC_DRAW_ARB);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+	glGenBuffersARB(1, &array->m_vboSlot->m_tangentVbo);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, array->m_vboSlot->m_tangentVbo);
+	glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*array->m_vertex.size()*4,
+		tangents, GL_STATIC_DRAW_ARB);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+	glGenBuffersARB(1, &array->m_vboSlot->m_texCoordVbo[0]);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, array->m_vboSlot->m_texCoordVbo[0]);
+	glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*array->m_vertex.size()*2,
+		texCoords0, GL_STATIC_DRAW_ARB);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+	glGenBuffersARB(1, &array->m_vboSlot->m_texCoordVbo[1]);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, array->m_vboSlot->m_texCoordVbo[1]);
+	glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*array->m_vertex.size()*2,
+		texCoords1, GL_STATIC_DRAW_ARB);
+	glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+	if(isColors)
+	{
+		glGenBuffersARB(1, &array->m_vboSlot->m_colorVbo);
+		glBindBufferARB(GL_ARRAY_BUFFER_ARB, array->m_vboSlot->m_colorVbo);
+		glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(unsigned char)*array->m_vertex.size()*4,
+			colors, GL_STATIC_DRAW_ARB);
+		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+	}
+	glGenBuffersARB(1, &array->m_vboSlot->m_indexVbo);
+	glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, array->m_vboSlot->m_indexVbo);
+	glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(unsigned short)*array->m_index.size(),
+		&array->m_index[0], GL_STATIC_DRAW_ARB);
+	glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+	// clean up
+	delete[] array->m_vboSlot->m_verts;
+	array->m_vboSlot->m_verts = 0;
+	delete[] normals;
+	delete[] texCoords0;
+	delete[] texCoords1;
+	delete[] colors;
+}
+
+void RAS_VAOpenGLRasterizer::UpdateMeshSlotData(class RAS_MeshSlot *ms,
+	const bool &anim, const bool &zsort)
+{
+	if(!GLEW_ARB_vertex_buffer_object) return;
+	RAS_MeshSlot::iterator it;
+	unsigned int vertnum = 0;
+	unsigned int num = 0;
+	RAS_VboSlot *slot = 0;
+	int usage = 0;
+	for(ms->begin(it); !ms->end(it); ms->next(it)) {
+		if(it.totindex == 0)
+			continue;
+		if(!it.array->m_vboSlot) continue;
+		slot = it.array->m_vboSlot;
+		if(anim)
+		{
+			if(!slot->m_verts)
+				slot->m_verts = new float[it.array->m_vertex.size()*3];
+			for(vertnum = 0, num = 0; vertnum < it.array->m_vertex.size(); vertnum++)
+			{
+				memcpy(&slot->m_verts[num],
+					it.array->m_vertex[vertnum].getXYZ(), sizeof(float)*3);
+				num+=3;
+			}
+			glBindBufferARB(GL_ARRAY_BUFFER_ARB, slot->m_vertVbo);
+			glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0,
+				sizeof(float)*it.array->m_vertex.size()*3, slot->m_verts);
+			glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+		}
+		if(zsort)
+		{
+			// make sure that we have a dynamic index
+			glGetBufferParameteriv(slot->m_indexVbo, GL_BUFFER_USAGE_ARB, &usage);
+			if(usage != GL_DYNAMIC_DRAW_ARB)
+			{
+				glGenBuffersARB(1, &slot->m_indexVbo);
+				glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, slot->m_indexVbo);
+				glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
+					sizeof(unsigned short)*it.array->m_index.size(),
+					&it.array->m_index[0], GL_DYNAMIC_DRAW_ARB);
+				glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+			}
+			else
+			{
+				glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, slot->m_indexVbo);
+				glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0,
+					sizeof(unsigned short)*it.array->m_index.size(), &it.array->m_index[0]);
+				glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+			}
+		}
+	}
+}
+
 void RAS_VAOpenGLRasterizer::IndexPrimitives(RAS_MeshSlot& ms)
 {
 	static const GLsizei stride = sizeof(RAS_TexVert);
@@ -148,16 +311,49 @@
 		else
 			glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
 
-		glVertexPointer(3, GL_FLOAT, stride, it.vertex->getXYZ());
-		glNormalPointer(GL_FLOAT, stride, it.vertex->getNormal());
-		if(!wireframe) {
-			glTexCoordPointer(2, GL_FLOAT, stride, it.vertex->getUV1());
-			if(glIsEnabled(GL_COLOR_ARRAY))
-				glColorPointer(4, GL_UNSIGNED_BYTE, stride, it.vertex->getRGBA());
+		if(GLEW_ARB_vertex_buffer_object) {
+			if(!it.array->m_vboSlot) InitVboSlot(it.array, &ms);
+			if(it.array->m_vboSlot)
+			{
+				glBindBuffer(GL_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_vertVbo);
+				glVertexPointer(3, GL_FLOAT, 0, 0);
+				glBindBuffer(GL_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_normalVbo);
+				glNormalPointer(GL_FLOAT, 0, 0);
+				if(!wireframe) {
+					glBindBuffer(GL_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_texCoordVbo[0]);
+					glTexCoordPointer(2, GL_FLOAT, 0, 0);
+					if(glIsEnabled(GL_COLOR_ARRAY))
+					{
+						glBindBuffer(GL_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_colorVbo);
+						glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0);
+					}
+				}
+				glBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_indexVbo);
+				// a little clean up...
+				glDrawElements(drawmode, it.totindex, GL_UNSIGNED_SHORT, 0);
+				glBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+				glBindBuffer(GL_ARRAY_BUFFER_ARB, 0);
+				glVertexPointer(3, GL_FLOAT, 0, 0);
+				glNormalPointer(GL_FLOAT, 0, 0);
+				if(!wireframe) {
+					glTexCoordPointer(2, GL_FLOAT, 0, 0);
+					if(glIsEnabled(GL_COLOR_ARRAY))
+						glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0);
+				}
+			}
 		}
 
-		// here the actual drawing takes places
-		glDrawElements(drawmode, it.totindex, GL_UNSIGNED_SHORT, it.index);
+		if(!it.array->m_vboSlot) {
+			glVertexPointer(3, GL_FLOAT, stride, it.vertex->getXYZ());
+			glNormalPointer(GL_FLOAT, stride, it.vertex->getNormal());
+			if(!wireframe) {
+				glTexCoordPointer(2, GL_FLOAT, stride, it.vertex->getUV1());
+				if(glIsEnabled(GL_COLOR_ARRAY))
+					glColorPointer(4, GL_UNSIGNED_BYTE, stride, it.vertex->getRGBA());
+			}
+			// here the actual drawing takes places
+			glDrawElements(drawmode, it.totindex, GL_UNSIGNED_SHORT, it.index);
+		}
 	}
 
 	if(!wireframe) {
@@ -172,6 +368,7 @@
 	bool wireframe = m_drawingmode <= KX_WIREFRAME;
 	RAS_MeshSlot::iterator it;
 	GLenum drawmode;
+	int unit = 0;
 
 	if (ms.m_pDerivedMesh) {
 		// cannot be handled here, pass to RAS_OpenGLRasterizer
@@ -211,16 +408,52 @@
 		else
 			glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
 
-		glVertexPointer(3, GL_FLOAT, stride, it.vertex->getXYZ());
-		glNormalPointer(GL_FLOAT, stride, it.vertex->getNormal());
-		if(!wireframe) {
-			TexCoordPtr(it.vertex);
-			if(glIsEnabled(GL_COLOR_ARRAY))
-				glColorPointer(4, GL_UNSIGNED_BYTE, stride, it.vertex->getRGBA());
+		if(GLEW_ARB_vertex_buffer_object) {
+			if(!it.array->m_vboSlot) InitVboSlot(it.array, &ms);
+			if(it.array->m_vboSlot)
+			{
+				glBindBuffer(GL_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_vertVbo);
+				glVertexPointer(3, GL_FLOAT, 0, 0);
+				glBindBuffer(GL_ARRAY_BUFFER_ARB, it.array->m_vboSlot->m_normalVbo);
+				glNormalPointer(GL_FLOAT, 0, 0);
+				if(!wireframe) {
+					TexCoordPtr(it.array);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list