[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21814] branches/soc-2009-imbusy/source/ blender: improved edge drawing, unsure about the last parameter to glDrawElements when using VBOs

Lukas Steiblys imbusy at imbusy.org
Thu Jul 23 15:21:27 CEST 2009


Revision: 21814
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21814
Author:   imbusy
Date:     2009-07-23 15:21:27 +0200 (Thu, 23 Jul 2009)

Log Message:
-----------
improved edge drawing, unsure about the last parameter to glDrawElements when using VBOs

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
    branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c

Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-23 12:55:26 UTC (rev 21813)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-07-23 13:21:27 UTC (rev 21814)
@@ -177,10 +177,17 @@
 	MVert *mv = cddm->mvert;
 	int i;
 
-	glBegin(GL_POINTS);
-	for(i = 0; i < dm->numVertData; i++, mv++)
-		glVertex3fv(mv->co);
-	glEnd();
+	if( GPU_buffer_legacy(dm) ) {
+		glBegin(GL_POINTS);
+		for(i = 0; i < dm->numVertData; i++, mv++)
+			glVertex3fv(mv->co);
+		glEnd();
+	}
+	else {
+		GPU_vertex_setup(dm);
+		glDrawArrays(GL_POINTS,0,dm->drawObject->nelements);
+		GPU_buffer_unbind();
+	}
 }
 
 static void cdDM_drawUVEdges(DerivedMesh *dm)
@@ -251,13 +258,15 @@
 					draw = 0;
 				}
 				if( prevdraw != draw && prevdraw > 0 && (i-prevstart) > 0) {
-					glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
+					GPU_buffer_draw_elements( dm->drawObject->edges, GL_LINES, prevstart*2, (i-prevstart)*2  );
+					//glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
 					prevstart = i;
 				}
 				prevdraw = draw;
 			}
 			if( prevdraw > 0 && (i-prevstart) > 0 ) {
-				glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
+				//glDrawArrays(GL_LINES,prevstart*2,(i-prevstart)*2);
+				GPU_buffer_draw_elements( dm->drawObject->edges, GL_LINES, prevstart*2, (i-prevstart)*2  );
 			}
 		}
 		GPU_buffer_unbind();

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-23 12:55:26 UTC (rev 21813)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-23 13:21:27 UTC (rev 21814)
@@ -112,6 +112,7 @@
 void GPU_color_setup( struct DerivedMesh *dm );
 void GPU_edge_setup( struct DerivedMesh *dm );	/* does not mix with other data */
 
+void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
 void *GPU_buffer_lock( GPUBuffer *buffer );
 void GPU_buffer_unlock( GPUBuffer *buffer );
 

Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-23 12:55:26 UTC (rev 21813)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-23 13:21:27 UTC (rev 21814)
@@ -45,6 +45,7 @@
 #define GPU_BUFFER_NORMAL_STATE 2
 #define GPU_BUFFER_TEXCOORD_STATE 4
 #define GPU_BUFFER_COLOR_STATE 8
+#define GPU_BUFFER_ELEMENT_STATE 16
 
 /* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
 int useVBOs = -1;
@@ -175,8 +176,8 @@
 		allocated->size = size;
 		if( useVBOs == 1 ) {
 			glGenBuffersARB( 1, &allocated->id );
-			glBindBufferARB( GL_ARRAY_BUFFER_ARB, allocated->id );
-			glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, GL_STATIC_DRAW_ARB );
+			/*glBindBufferARB( GL_ARRAY_BUFFER_ARB, allocated->id );
+			glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, GL_STATIC_DRAW_ARB );*/
 			glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
 		}
 		else {
@@ -291,7 +292,7 @@
 	object->indexMemUsage = 0;
 
 #define ADDLINK( INDEX, ACTUAL ) \
-	if( object->indices[INDEX].element == -1 ) { \
+		if( object->indices[INDEX].element == -1 ) { \
 			object->indices[INDEX].element = ACTUAL; \
 		} else { \
 			IndexLink *lnk = &object->indices[INDEX]; \
@@ -345,7 +346,7 @@
 	MEM_freeN(object);
 }
 
-GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) )
+GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) )
 {
 	GPUBuffer *buffer;
 	float *varray;
@@ -383,9 +384,9 @@
 	if( useVBOs ) {
 		success = 0;
 		while( success == 0 ) {
-			glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
-			glBufferDataARB( GL_ARRAY_BUFFER_ARB, buffer->size, 0, GL_STATIC_DRAW_ARB );	/* discard previous data, avoid stalling gpu */
-			varray = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB );
+			glBindBufferARB( target, buffer->id );
+			glBufferDataARB( target, buffer->size, 0, GL_STATIC_DRAW_ARB );	/* discard previous data, avoid stalling gpu */
+			varray = glMapBufferARB( target, GL_WRITE_ONLY_ARB );
 			if( varray == 0 ) {
 				DEBUG_VBO( "Failed to map buffer to client address space\n" ); 
 				GPU_buffer_free( buffer, globalPool );
@@ -412,10 +413,10 @@
 			uploaded = GL_FALSE;
 			while( !uploaded ) {
 				(*copy_f)( dm, varray, index, redir, user );
-				uploaded = glUnmapBufferARB( GL_ARRAY_BUFFER_ARB );	/* returns false if data got corruped during transfer */
+				uploaded = glUnmapBufferARB( target );	/* returns false if data got corruped during transfer */
 			}
 		}
-		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+		glBindBufferARB(target, 0);
 	}
 	else {
 		if( buffer->pointer != 0 ) {
@@ -470,7 +471,7 @@
 {
 	DEBUG_VBO("GPU_buffer_vertex\n");
 
-	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, 0, GPU_buffer_copy_vertex);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex);
 }
 
 void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
@@ -533,7 +534,7 @@
 {
 	DEBUG_VBO("GPU_buffer_normal\n");
 
-	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, 0, GPU_buffer_copy_normal);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal);
 }
 
 void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
@@ -579,7 +580,7 @@
 {
 	DEBUG_VBO("GPU_buffer_uv\n");
 	if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 )
-		return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+		return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv);
 	else
 		return 0;
 }
@@ -668,7 +669,7 @@
 		colors[i*3+2] = mcol[i].r;
 	}
 
-	result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, colors, GPU_buffer_copy_color3 );
+	result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 );
 
 	MEM_freeN(colors);
 	return result;
@@ -680,6 +681,7 @@
 
 	MVert *mvert;
 	MEdge *medge;
+	unsigned int *varray_ = (unsigned int *)varray;
  
 	DEBUG_VBO("GPU_buffer_copy_edge\n");
 
@@ -687,8 +689,8 @@
 	medge = dm->getEdgeArray(dm);
 
 	for(i = 0; i < dm->getNumEdges(dm); i++) {
-		VECCOPY(&varray[i*6],mvert[medge[i].v1].co);
-		VECCOPY(&varray[i*6+3],mvert[medge[i].v2].co);
+		varray_[i*2] = (unsigned int)dm->drawObject->indices[medge[i].v1].element;
+		varray_[i*2+1] = (unsigned int)dm->drawObject->indices[medge[i].v2].element;
 	}
 }
 
@@ -696,7 +698,7 @@
 {
 	DEBUG_VBO("GPU_buffer_edge\n");
 
-	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*6*dm->drawObject->nedges, 0, GPU_buffer_copy_edge);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge);
 }
 
 void GPU_vertex_setup( DerivedMesh *dm )
@@ -802,16 +804,29 @@
 		DEBUG_VBO( "Failed to setup edges\n" );
 		return;
 	}
+	if( dm->drawObject->vertices == 0 )
+		dm->drawObject->vertices = GPU_buffer_vertex( dm );
+	if( dm->drawObject->vertices == 0 ) {
+		DEBUG_VBO( "Failed to setup vertices\n" );
+		return;
+	}
+
 	glEnableClientState( GL_VERTEX_ARRAY );
 	if( useVBOs ) {
-		glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->edges->id );
+		glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->vertices->id );
 		glVertexPointer( 3, GL_FLOAT, 0, 0 );
 	}
 	else {
-		glVertexPointer( 3, GL_FLOAT, 0, dm->drawObject->edges->pointer );
+		glVertexPointer( 3, GL_FLOAT, 0, dm->drawObject->vertices->pointer );
 	}
+	
+	GLStates |= GPU_BUFFER_VERTEX_STATE;
 
-	GLStates |= GPU_BUFFER_VERTEX_STATE;
+	if( useVBOs ) {
+		glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, dm->drawObject->edges->id );
+	}
+
+	GLStates |= GPU_BUFFER_ELEMENT_STATE;
 }
 
 void GPU_buffer_unbind()
@@ -826,7 +841,9 @@
 		glDisableClientState( GL_TEXTURE_COORD_ARRAY );
 	if( GLStates & GPU_BUFFER_COLOR_STATE )
 		glDisableClientState( GL_COLOR_ARRAY );
-	GLStates &= !(GPU_BUFFER_VERTEX_STATE | GPU_BUFFER_NORMAL_STATE | GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE );
+	if( GLStates & GPU_BUFFER_ELEMENT_STATE )
+		glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, 0 );
+	GLStates &= !(GPU_BUFFER_VERTEX_STATE | GPU_BUFFER_NORMAL_STATE | GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE | GPU_BUFFER_ELEMENT_STATE);
 
 	if( GLStates != 0 )
 		DEBUG_VBO( "Some weird OpenGL state is still set. Why?" );
@@ -839,14 +856,14 @@
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new(dm);
 	GPU_buffer_free(dm->drawObject->colors,globalPool);
-	dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color3 );
+	dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 );
 }
 void GPU_color4_upload( DerivedMesh *dm, char *data )
 {
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new(dm);
 	GPU_buffer_free(dm->drawObject->colors,globalPool);
-	dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color4 );
+	dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 );
 }
 
 void GPU_color_switch( int mode )
@@ -902,4 +919,14 @@
 		}
 		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
 	}
+}
+
+void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count )
+{
+	if( useVBOs ) {
+		glDrawElements( mode, count, GL_UNSIGNED_INT, start );
+	}
+	else {
+		glDrawElements( mode, count, GL_UNSIGNED_INT, ((int *)elements->pointer)+start );
+	}
 }
\ No newline at end of file





More information about the Bf-blender-cvs mailing list