[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22117] branches/soc-2009-imbusy/source/ blender: selected faces in editmode work

Lukas Steiblys imbusy at imbusy.org
Sat Aug 1 12:54:22 CEST 2009


Revision: 22117
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22117
Author:   imbusy
Date:     2009-08-01 12:54:22 +0200 (Sat, 01 Aug 2009)

Log Message:
-----------
selected faces in editmode work

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c

Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c	2009-08-01 10:36:05 UTC (rev 22116)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c	2009-08-01 10:54:22 UTC (rev 22117)
@@ -491,7 +491,7 @@
 		}
 		glEnd();
 	} else {
-		GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*3*2*emdm->em->totedge, 0 );
+		/*GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*3*2*emdm->em->totedge, 0 );
 		float *varray;
 		if( (varray = GPU_buffer_lock( buffer )) ) {
 			int prevdraw = 0;
@@ -525,7 +525,7 @@
 				glDrawArrays(GL_LINES,0,numedges*2);
 			}
 			GPU_buffer_unbind();
-		} else {
+		} else {*/
 			glBegin(GL_LINES);
 			for(i=0,eed= emdm->em->edges.first; eed; i++,eed= eed->next) {
 				if(!setDrawOptions || setDrawOptions(userData, i)) {
@@ -534,8 +534,8 @@
 				}
 			}
 			glEnd();
-		}
-		GPU_buffer_free( buffer, 0 );
+		/*}
+		GPU_buffer_free( buffer, 0 );*/
 	}
 }
 static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
@@ -697,7 +697,7 @@
 		}
 	} else {
 		/* 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 );
+		/*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;
@@ -784,7 +784,7 @@
 				}
 			}
 			GPU_buffer_unbind();
-		} else {
+		} 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);
@@ -820,8 +820,8 @@
 						glDisable(GL_POLYGON_STIPPLE);
 				}
 			}
-		}
-		GPU_buffer_free( buffer, 0 );
+		/*}
+		GPU_buffer_free( buffer, 0 );*/
 	}
 }
 

Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-08-01 10:36:05 UTC (rev 22116)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-08-01 10:54:22 UTC (rev 22117)
@@ -1602,18 +1602,23 @@
 				col0[3] + (col1[3]-col0[3])*t);
 }
 
+/* originally defined in DerivedMesh.c */
 typedef struct {
 	DerivedMesh dm;
 
 	EditMesh *em;
-} EMDM;
+	float (*vertexCos)[3];
+	float (*vertexNos)[3];
+	float (*faceNos)[3];
+} EditMeshDerivedMesh;
 
 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;
+	EditMeshDerivedMesh *emdm = (EditMeshDerivedMesh *)dm;
+	EditMesh *em= emdm->em;
+	unsigned char *varray;
 	int i;
 	GPUBuffer *buffer;
 	cols[0] = baseCol;
@@ -1632,9 +1637,19 @@
 				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);
+				if( emdm->vertexCos ) {
+					VECCOPY(((float *)&varray[elemsize*numedges*2]),emdm->vertexCos[(int) eed->v1->tmp.l]);
+				}
+				else {
+					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);
+				if( emdm->vertexCos ) {
+					VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),emdm->vertexCos[(int) eed->v2->tmp.l]);
+				}
+				else {
+					VECCOPY(((float *)&varray[elemsize*numedges*2+elemsize]),eed->v2->co);
+				}
 				QUATCOPY(&varray[elemsize*numedges*2+elemsize+sizeof(float)*3],col1);
 				numedges++;
 			}
@@ -1700,44 +1715,237 @@
 static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act) 
 {
 	struct { unsigned char *cols[3]; EditFace *efa_act; } data;
+	EditMeshDerivedMesh *emdm = (EditMeshDerivedMesh *)dm;
+	EditFace *efa;
+	unsigned char *col;
 	unsigned char *colors;
-	int i,j;
+	GPUBuffer *buffer;
+	unsigned char *varray;
+	unsigned char black[] = { 0, 0, 0, 0 };
+	int i,j,draw=0;
+	int elemsize = (sizeof(float)*6+sizeof(unsigned char)*4);
 	data.cols[0] = baseCol;
 	data.cols[1] = selCol;
 	data.cols[2] = actCol;
 	data.efa_act = efa_act;
 
-	/* TODO: check this later. not this function... */
-	/*colors = MEM_mallocN((sizeof(unsigned char)*dm->getNumFaces(dm)*16),"draw_dm_faces_sel");
-	for(i=0; i < dm->getNumFaces(dm); i++) {
-		EditFace *efa = EM_get_face_for_index(i);
-		unsigned char *col;
-		if (efa->h==0) {
-			if (efa == efa_act) {
-				for(j=0;j<4;j++) {
-					colors[i*16+j*4] = data.cols[2][0];
-					colors[i*16+j*4+1] = data.cols[2][1];
-					colors[i*16+j*4+2] = data.cols[2][2];
-					colors[i*16+j*4+3] = data.cols[2][3];
+
+	buffer = GPU_buffer_alloc( elemsize*emdm->em->totface*3*2, 0 );
+	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_C4UB, 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);
+			if (efa->h==0) {
+				if (efa == data.efa_act) {
+					draw = 2;
+				} else {
+					col = data.cols[(efa->f&SELECT)?1:0];
+					if (col[3]==0) draw = 0;
+					else draw = 1;
 				}
-			} else {
-				col = data.cols[(efa->f&SELECT)?1:0];
-				if (col[3]==0) memset(&colors[i*16],0,sizeof(unsigned char)*16);
-				for(j=0;j<4;j++) {
-					colors[i*16+j*4] = col[0];
-					colors[i*16+j*4+1] = col[1];
-					colors[i*16+j*4+2] = col[2];
-					colors[i*16+j*4+3] = col[3];
+			}
+			else {
+				draw = 0;
+			}
+			if( prevdraw != draw && 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);
+				}
+				varray = GPU_buffer_lock( buffer );
+				numfaces = 0;
 			}
-		} else
-		{
-			memset(&colors[i*16],0,sizeof(unsigned char)*16);
+
+			if( draw != 0 ) {
+				if(!drawSmooth) {
+					if (emdm->vertexCos) {
+						VECCOPY((float *)&varray[elemsize*3*numfaces],emdm->vertexCos[(int) efa->v1->tmp.l]);
+						VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],emdm->faceNos[i]);
+
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],emdm->vertexCos[(int) efa->v2->tmp.l]);
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],emdm->faceNos[i]);
+
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],emdm->vertexCos[(int) efa->v3->tmp.l]);
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],emdm->faceNos[i]);
+					}
+					else {
+						VECCOPY((float *)&varray[elemsize*3*numfaces],efa->v1->co);
+						VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],efa->n);
+
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],efa->v2->co);
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],efa->n);
+
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],efa->v3->co);
+						VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],efa->n);
+					}
+					if( draw == 2 ) {
+						QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[2]);
+						QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[2]);
+						QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[2]);
+					}
+					else if( draw == 1 ) {
+						QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+						QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+						QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+					}
+					else {
+						QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],black);
+						QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],black);
+						QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],black);
+					}
+
+					numfaces++;
+					if( efa->v4 ) {
+						if (emdm->vertexCos) {
+							VECCOPY((float *)&varray[elemsize*3*numfaces],emdm->vertexCos[(int) efa->v3->tmp.l]);
+							VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],emdm->faceNos[i]);
+
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],emdm->vertexCos[(int) efa->v4->tmp.l]);
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],emdm->faceNos[i]);
+
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],emdm->vertexCos[(int) efa->v1->tmp.l]);
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],emdm->faceNos[i]);
+						}
+						else {
+							VECCOPY((float *)&varray[elemsize*3*numfaces],efa->v3->co);
+							VECCOPY((float *)&varray[elemsize*3*numfaces+sizeof(float)*3],efa->n);
+
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize],efa->v4->co);
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize+sizeof(float)*3],efa->n);
+
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2],efa->v1->co);
+							VECCOPY((float *)&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*3],efa->n);
+						}
+
+						if( draw == 2 ) {
+							QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[2]);
+							QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[2]);
+							QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[2]);
+						}
+						else if( draw == 1 ) {
+							QUATCOPY(&varray[elemsize*3*numfaces+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+							QUATCOPY(&varray[elemsize*3*numfaces+elemsize+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+							QUATCOPY(&varray[elemsize*3*numfaces+elemsize*2+sizeof(float)*6],data.cols[(efa->f&SELECT)?1:0]);
+						}
+						else {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list