[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12214] branches/bmesh/source/blender: -> Return of old style selection code, extrude tools and delete tools.

Geoffrey Bantle hairbat at yahoo.com
Sun Oct 7 05:42:57 CEST 2007


Revision: 12214
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12214
Author:   briggs
Date:     2007-10-07 05:42:56 +0200 (Sun, 07 Oct 2007)

Log Message:
-----------
-> Return of old style selection code, extrude tools and delete tools.
	
Made the decision to not change too much, so old style selection with flushing is back
for the forseeable future. This also means the return of the 'what do you want to delete today'
menu when hitting xkey. Also added new unified extrude code and restored old menus for it.
Transform options are not exactly the same after initializing an extrude because face normals
are not calculated properly yet for in editmode, this should be fixed soon....

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
    branches/bmesh/source/blender/blenkernel/intern/BME_structure.c
    branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
    branches/bmesh/source/blender/src/editbmesh_interface.c
    branches/bmesh/source/blender/src/editbmesh_select.c
    branches/bmesh/source/blender/src/editbmesh_tools.c
    branches/bmesh/source/blender/src/header_view3d.c

Modified: branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-10-07 02:49:03 UTC (rev 12213)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-10-07 03:42:56 UTC (rev 12214)
@@ -57,6 +57,7 @@
 /*defines for element->flag*/
 #define BME_VISITED 2											/*for traversal/selection functions*/
 #define BME_NEW 4											/*for tools*/
+#define BME_DELETE 8
 
 typedef struct BME_CycleNode{
 	struct BME_CycleNode 	*next, *prev;
@@ -158,6 +159,7 @@
 struct BME_CycleNode *BME_disk_getpointer(struct BME_Edge *e, struct BME_Vert *v);
 struct BME_Edge *BME_disk_next_edgeflag(struct BME_Edge *e, struct BME_Vert *v, int eflag, int tflag);
 int BME_disk_count_edgeflag(struct BME_Vert *v, int eflag, int tflag);
+int BME_disk_existedge(struct BME_Vert *v1, struct BME_Vert *v2);
 
 /*RADIAL CYCLE*/
 struct BME_Loop *BME_radial_nextloop(struct BME_Loop *l);
@@ -197,27 +199,47 @@
 void BME_select_vert(struct BME_Mesh *bm, struct BME_Vert *v, int select);
 void BME_select_edge(struct BME_Mesh *bm, struct BME_Edge *e, int select);
 void BME_select_poly(struct BME_Mesh *bm, struct BME_Poly *f, int select);
-void BME_change_mode_exclusive(struct BME_Mesh *bm,  int newmode);
-void BME_strip_selections(struct BME_Mesh *bm);
+void BME_select_flush(struct BME_Mesh *bm);
+void BME_selectmode_flush(struct BME_Mesh *bm);
+void BME_selectmode_set(struct BME_Mesh *bm);
+void BME_clear_flag_all(struct BME_Mesh *bm, int flag);
 #define BME_SELECTED(element) (element->flag & SELECT)
 #define BME_NEWELEM(element) (element->flag & BME_NEW)
 #define BME_ISVISITED(element) (element->flag & BME_VISITED)
 #define BME_VISIT(element) (element->flag |= BME_VISITED)
+#define BME_UNVISIT(element) (element->flag &= ~BME_VISITED)
+#define BME_MARK(element) (element->flag |= BME_DELETE)
+#define BME_MARKED(element) (element->flag & BME_DELETE)
+
 /*TOOLS CODE*/
+
+/*tools defines*/
+#define BME_DEL_VERTS 1
+#define BME_DEL_EDGESFACES 2
+#define BME_DEL_EDGES 3
+#define BME_DEL_FACES 4
+#define BME_DEL_ONLYFACES 5
+#define BME_DEL_ALL 6
+
+#define BME_EXTRUDE_VERTS 1
+#define BME_EXTRUDE_EDGES 2
+#define BME_EXTRUDE_FACES 4
+
+void BME_delete_context(struct BME_Mesh *bm, int type);
+
 /*Vertex Tools*/
 void BME_connect_verts(struct BME_Mesh *bm);
 void BME_delete_verts(struct BME_Mesh *bm);
-int BME_extrude_verts(struct BME_Mesh *bm);
 /*Edge Tools*/
 void BME_cut_edge(struct BME_Mesh *bm, BME_Edge *e, int numcuts);
 void BME_cut_edges(struct BME_Mesh *bm, int numcuts);
 void BME_dissolve_edges(struct BME_Mesh *bm);
 void BME_delete_edges(struct BME_Mesh *bm);
-int BME_extrude_edges(struct BME_Mesh *bm);
 /*Face Tools*/
 struct BME_Poly *BME_inset_poly(struct BME_Mesh *bm, struct BME_Poly *f);
 void BME_split_face(struct BME_Mesh *bm, struct BME_Poly *f);
 void BME_delete_polys(struct BME_Mesh *bm);
-/*mixed tools*/
+/*Multimode tools*/
 void BME_duplicate(struct BME_Mesh *bm);
+void BME_extrude_mesh(struct BME_Mesh *bm, int type);
 #endif

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-10-07 02:49:03 UTC (rev 12213)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-10-07 03:42:56 UTC (rev 12214)
@@ -101,123 +101,166 @@
 	else v->flag &= ~SELECT;
 }
 void BME_select_edge(BME_Mesh *bm, BME_Edge *e, int select){
-	if(select) e->flag |= SELECT;
-	else e->flag &= ~SELECT;
+	if(select){ 
+		e->flag |= SELECT;
+		e->v1->flag |= SELECT;
+		e->v2->flag |= SELECT;
+	}
+	else{ 
+		e->flag &= ~SELECT;
+		e->v1->flag &= ~SELECT;
+		e->v2->flag &= ~SELECT;
+	}
 }
 void BME_select_poly(BME_Mesh *bm, BME_Poly *f, int select){
-	if(select) f->flag |= SELECT;
-	else f->flag &= ~SELECT;
+	BME_Loop *l;
+	if(select){ 
+		f->flag |= SELECT;
+		l = f->loopbase;
+		do{
+			l->v->flag |= SELECT;
+			l->e->flag |= SELECT;
+			l=l->next;
+		}while(l != f->loopbase);
+	}
+	else{ 
+		f->flag &= ~SELECT;
+		l=f->loopbase;
+		do{
+			l->v->flag &= ~SELECT;
+			l->e->flag &= ~SELECT;
+			l=l->next;
+		}while(l!=f->loopbase);
+	}
 }
 
+void BME_clear_flag_all(BME_Mesh *bm, int flag)
+{
+	BME_Vert  *v;
+	BME_Edge *e;
+	BME_Loop *l;
+	BME_Poly *f;
+	
+	if(flag & BME_NEW) return; //system flag, tool authors not allowed to clear.
+	for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)) v->flag &= ~flag;
+	for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e))e->flag &= ~flag;
+	for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f))f->flag &= ~flag;
+}
 
 #define MULTISELECT(mode) (mode != SCE_SELECT_VERTEX && mode!= SCE_SELECT_EDGE && mode != SCE_SELECT_FACE)
-/*	
- *	BME CHANGE MODE
- *
- * Changes the selection mode for the mesh.
+
+
+/* flush selection to edges & faces */
+
+/*  this only based on coherent selected vertices, for example when adding new
+    objects. call clear_flag_all() before you select vertices to be sure it ends OK!
+	
 */
-void BME_change_mode_exclusive(BME_Mesh *bm,  int newmode){
-	BME_Vert *v;
+
+void BME_select_flush(BME_Mesh *bm)
+{
 	BME_Edge *e;
 	BME_Loop *l;
 	BME_Poly *f;
-	int faceflush;
+	int totsel;
 	
-	if(MULTISELECT(newmode)) return;
-	
-	if(newmode == SCE_SELECT_VERTEX){
-		/*flush faces to verts*/
-		for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
-			if(BME_SELECTED(f)){
-				l=f->loopbase;
-				do{
-					BME_select_vert(bm,l->v,1);
-					l = l->next;
-				}while(l!=f->loopbase);
-				
-				
-			}
-		}
-		/*flush edges to verts*/
-		for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
-			if(BME_SELECTED(e)){
-				BME_select_vert(bm,e->v1,1);
-				BME_select_vert(bm,e->v2,1);
-			}
-		}
-		bm->selectmode = newmode;
+	for(e= BME_first(bm,BME_EDGE); e; e=BME_next(bm,BME_EDGE,e)) {
+		if(BME_SELECTED(e->v1) && BME_SELECTED(e->v2)) e->flag |= SELECT; //replace with a macro!
 	}
+	for(f= BME_first(bm,BME_POLY); f; f=BME_next(bm,BME_POLY,f)) {
+		totsel = 0;
+		l=f->loopbase;
+		do{
+			if(BME_SELECTED(l->v)) totsel++;
+			l=l->next;
+		}while(l!=f->loopbase);
+		
+		if(totsel == f->len) f->flag |= SELECT;	
+	}
+}
+
+
+/* flush to edges & faces */
+
+/* based on select mode it selects edges/faces 
+   assumed is that verts/edges/faces were properly selected themselves
+   with the calls above
+*/
+
+void BME_selectmode_flush(BME_Mesh *bm)
+{
+	BME_Edge *e;
+	BME_Loop *l;
+	BME_Poly  *f;
+	int totsel;
 	
-	else if(newmode == SCE_SELECT_EDGE){
-		/*flush verts to edges*/
-		for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)){
-			if(BME_SELECTED(e->v1) && BME_SELECTED(e->v2)) BME_select_edge(bm,e,1);
+	// flush to edges & faces
+	if(bm->selectmode & SCE_SELECT_VERTEX) {
+		for(e= BME_first(bm,BME_EDGE); e; e=BME_next(bm,BME_EDGE,e)) {
+			if(BME_SELECTED(e->v1) && BME_SELECTED(e->v2))e->flag |= SELECT; //make macro
+			else e->flag &= ~SELECT;
 		}
-		/*flush faces to edges*/
-		for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
-			if(BME_SELECTED(f)){
-				l=f->loopbase;
-				do{
-					BME_select_edge(bm,l->e,1);
-					l=l->next;
-				}while(l!=f->loopbase);
-				
-			}
-		}
-		bm->selectmode = newmode;
-	}
-
-	else if(newmode == SCE_SELECT_FACE){
-		/*flush vertices to faces*/
-		for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
-			faceflush = 1;
-			l = f->loopbase;
+		for(f= BME_first(bm,BME_POLY); f; f=BME_next(bm,BME_POLY,f)) {
+			totsel = 0;
+			l=f->loopbase;
 			do{
-				if(!(BME_SELECTED(l->v))){
-					faceflush = 0;
-					break;
-				}
-				l = l->next;
+				if(BME_SELECTED(l->v)) totsel++;
+				l=l->next;
 			}while(l!=f->loopbase);
 			
-			if(faceflush) BME_select_poly(bm,f,1);
+			if(totsel == f->len) f->flag |= SELECT;
+			else f->flag &= ~ SELECT;
 		}
-		
-		/*flush edges to faces*/	
-		for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
-			faceflush = 1;
-			l = f->loopbase;
+	}
+	// flush to faces
+	else if(bm->selectmode & SCE_SELECT_EDGE) {
+		for(f= BME_first(bm,BME_POLY); f; f=BME_next(bm,BME_POLY,f)) {
+			totsel = 0;
+			l=f->loopbase;
 			do{
-				if(!(BME_SELECTED(l->e))){
-					faceflush = 0;
-					break;
-				}
-				l = l->next;
+				if(BME_SELECTED(l->e)) totsel++;
+				l=l->next;
 			}while(l!=f->loopbase);
 			
-			if(faceflush) BME_select_poly(bm,f,1);
+			if(totsel == f->len) f->flag |= SELECT;
+			else f->flag &= ~ SELECT;
 		}
-		bm->selectmode = newmode;
+	}	
+	// make sure selected faces have selected edges and verts too, for extrude (hack?)
+	else if(bm->selectmode & SCE_SELECT_FACE) {
+		for(f= BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)) {
+			if(BME_SELECTED(f)) BME_select_poly(bm,f, 1);
+		}
 	}
-	BME_strip_selections(bm);
 }
 
-void BME_strip_selections(BME_Mesh *bm){
-	
+
+
+void BME_selectmode_set(BME_Mesh *bm){
 	BME_Vert *v;
 	BME_Edge *e;
 	BME_Poly *f;
 	
-	/*strip invalid selections. Make this a seperate function!*/
-	if(!(bm->selectmode & SCE_SELECT_VERTEX)){
-		for(v=BME_first(bm,BME_VERT);v;v=BME_next(bm,BME_VERT,v)) BME_select_vert(bm,v,0);
+	if(bm->selectmode & SCE_SELECT_VERTEX) {
+		/* vertices -> edges -> faces */
+		for(e= BME_first(bm,BME_EDGE); e; e= BME_next(bm,BME_EDGE,e)) e->flag &= ~SELECT; //bad, replace with a macro
+		for (f= BME_first(bm,BME_POLY); f; f= BME_next(bm,BME_POLY,f)) f->flag &= ~SELECT;  //bad, replace with a macro
+		BME_select_flush(bm);
 	}
-	if(!(bm->selectmode & SCE_SELECT_EDGE)){
-		for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)) BME_select_edge(bm,e,0);
+	else if(bm->selectmode & SCE_SELECT_EDGE) {
+		/* deselect vertices, and select again based on edge select */
+		for(v= BME_first(bm,BME_VERT); v; v= BME_next(bm,BME_VERT,v)) BME_select_vert(bm,v,0);
+		for(e= BME_first(bm,BME_EDGE); e; e= BME_next(bm,BME_EDGE,e)) 
+			if(BME_SELECTED(e)) BME_select_edge(bm,e, 1);
+		/* selects faces based on edge status */
+		BME_selectmode_flush(bm);
 	}
-	if(!(bm->selectmode & SCE_SELECT_FACE)){
-		for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)) BME_select_poly(bm,f,0);
-	}	
+	else if(bm->selectmode & SCE_SELECT_FACE) {
+		/* deselect edges, and select again based on face select */
+		for(e= BME_first(bm,BME_EDGE); e; e= BME_next(bm,BME_EDGE,e)) BME_select_edge(bm,e, 0);
+		for(f= BME_first(bm,BME_POLY); f; f=BME_next(bm,BME_POLY,f)) 
+			if(BME_SELECTED(f)) BME_select_poly(bm,f, 1);
+	}
 }
 
 /*	

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_structure.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list