[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22016] branches/soc-2009-imbusy/source/ blender: started working on editmode

Lukas Steiblys imbusy at imbusy.org
Wed Jul 29 16:20:49 CEST 2009


Revision: 22016
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22016
Author:   imbusy
Date:     2009-07-29 16:20:49 +0200 (Wed, 29 Jul 2009)

Log Message:
-----------
started working on editmode

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.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/DerivedMesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c	2009-07-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c	2009-07-29 14:20:49 UTC (rev 22016)
@@ -627,8 +627,8 @@
 			draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
 			if(draw) {
 				if (draw==2) { /* enabled with stipple */
-		  			glEnable(GL_POLYGON_STIPPLE);
-		  			glPolygonStipple(stipple_quarttone);
+	  				glEnable(GL_POLYGON_STIPPLE);
+	  				glPolygonStipple(stipple_quarttone);
 				}
 				
 				glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
@@ -659,41 +659,132 @@
 			}
 		}
 	} else {
-		for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
-			int drawSmooth = (efa->flag & ME_SMOOTH);
-			draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
-			if(draw) {
-				if (draw==2) { /* enabled with stipple */
-		  			glEnable(GL_POLYGON_STIPPLE);
-		  			glPolygonStipple(stipple_quarttone);
+		/* 3 floats for position, 3 for normal and times two because the faces may actually be quads instead of triangles */
+		GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*6*emdm->em->totface*3*2, 0 );
+		float *varray;
+		if( (varray = GPU_buffer_lock( buffer )) ) {
+			int prevdraw = 0;
+			int numfaces = 0;
+			int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_N3F, GPU_BUFFER_INTER_END };
+			GPU_buffer_unlock( buffer );
+			GPU_interleaved_setup( buffer, datatype );
+			glShadeModel(GL_SMOOTH);
+			GPU_buffer_lock( buffer );
+			for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+				int drawSmooth = (efa->flag & ME_SMOOTH);
+				draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+				if( prevdraw != draw && prevdraw != 0 && numfaces > 0) {
+					if( prevdraw==2 ) {
+						glEnable(GL_POLYGON_STIPPLE);
+		  				glPolygonStipple(stipple_quarttone);
+						glDisable(GL_POLYGON_STIPPLE);
+					}
+					GPU_buffer_unlock( buffer );
+					glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+					if( prevdraw==2 ) {
+						glDisable(GL_POLYGON_STIPPLE);
+					}
+					varray = GPU_buffer_lock( buffer );
+					numfaces = 0;
 				}
-				glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+				if( draw != 0 ) {
+					if(!drawSmooth) {
+						VECCOPY(&varray[numfaces*18],efa->v1->co);
+						VECCOPY(&varray[numfaces*18+3],efa->n);
 
-				glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
-				if (!drawSmooth) {
-					glNormal3fv(efa->n);
-					glVertex3fv(efa->v1->co);
-					glVertex3fv(efa->v2->co);
-					glVertex3fv(efa->v3->co);
-					if(efa->v4) glVertex3fv(efa->v4->co);
-				} else {
-					glNormal3fv(efa->v1->no);
-					glVertex3fv(efa->v1->co);
-					glNormal3fv(efa->v2->no);
-					glVertex3fv(efa->v2->co);
-					glNormal3fv(efa->v3->no);
-					glVertex3fv(efa->v3->co);
-					if(efa->v4) {
-						glNormal3fv(efa->v4->no);
-						glVertex3fv(efa->v4->co);
+						VECCOPY(&varray[numfaces*18+6],efa->v2->co);
+						VECCOPY(&varray[numfaces*18+9],efa->n);
+
+						VECCOPY(&varray[numfaces*18+12],efa->v3->co);
+						VECCOPY(&varray[numfaces*18+15],efa->n);
+						numfaces++;
+						if( efa->v4 ) {
+							VECCOPY(&varray[numfaces*18],efa->v3->co);
+							VECCOPY(&varray[numfaces*18+3],efa->n);
+
+							VECCOPY(&varray[numfaces*18+6],efa->v4->co);
+							VECCOPY(&varray[numfaces*18+9],efa->n);
+
+							VECCOPY(&varray[numfaces*18+12],efa->v1->co);
+							VECCOPY(&varray[numfaces*18+15],efa->n);
+							numfaces++;
+						}
 					}
+					else {
+						VECCOPY(&varray[numfaces*18],efa->v1->co);
+						VECCOPY(&varray[numfaces*18+3],efa->v1->no);
+
+						VECCOPY(&varray[numfaces*18+6],efa->v2->co);
+						VECCOPY(&varray[numfaces*18+9],efa->v2->no);
+
+						VECCOPY(&varray[numfaces*18+12],efa->v3->co);
+						VECCOPY(&varray[numfaces*18+15],efa->v3->no);
+						numfaces++;
+						if( efa->v4 ) {
+							VECCOPY(&varray[numfaces*18],efa->v3->co);
+							VECCOPY(&varray[numfaces*18+3],efa->v3->no);
+
+							VECCOPY(&varray[numfaces*18+6],efa->v4->co);
+							VECCOPY(&varray[numfaces*18+9],efa->v4->no);
+
+							VECCOPY(&varray[numfaces*18+12],efa->v1->co);
+							VECCOPY(&varray[numfaces*18+15],efa->v1->no);
+							numfaces++;
+						}
+					}
 				}
-				glEnd();
-				
-				if (draw==2)
+				prevdraw = draw;
+			}
+			if( prevdraw != 0 && numfaces > 0) {
+				if( prevdraw==2 ) {
+					glEnable(GL_POLYGON_STIPPLE);
+	  				glPolygonStipple(stipple_quarttone);
+				}
+				GPU_buffer_unlock( buffer );
+				glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+				if( prevdraw==2 ) {
 					glDisable(GL_POLYGON_STIPPLE);
+				}
 			}
+			GPU_buffer_unbind();
+		} else {
+			for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+				int drawSmooth = (efa->flag & ME_SMOOTH);
+				draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+				if(draw) {
+					if (draw==2) { /* enabled with stipple */
+		  				glEnable(GL_POLYGON_STIPPLE);
+		  				glPolygonStipple(stipple_quarttone);
+					}
+					glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+
+					glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+					if (!drawSmooth) {
+						glNormal3fv(efa->n);
+						glVertex3fv(efa->v1->co);
+						glVertex3fv(efa->v2->co);
+						glVertex3fv(efa->v3->co);
+						if(efa->v4) glVertex3fv(efa->v4->co);
+					} else {
+						glNormal3fv(efa->v1->no);
+						glVertex3fv(efa->v1->co);
+						glNormal3fv(efa->v2->no);
+						glVertex3fv(efa->v2->co);
+						glNormal3fv(efa->v3->no);
+						glVertex3fv(efa->v3->co);
+						if(efa->v4) {
+							glNormal3fv(efa->v4->no);
+							glVertex3fv(efa->v4->co);
+						}
+					}
+					glEnd();
+					
+					if (draw==2)
+						glDisable(GL_POLYGON_STIPPLE);
+				}
+			}
 		}
+		GPU_buffer_free( buffer, 0 );
 	}
 }
 

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-29 14:20:49 UTC (rev 22016)
@@ -43,6 +43,14 @@
 
 struct DerivedMesh;
 
+/* V - vertex, N - normal, T - uv, C - color
+   F - float, UB - unsigned byte */
+#define GPU_BUFFER_INTER_V3F	1
+#define GPU_BUFFER_INTER_N3F	2
+#define GPU_BUFFER_INTER_T2F	3
+#define GPU_BUFFER_INTER_C3UB	4
+#define GPU_BUFFER_INTER_END	-1
+
 typedef struct GPUBuffer
 {
 	int size;	/* in bytes */
@@ -114,6 +122,7 @@
 void GPU_color_setup( struct DerivedMesh *dm );
 void GPU_edge_setup( struct DerivedMesh *dm );	/* does not mix with other data */
 void GPU_uvedge_setup( struct DerivedMesh *dm );
+void GPU_interleaved_setup( GPUBuffer *buffer, int data[] );
 
 void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
 void *GPU_buffer_lock( 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-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-29 14:20:49 UTC (rev 22016)
@@ -149,6 +149,12 @@
 
 	DEBUG_VBO("GPU_buffer_alloc\n");
 
+	if( pool == 0 ) {
+		if( globalPool == 0 )
+			globalPool = GPU_buffer_pool_new();
+		pool = globalPool;
+	}
+
 	while( pool->start < 0 )
 		pool->start += MAX_FREE_GPU_BUFFERS;
 
@@ -176,8 +182,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 {
@@ -918,6 +924,92 @@
 	GLStates |= GPU_BUFFER_VERTEX_STATE;
 }
 
+void GPU_interleaved_setup( GPUBuffer *buffer, int data[] ) {
+	int i;
+	int elementsize = 0;
+	int offset = 0;
+	for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+		switch( data[i] ) {
+			case GPU_BUFFER_INTER_V3F:
+				elementsize += 3*sizeof(float);
+				break;
+			case GPU_BUFFER_INTER_N3F:
+				elementsize += 3*sizeof(float);
+				break;
+			case GPU_BUFFER_INTER_T2F:
+				elementsize += 2*sizeof(float);
+				break;
+			case GPU_BUFFER_INTER_C3UB:
+				elementsize += 3*sizeof(unsigned char);
+				break;
+			default:
+				DEBUG_VBO( "Unknown element in data type array in GPU_interleaved_setup\n" );
+		}
+	}
+
+	if( useVBOs ) {
+		glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
+		for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+			switch( data[i] ) {
+					case GPU_BUFFER_INTER_V3F:
+						glEnableClientState( GL_VERTEX_ARRAY );
+						glVertexPointer( 3, GL_FLOAT, elementsize, (void *)offset );
+						GLStates |= GPU_BUFFER_VERTEX_STATE;
+						offset += 3*sizeof(float);
+						break;
+					case GPU_BUFFER_INTER_N3F:
+						glEnableClientState( GL_NORMAL_ARRAY );
+						glNormalPointer( GL_FLOAT, elementsize, (void *)offset );
+						GLStates |= GPU_BUFFER_NORMAL_STATE;
+						offset += 3*sizeof(float);
+						break;
+					case GPU_BUFFER_INTER_T2F:
+						glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+						glTexCoordPointer( 2, GL_FLOAT, elementsize, (void *)offset );
+						GLStates |= GPU_BUFFER_TEXCOORD_STATE;
+						offset += 2*sizeof(float);
+						break;
+					case GPU_BUFFER_INTER_C3UB:
+						glEnableClientState( GL_COLOR_ARRAY );
+						glColorPointer( 3, GL_UNSIGNED_BYTE, elementsize, (void *)offset );
+						GLStates |= GPU_BUFFER_COLOR_STATE;
+						offset += 3*sizeof(unsigned char);
+						break;
+			}
+		}
+	}
+	else {
+		for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+			switch( data[i] ) {
+					case GPU_BUFFER_INTER_V3F:
+						glEnableClientState( GL_VERTEX_ARRAY );
+						glVertexPointer( 3, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+						GLStates |= GPU_BUFFER_VERTEX_STATE;
+						offset += 3*sizeof(float);
+						break;
+					case GPU_BUFFER_INTER_N3F:
+						glEnableClientState( GL_NORMAL_ARRAY );
+						glNormalPointer( GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+						GLStates |= GPU_BUFFER_NORMAL_STATE;
+						offset += 3*sizeof(float);
+						break;
+					case GPU_BUFFER_INTER_T2F:

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list