[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20993] branches/soc-2009-imbusy/source/ blender: VBOs work for solid faces! (still need to debug vertex arrays)

Lukas Steiblys imbusy at imbusy.org
Thu Jun 18 22:02:50 CEST 2009


Revision: 20993
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20993
Author:   imbusy
Date:     2009-06-18 22:02:50 +0200 (Thu, 18 Jun 2009)

Log Message:
-----------
VBOs work for solid faces! (still need to debug vertex arrays)

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-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c	2009-06-18 20:02:50 UTC (rev 20993)
@@ -60,6 +60,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "GPU_buffers.h"
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -252,72 +253,16 @@
 
 static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int, void *attribs))
 {
-	CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
-	MVert *mvert = cddm->mvert;
-	MFace *mface = cddm->mface;
-	float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
-	int a, glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
-
-#define PASSVERT(index) {						\
-	if(shademodel == GL_SMOOTH) {				\
-		short *no = mvert[index].no;			\
-		glNormal3sv(no);						\
-	}											\
-	glVertex3fv(mvert[index].co);	\
-}
-
-	glBegin(glmode = GL_QUADS);
-	for(a = 0; a < dm->numFaceData; a++, mface++) {
-		int new_glmode, new_matnr, new_shademodel;
-
-		new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
-		new_matnr = mface->mat_nr + 1;
-		new_shademodel = (mface->flag & ME_SMOOTH)?GL_SMOOTH:GL_FLAT;
-		
-		if(new_glmode != glmode || new_matnr != matnr
-		   || new_shademodel != shademodel) {
-			glEnd();
-
-			drawCurrentMat = setMaterial(matnr = new_matnr, NULL);
-
-			glShadeModel(shademodel = new_shademodel);
-			glBegin(glmode = new_glmode);
-		} 
-		
-		if(drawCurrentMat) {
-			if(shademodel == GL_FLAT) {
-				if (nors) {
-					glNormal3fv(nors);
-				}
-				else {
-					/* TODO make this better (cache facenormals as layer?) */
-					float nor[3];
-					if(mface->v4) {
-						CalcNormFloat4(mvert[mface->v1].co, mvert[mface->v2].co,
-									   mvert[mface->v3].co, mvert[mface->v4].co,
-									   nor);
-					} else {
-						CalcNormFloat(mvert[mface->v1].co, mvert[mface->v2].co,
-									  mvert[mface->v3].co, nor);
-					}
-					glNormal3fv(nor);
-				}
-			}
-
-			PASSVERT(mface->v1);
-			PASSVERT(mface->v2);
-			PASSVERT(mface->v3);
-			if(mface->v4) {
-				PASSVERT(mface->v4);
-			}
-		}
-
-		if(nors) nors += 3;
+	int i;
+	GPU_vertex_setup( dm );
+	GPU_normal_setup( dm );
+	glShadeModel(GL_SMOOTH);
+	for( i = 0; i < dm->drawObject->nmaterials; i++ ) {
+		setMaterial(dm->drawObject->materials[i].mat_nr+1, NULL);
+		glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[i].start, dm->drawObject->materials[i].end);
 	}
-	glEnd();
-
+	GPU_buffer_unbind( );
 	glShadeModel(GL_FLAT);
-#undef PASSVERT
 }
 
 static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned char *col1, unsigned char *col2)

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-06-18 20:02:50 UTC (rev 20993)
@@ -83,20 +83,14 @@
 GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
 void GPU_drawobject_free( GPUDrawObject *object );
 
-/* collect the data into buffers */
-/*GPUBuffer *GPU_buffer_vertex( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm );*/
-
 /* called before drawing */
 void GPU_vertex_setup( struct DerivedMesh *dm );
 void GPU_normal_setup( struct DerivedMesh *dm );
 void GPU_uv_setup( struct DerivedMesh *dm );
 void GPU_color_setup( struct DerivedMesh *dm );
 
-void GPU_buffer_draw( struct DerivedMesh *dm );
-void GPU_buffer_draw_selected( struct DerivedMesh *dm, int selected );
+/* upload three unsigned chars, representing RGB colors, for each vertex */
+void GPU_color_upload( struct DerivedMesh *dm, char *data );
 
 /* called after drawing */
 void GPU_buffer_unbind();

Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-06-18 20:02:50 UTC (rev 20993)
@@ -41,9 +41,15 @@
 #include "DNA_meshdata_types.h"
 #include "BLI_arithb.h"
 
+#define GPU_BUFFER_VERTEX_STATE 1
+#define GPU_BUFFER_NORMAL_STATE 2
+#define GPU_BUFFER_TEXCOORD_STATE 4
+#define GPU_BUFFER_COLOR_STATE 8
+
 /* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
 int useVBOs = -1;
 GPUBufferPool *globalPool = 0;
+int GLStates = 0;
 
 GPUBufferPool *GPU_buffer_pool_new()
 {
@@ -56,9 +62,7 @@
 			useVBOs = 0;
 	}
 
-	pool = MEM_mallocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new");
-	pool->size = 0;
-	pool->start = 0;
+	pool = MEM_callocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new");
 
 	return pool;
 }
@@ -216,7 +220,7 @@
 	curmat = curverts = 0;
 	for( i = 0; i < 256; i++ ) {
 		if( numverts[i] > 0 ) {
-			object->materials[curmat].mat_nr = i;
+			object->materials[curmat].mat_nr = i-127;
 			object->materials[curmat].start = curverts;
 			object->materials[curmat].end = curverts+numverts[i];
 			curverts += numverts[i];
@@ -254,9 +258,11 @@
 	index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup");
 	for( i = 0; i < object->nmaterials; i++ ) {
 		index[i] = object->materials[i].start;
-		redir[object->materials[i].mat_nr] = i;
+		redir[object->materials[i].mat_nr+127] = i;
 	}
 
+	if( globalPool == 0 )
+		globalPool = GPU_buffer_pool_new();
 	buffer = GPU_buffer_alloc(size,globalPool);
 
 	if( useVBOs ) {
@@ -358,14 +364,14 @@
 		if( mface[i].v4 ) {
 			/* v3 v4 v1 */
 			if( mface->flag & ME_SMOOTH ) {
-				VECCOPY(&varray[start],mvert[mface[i].v3].no);
-				VECCOPY(&varray[start+3],mvert[mface[i].v4].no);
-				VECCOPY(&varray[start+6],mvert[mface[i].v1].no);
+				VECCOPY(&varray[start+9],mvert[mface[i].v3].no);
+				VECCOPY(&varray[start+12],mvert[mface[i].v4].no);
+				VECCOPY(&varray[start+15],mvert[mface[i].v1].no);
 			}
 			else {
-				VECCOPY(&varray[start],norm);
-				VECCOPY(&varray[start+3],norm);
-				VECCOPY(&varray[start+6],norm);
+				VECCOPY(&varray[start+9],norm);
+				VECCOPY(&varray[start+12],norm);
+				VECCOPY(&varray[start+15],norm);
 			}
 		}
 	}
@@ -477,10 +483,12 @@
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new( dm );
 	if( dm->drawObject->vertices == 0 )
-		GPU_buffer_vertex( dm );
+		dm->drawObject->vertices = GPU_buffer_vertex( dm );
 	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->vertices->id );
 	glEnableClientState( GL_VERTEX_ARRAY );
 	glVertexPointer( 3, GL_FLOAT, 0, 0 );
+	
+	GLStates |= GPU_BUFFER_VERTEX_STATE;
 }
 
 void GPU_normal_setup( DerivedMesh *dm )
@@ -488,10 +496,12 @@
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new( dm );
 	if( dm->drawObject->normals == 0 )
-		GPU_buffer_normal( dm );
+		dm->drawObject->normals = GPU_buffer_normal( dm );
 	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->normals->id );
 	glEnableClientState( GL_NORMAL_ARRAY );
 	glNormalPointer( GL_FLOAT, 0, 0 );
+
+	GLStates |= GPU_BUFFER_NORMAL_STATE;
 }
 
 void GPU_uv_setup( DerivedMesh *dm )
@@ -499,10 +509,12 @@
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new( dm );
 	if( dm->drawObject->uv == 0 )
-		GPU_buffer_uv( dm );
+		dm->drawObject->uv = GPU_buffer_uv( dm );
 	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
 	glEnableClientState( GL_TEXTURE_COORD_ARRAY );
 	glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+
+	GLStates |= GPU_BUFFER_TEXCOORD_STATE;
 }
 
 void GPU_color_setup( DerivedMesh *dm )
@@ -510,8 +522,24 @@
 	if( dm->drawObject == 0 )
 		dm->drawObject = GPU_drawobject_new( dm );
 	if( dm->drawObject->colors == 0 )
-		GPU_buffer_uv( dm );
+		dm->drawObject->colors = GPU_buffer_uv( dm );
 	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->colors->id );
 	glEnableClientState( GL_COLOR_ARRAY );
 	glColorPointer( 3, GL_UNSIGNED_BYTE, 0, 0 );
+
+	GLStates |= GPU_BUFFER_COLOR_STATE;
 }
+
+void GPU_buffer_unbind()
+{
+	if( GLStates & GPU_BUFFER_VERTEX_STATE )
+		glDisableClientState( GL_VERTEX_ARRAY );
+	if( GLStates & GPU_BUFFER_NORMAL_STATE )
+		glDisableClientState( GL_NORMAL_ARRAY );
+	if( GLStates & GPU_BUFFER_TEXCOORD_STATE )
+		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 );
+	glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
+}
\ No newline at end of file





More information about the Bf-blender-cvs mailing list