[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22086] branches/soc-2009-imbusy/source/ blender: some more edit mode code.

Lukas Steiblys imbusy at imbusy.org
Fri Jul 31 16:01:20 CEST 2009


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

Log Message:
-----------
some more edit mode code. The code is getting hacky, because of all the set*Options function pointers in the DerivedMesh render function arguments.

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.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-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c	2009-07-31 14:01:20 UTC (rev 22086)
@@ -491,14 +491,51 @@
 		}
 		glEnd();
 	} else {
-		glBegin(GL_LINES);
-		for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
-			if(!setDrawOptions || setDrawOptions(userData, i)) {
-				glVertex3fv(eed->v1->co);
-				glVertex3fv(eed->v2->co);
+		GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*3*2*emdm->em->totedge, 0 );
+		float *varray;
+		if( (varray = GPU_buffer_lock( buffer )) ) {
+			int prevdraw = 0;
+			int numedges = 0;
+			int draw = 0;
+			int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_END };
+			GPU_buffer_unlock( buffer );
+			GPU_interleaved_setup( buffer, datatype );
+			GPU_buffer_lock( buffer );
+			for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+				if(!setDrawOptions || setDrawOptions(userData, i)) {
+					draw = 1;
+				} else {
+					draw = 0;
+				}
+				if( prevdraw != draw && prevdraw != 0 && numedges > 0) {
+					GPU_buffer_unlock( buffer );
+					glDrawArrays(GL_LINES,0,numedges*2);
+					varray = GPU_buffer_lock( buffer );
+					numedges = 0;
+				}
+				if( draw != 0 ) {
+					VECCOPY(&varray[numedges*6],eed->v1->co);
+					VECCOPY(&varray[numedges*6+3],eed->v2->co);
+					numedges++;
+				}
+				prevdraw = draw;
 			}
+			GPU_buffer_unlock( buffer );
+			if( prevdraw != 0 && numedges > 0) {
+				glDrawArrays(GL_LINES,0,numedges*2);
+			}
+			GPU_buffer_unbind();
+		} else {
+			glBegin(GL_LINES);
+			for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
+				if(!setDrawOptions || setDrawOptions(userData, i)) {
+					glVertex3fv(eed->v1->co);
+					glVertex3fv(eed->v2->co);
+				}
+			}
+			glEnd();
 		}
-		glEnd();
+		GPU_buffer_free( buffer, 0 );
 	}
 }
 static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
@@ -735,12 +772,12 @@
 				}
 				prevdraw = draw;
 			}
+			GPU_buffer_unlock( buffer );
 			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);

Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-07-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-07-31 14:01:20 UTC (rev 22086)
@@ -1601,12 +1601,52 @@
 				col0[2] + (col1[2]-col0[2])*t,
 				col0[3] + (col1[3]-col0[3])*t);
 }
+
+typedef struct {
+	DerivedMesh dm;
+
+	EditMesh *em;
+} EMDM;
+
 static void draw_dm_edges_sel_interp(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
 {
 	unsigned char *cols[2];
+	int elemsize = sizeof(float)*3+sizeof(unsigned char)*4;
+	EditMesh *em= *((EditMesh **)(dm+1));
+	char *varray;
+	int i;
+	GPUBuffer *buffer;
 	cols[0] = baseCol;
 	cols[1] = selCol;
-	dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, draw_dm_edges_sel_interp__setDrawInterpOptions, cols);
+
+	buffer = GPU_buffer_alloc( elemsize*em->totedge*2, 0 );
+	if( (varray = GPU_buffer_lock( buffer )) ) {
+		EditEdge *eed;
+		int numedges = 0;
+		int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_C4UB, GPU_BUFFER_INTER_END };
+		GPU_buffer_unlock( buffer );
+		GPU_interleaved_setup( buffer, datatype );
+		GPU_buffer_lock( buffer );
+		for (i=0,eed= em->edges.first; eed; i++,eed= eed->next) {
+			if(eed->h==0) {
+				unsigned char *col0 = cols[(eed->v1->f&SELECT)?1:0];
+				unsigned char *col1 = cols[(eed->v2->f&SELECT)?1:0];
+
+				VECCOPY(((float *)&varray[elemsize*numedges*2]),eed->v1->co);
+				QUATCOPY(&varray[elemsize*numedges*2+sizeof(float)*3],col0);
+				VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),eed->v2->co);
+				QUATCOPY(&varray[elemsize*numedges*2+elemsize+sizeof(float)*3],col1);
+				numedges++;
+			}
+		}
+		GPU_buffer_unlock( buffer );
+		glDrawArrays(GL_LINES,0,numedges*2);
+		GPU_buffer_unbind();
+	}
+	else {
+		dm->drawMappedEdgesInterp(dm, draw_dm_edges_sel_interp__setDrawOptions, draw_dm_edges_sel_interp__setDrawInterpOptions, cols);
+	}
+	GPU_buffer_free( buffer, 0 );
 }
 
 	/* Draw only seam edges */

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-07-31 14:01:20 UTC (rev 22086)
@@ -49,6 +49,7 @@
 #define GPU_BUFFER_INTER_N3F	2
 #define GPU_BUFFER_INTER_T2F	3
 #define GPU_BUFFER_INTER_C3UB	4
+#define GPU_BUFFER_INTER_C4UB	5
 #define GPU_BUFFER_INTER_END	-1
 
 typedef struct GPUBuffer

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-31 12:51:18 UTC (rev 22085)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-07-31 14:01:20 UTC (rev 22086)
@@ -942,6 +942,9 @@
 			case GPU_BUFFER_INTER_C3UB:
 				elementsize += 3*sizeof(unsigned char);
 				break;
+			case GPU_BUFFER_INTER_C4UB:
+				elementsize += 4*sizeof(unsigned char);
+				break;
 			default:
 				DEBUG_VBO( "Unknown element in data type array in GPU_interleaved_setup\n" );
 		}
@@ -951,60 +954,72 @@
 		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;
+				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;
+				case GPU_BUFFER_INTER_C4UB:
+					glEnableClientState( GL_COLOR_ARRAY );
+					glColorPointer( 4, GL_UNSIGNED_BYTE, elementsize, (void *)offset );
+					GLStates |= GPU_BUFFER_COLOR_STATE;
+					offset += 4*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:
-						glEnableClientState( GL_TEXTURE_COORD_ARRAY );
-						glTexCoordPointer( 2, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
-						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, offset+(char *)buffer->pointer );
-						GLStates |= GPU_BUFFER_COLOR_STATE;
-						offset += 3*sizeof(unsigned char);
-						break;
+				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:
+					glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+					glTexCoordPointer( 2, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+					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, offset+(char *)buffer->pointer );
+					GLStates |= GPU_BUFFER_COLOR_STATE;
+					offset += 3*sizeof(unsigned char);
+					break;
+				case GPU_BUFFER_INTER_C4UB:
+					glEnableClientState( GL_COLOR_ARRAY );

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list