[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20261] branches/bmesh/blender/source/ blender: extrude works now, though vert extrude does not.

Joseph Eagar joeedh at gmail.com
Mon May 18 16:55:34 CEST 2009


Revision: 20261
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20261
Author:   joeedh
Date:     2009-05-18 16:55:34 +0200 (Mon, 18 May 2009)

Log Message:
-----------
extrude works now, though vert extrude does not.  still plenty of work needed on this code.  also did some work on the select infrastructure; the bmesh api now tracks the number of selected verts/edges/faces.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils_mods.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
    branches/bmesh/blender/source/blender/editors/transform/transform_orientations.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_tessmesh.h	2009-05-18 14:55:34 UTC (rev 20261)
@@ -49,7 +49,7 @@
 	ListBase selected;
 
 	/*selection mode*/
-	int selectmode, totfacesel, totvertsel, totedgesel;
+	int selectmode;
 
 	int mat_nr;
 } BMEditMesh;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c	2009-05-18 14:55:34 UTC (rev 20261)
@@ -102,10 +102,14 @@
 
 BMEditMesh *TM_Copy(BMEditMesh *tm)
 {
-	BMEditMesh *tm2 = MEM_mallocN(sizeof(BMEditMesh), "tm2");
+	BMEditMesh *tm2 = MEM_callocN(sizeof(BMEditMesh), "tm2");
 	*tm2 = *tm;
+	
+	tm2->derivedCage = tm2->derivedFinal = NULL;
+	tm2->act_face = NULL;
 
 	tm2->bm = BM_Copy_Mesh(tm->bm);
+	TM_RecalcTesselation(tm2);
 
 	return tm2;
 }

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-05-18 14:55:34 UTC (rev 20261)
@@ -39,6 +39,7 @@
 
 #include "DNA_listBase.h"
 #include "DNA_customdata_types.h"
+#include "DNA_scene_types.h"
 #include "BLI_mempool.h"
 #include "BKE_customdata.h"
 
@@ -153,9 +154,10 @@
 	struct BMFace **plar;
 	int vtarlen, edarlen, lparlen, plarlen;
 	int totvert, totedge, totface, totloop;	
+	int totvertsel, totedgesel, totfacesel;
 	int nextv, nexte, nextp, nextl;
 	struct CustomData vdata, edata, pdata, ldata;
-	int selectmode;
+	int selectmode; /*now uses defines in DNA_scene_types.h*/
 	struct BLI_mempool *flagpool;					/*memory pool for dynamically allocated flag layers*/
 	int stackdepth;									/*current depth of operator stack*/
 	int totflags, walkers;							/*total number of tool flag layers*/
@@ -217,6 +219,8 @@
 struct BMVert *BM_Make_Vert(struct BMesh *bm, float co[3], struct BMVert *example);
 struct BMEdge *BM_Make_Edge(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge *example, int nodouble);
 struct BMFace *BM_Make_Quadtriangle(struct BMesh *bm, struct BMVert **verts, BMEdge **edges, int len, struct BMFace *example, int nodouble);
+/*more easier to use version of BM_Make_Quadtriangle*/
+BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, BMFace *example);
 
 /*makes an ngon from an unordered list of edges.  v1 and v2 must be the verts
 defining edges[0], and define the winding of the new face.*/

Modified: branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki	2009-05-18 14:55:34 UTC (rev 20261)
@@ -2,7 +2,7 @@
 
 = Introduction  =
 
-BMesh is a non-manifold, locally-modifiable boundary representation. It was designed to replace the current, limited EditMesh structure, solving many of the design limitations and maintainance issues of EditMesh. 
+BMesh is a non-manifold boundary representation. It was designed to replace the current, limited EditMesh structure, solving many of the design limitations and maintainance issues of EditMesh. 
 
 == The Structure  ==
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-05-18 14:55:34 UTC (rev 20261)
@@ -122,6 +122,25 @@
  *
 */
 
+BMFace *BM_Make_QuadTri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, BMFace *example)
+{
+	BMEdge *edar[4];
+	BMVert *vtar[4];
+
+	edar[0] = v1->edge;
+	edar[1] = v1->edge;
+	edar[2] = v1->edge;
+	if (v4) edar[3] = v1->edge;
+	else edar[3] = NULL;
+
+	vtar[0] = v1;
+	vtar[1] = v2;
+	vtar[2] = v3;
+	vtar[3] = v4;
+
+	return BM_Make_Quadtriangle(bm, vtar, edar, v4?4:3, example, 0);
+}
+
 /*remove the edge array bits from this. Its not really needed?*/
 BMFace *BM_Make_Quadtriangle(BMesh *bm, BMVert **verts, BMEdge **edges, int len, BMFace *example, int nodouble)
 {
@@ -406,6 +425,8 @@
 		v2 = BM_Make_Vert(bm, v->co, NULL);
 		BM_Copy_Attributes(bmold, bm, v, v2);
 		V_GROW(vtable);
+		VECCOPY(v2->no, v->no);
+
 		vtable[V_COUNT(vtable)-1] = v2;
 
 		BMINDEX_SET(v, i);
@@ -415,7 +436,7 @@
 	e = BMIter_New(&iter, bmold, BM_EDGES_OF_MESH, NULL);
 	for (i=0; e; e=BMIter_Step(&iter), i++) {
 		e2 = BM_Make_Edge(bm, vtable[BMINDEX_GET(e->v1)],
-			          vtable[BMINDEX_GET(e->v1)], e, 0);
+			          vtable[BMINDEX_GET(e->v2)], e, 0);
 
 		BM_Copy_Attributes(bmold, bm, e, e2);
 		V_GROW(etable);
@@ -437,8 +458,17 @@
 			edges[i] = etable[BMINDEX_GET(l->e)];
 		}
 
-		f2 = BM_Make_Ngon(bm, loops[0]->v, loops[1]->v, edges, f->len, 0);
+		v = vtable[BMINDEX_GET(loops[0]->v)];
+		v2 = vtable[BMINDEX_GET(loops[1]->v)];
+
+		if (!bmesh_verts_in_edge(v, v2, edges[0])) {
+			v = vtable[BMINDEX_GET(loops[V_COUNT(loops)-1]->v)];
+			v2 = vtable[BMINDEX_GET(loops[0]->v)];
+		}
+
+		f2 = BM_Make_Ngon(bm, v, v2, edges, f->len, 0);
 		BM_Copy_Attributes(bmold, bm, f, f2);
+		VECCOPY(f2->no, f->no);
 
 		l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f2);
 		for (i=0; i<f->len; i++, l = BMIter_Step(&liter)) {

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c	2009-05-18 14:55:34 UTC (rev 20261)
@@ -232,7 +232,7 @@
 	curvert = v2;
 	
 	if(bm->vtarlen < len){
-		MEM_freeN(bm->vtar);
+		if (bm->vtar) MEM_freeN(bm->vtar);
 		bm->vtar = MEM_callocN(sizeof(BMVert *)* len, "BM Vert pointer array");
 		bm->vtarlen = len;
 	}
@@ -337,6 +337,8 @@
 
 int bmesh_kv(BMesh *bm, BMVert *v){
 	if(v->edge == NULL){ 
+		if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel--;
+
 		BLI_remlink(&(bm->verts), &(v->head));
 		bmesh_free_vert(bm,v);
 		return 1;
@@ -370,6 +372,7 @@
 		if(edok) bmesh_error();
 		
 		/*remove and deallocate*/
+		if (BM_TestHFlag(e, BM_SELECT)) bm->totedgesel--;
 		BLI_remlink(&(bm->edges), &(e->head));
 		bmesh_free_edge(bm, e);
 		return 1;
@@ -408,6 +411,7 @@
 		bply->loopbase = newbase;
 	}
 	
+	if (BM_TestHFlag(bply, BM_SELECT)) bm->totfacesel--;
 	BLI_remlink(&(bm->polys), &(bply->head));
 	bmesh_free_poly(bm, bply);
 	return 1;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-05-18 14:20:16 UTC (rev 20260)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-05-18 14:55:34 UTC (rev 20261)
@@ -32,30 +32,35 @@
 	BMEdge *e;
 	BMLoop *l;
 	BMFace *f;
+	BMHeader *ele;
 
 	BMIter edges;
 	BMIter faces;
-
+	BMIter iter;
+	
+	int types[3] = {BM_VERTS_OF_MESH, BM_EDGES_OF_MESH, BM_FACES_OF_MESH};
+	int *tots[3];
+	int i;
 	int totsel;
 
 	if(bm->selectmode & BM_VERT){
 		for(e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm ); e; e= BMIter_Step(&edges)){
-			if(bmesh_test_sysflag(&(e->v1->head), BM_SELECT) && bmesh_test_sysflag(&(e->v2->head), BM_SELECT)) bmesh_set_sysflag(&(e->head), BM_SELECT);
-			else bmesh_clear_sysflag(&(e->head), BM_SELECT);
+			if(BM_TestHFlag(e->v1, BM_SELECT) && BM_TestHFlag(e->v2, BM_SELECT)) BM_SetHFlag(e, 1);
+			else BM_ClearHFlag(e, 0);
 		}
 		for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f= BMIter_Step(&faces)){
 			totsel = 0;
 			l=f->loopbase;
 			do{
-				if(bmesh_test_sysflag(&(l->v->head), BM_SELECT)) 
+				if(BM_TestHFlag(l->v, BM_SELECT)) 
 					totsel++;
 				l = ((BMLoop*)(l->head.next));
-			}while(l!=f->loopbase);
+			} while(l != f->loopbase);
 			
 			if(totsel == f->len) 
-				bmesh_set_sysflag(&(f->head), BM_SELECT);
+				BM_SetHFlag(f, 1);
 			else
-				bmesh_clear_sysflag(&(f->head), BM_SELECT);
+				BM_ClearHFlag(f, 0);
 		}
 	}
 	else if(bm->selectmode & BM_EDGE) {
@@ -69,11 +74,24 @@
 			}while(l!=f->loopbase);
 			
 			if(totsel == f->len) 
-				bmesh_set_sysflag(&(f->head), BM_SELECT);
+				BM_SetHFlag(f, 1);
 			else 
-				bmesh_clear_sysflag(&(f->head), BM_SELECT);
+				BM_ClearHFlag(f, 0);
 		}
-	}	
+	}
+
+	/*recount tot*sel variables*/
+	bm->totvertsel = bm->totedgesel = bm->totfacesel = 0;
+	tots[0] = &bm->totvertsel;
+	tots[1] = &bm->totedgesel;
+	tots[2] = &bm->totfacesel;
+
+	for (i=0; i<3; i++) {
+		ele = BMIter_New(&iter, bm, types[i], NULL);
+		for ( ; ele; ele=BMIter_Step(&iter)) {
+			if (BM_TestHFlag(ele, BM_SELECT)) *tots[i] += 1;
+		}
+	}
 }
 
 /*
@@ -86,10 +104,13 @@
 
 void BM_Select_Vert(BMesh *bm, BMVert *v, int select)
 {
-	if(select)
-		bmesh_set_sysflag(&(v->head), BM_SELECT);
-	else 
-		bmesh_clear_sysflag(&(v->head), BM_SELECT);
+	if(select) {
+		if (!BM_TestHFlag(v, BM_SELECT)) bm->totvertsel += 1;
+		BM_SetHFlag(v, BM_SELECT);
+	} else {
+		if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel -= 1;
+		BM_ClearHFlag(v, BM_SELECT);
+	}
 }
 
 /*
@@ -107,15 +128,49 @@
 
 void BM_Select_Edge(BMesh *bm, BMEdge *e, int select)
 {
-	if(select){ 
-		bmesh_set_sysflag(&(e->head), BM_SELECT);
-		bmesh_set_sysflag(&(e->v1->head), BM_SELECT);
-		bmesh_set_sysflag(&(e->v2->head), BM_SELECT);
+	int candesel;
+	int testiso = 1;
+
+	/*I might move this logic to bmeshutils_mods.c, where it'd be invoked
+	  by the selection tools.  in that case, we'd still retain the checks
+	  for if an edge's verts can be deselected.*/
+
+	/*ensure vert selections are valid, only if not in a multiselect
+	  mode that shares SCE_SELECT_VERT*/
+	if (bm->selectmode & (SCE_SELECT_VERTEX|SCE_SELECT_EDGE)) testiso = 1;
+	else if (bm->selectmode & (SCE_SELECT_VERTEX|SCE_SELECT_FACE)) testiso = 1;
+	
+	if (testiso && !select) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list