[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11979] branches/bmesh/source/blender: -> Selection mode switching conversions

Geoffrey Bantle hairbat at yahoo.com
Sat Sep 8 14:50:10 CEST 2007


Revision: 11979
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11979
Author:   briggs
Date:     2007-09-08 14:50:10 +0200 (Sat, 08 Sep 2007)

Log Message:
-----------
-> Selection mode switching conversions
	
Switching between selection modes now converts selections. When
moving to a higher selection mode, selections are flushed 'upwards'
and when moving to lower selection modes selections are flushed 'downwards'.
Unlike old editmesh, selection modes are actually restrictive and elements not 
represented by current mode cannot be selected.

Multiselect will take some thought with regards to flushing rules and how tools
should behave.....

Modified Paths:
--------------
    branches/bmesh/source/blender/blenkernel/BKE_bmesh.h
    branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
    branches/bmesh/source/blender/src/editbmesh_interface.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-09-08 12:34:27 UTC (rev 11978)
+++ branches/bmesh/source/blender/blenkernel/BKE_bmesh.h	2007-09-08 12:50:10 UTC (rev 11979)
@@ -67,6 +67,7 @@
 {
 	ListBase 			verts, edges, polys, loops;
 	int 				lock;									/*if set, all calls to eulers will fail.*/
+	short			selectmode;							/*selection mode. Technically a copy of G.scene->selectmode*/
 	struct BME_Mesh 	*backup;								/*full copy of the mesh*/
 	int 				totvert, totedge, totpoly, totloop;				/*record keeping*/
 	int 				nextv, nexte, nextp, nextl;					/*Next element ID for verts/edges/faces/loops. Never reused*/
@@ -196,6 +197,8 @@
 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);
 #define BME_SELECTED(element) (element->flag & SELECT)
 #define BME_NEWELEM(element) (element->flag & BME_NEW)
 #define BME_ISVISITED(element) (element->flag & BME_VISITED)

Modified: branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-09-08 12:34:27 UTC (rev 11978)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c	2007-09-08 12:50:10 UTC (rev 11979)
@@ -94,7 +94,7 @@
 /*	
  *	BME SELECT VERT/EDGE/POLY
  *
- * Selects elements.
+ * Selects elements. Flushes downwards if multi-select.
 */
 void BME_select_vert(BME_Mesh *bm, BME_Vert *v, int select){
 	if(select) v->flag |= SELECT;
@@ -110,7 +110,116 @@
 }
 
 
+#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.
+*/
+void BME_change_mode_exclusive(BME_Mesh *bm,  int newmode){
+	BME_Vert *v;
+	BME_Edge *e;
+	BME_Loop *l;
+	BME_Poly *f;
+	int faceflush;
+	
+	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;
+	}
+	
+	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 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;
+			do{
+				if(!(BME_SELECTED(l->v))){
+					faceflush = 0;
+					break;
+				}
+				l = l->next;
+			}while(l!=f->loopbase);
+			
+			if(faceflush) BME_select_poly(bm,f,1);
+		}
+		
+		/*flush edges to faces*/	
+		for(f=BME_first(bm,BME_POLY);f;f=BME_next(bm,BME_POLY,f)){
+			faceflush = 1;
+			l = f->loopbase;
+			do{
+				if(!(BME_SELECTED(l->e))){
+					faceflush = 0;
+					break;
+				}
+				l = l->next;
+			}while(l!=f->loopbase);
+			
+			if(faceflush) BME_select_poly(bm,f,1);
+		}
+		bm->selectmode = newmode;
+	}
+	BME_strip_selections(bm);
+}
+
+void BME_strip_selections(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_EDGE)){
+		for(e=BME_first(bm,BME_EDGE);e;e=BME_next(bm,BME_EDGE,e)) BME_select_edge(bm,e,0);
+	}
+	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);
+	}	
+}
+
 /*	
  *	BME MAKE MESH
  *

Modified: branches/bmesh/source/blender/src/editbmesh_interface.c
===================================================================
--- branches/bmesh/source/blender/src/editbmesh_interface.c	2007-09-08 12:34:27 UTC (rev 11978)
+++ branches/bmesh/source/blender/src/editbmesh_interface.c	2007-09-08 12:50:10 UTC (rev 11979)
@@ -145,7 +145,9 @@
 	PointerArray edgearr = {0};
 	int i, j;
 	
+	
 	BME_model_begin(bmesh);
+	bmesh->selectmode = G.scene->selectmode;
 	
 	if (me->totface && !me->totpoly) {
 		printf("ERROR: paranoia mesh conversion function was called!\n");
@@ -194,6 +196,7 @@
 	if (edge_table) MEM_freeN(edge_table);
 	
 	BME_model_end(bmesh);
+	BME_strip_selections(bmesh);
 	return bmesh;
 }
 
@@ -331,7 +334,7 @@
 	Mesh_FromBMesh(G.editMesh, mesh);
 }
 
-void EditBME_FlushSelUpward(BME_Mesh *mesh)
+void EditBME_FlushSelUpward(BME_Mesh *mesh) /*remove this, its not used...*/
 {
 	BME_Edge *eed;
 	BME_Loop *loop;
@@ -352,7 +355,7 @@
 	}
 }
 
-void mouse_bmesh(void)
+void mouse_bmesh(void) /*rewrite me like the old mouse_mesh from editmesh....*/
 {
 	if (G.scene->selectmode == SCE_SELECT_VERTEX) {
 		int dis = 75;
@@ -366,7 +369,6 @@
 				for(eve=BME_first(G.editMesh,BME_VERT);eve;eve=BME_next(G.editMesh,BME_VERT,eve)) BME_select_vert(G.editMesh,eve,0);
 				BME_select_vert(G.editMesh,vert,1);
 			}
-			//EditBME_FlushSelUpward(G.editMesh);
 			allqueue(REDRAWVIEW3D, 1);
 		}
 	} else if (G.scene->selectmode == SCE_SELECT_EDGE) {
@@ -699,4 +701,6 @@
 	
 	return efan;
 }
+
+
 #endif

Modified: branches/bmesh/source/blender/src/header_view3d.c
===================================================================
--- branches/bmesh/source/blender/src/header_view3d.c	2007-09-08 12:34:27 UTC (rev 11978)
+++ branches/bmesh/source/blender/src/header_view3d.c	2007-09-08 12:50:10 UTC (rev 11979)
@@ -70,6 +70,7 @@
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_mesh.h"
+#include "BKE_bmesh.h"
 
 #ifdef WITH_VERSE
 #include "BKE_verse.h"
@@ -4806,11 +4807,15 @@
 		break;
 		
 	case B_SEL_VERT:
-		if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0)
+		if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0){
 			G.scene->selectmode= SCE_SELECT_VERTEX;
+			BME_change_mode_exclusive(G.editMesh,SCE_SELECT_VERTEX);
+		}
+		else BME_strip_selections(G.editMesh);
 		//EDITBMESHGREP EM_selectmode_set();
 		countall();
 		BIF_undo_push("Selectmode Set: Vertex");
+		DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
 		allqueue(REDRAWVIEW3D, 1);
 		break;
 	case B_SEL_EDGE:
@@ -4819,10 +4824,13 @@
 				//EDITBMESHGREP if(G.qual==LR_CTRLKEY) EM_convertsel(SCE_SELECT_VERTEX,SCE_SELECT_EDGE); 
 			}
 			G.scene->selectmode = SCE_SELECT_EDGE;
+			BME_change_mode_exclusive(G.editMesh,SCE_SELECT_EDGE);
 		}
+		else BME_strip_selections(G.editMesh);
 		//EDITBMESHGREP EM_selectmode_set();
 		countall();
 		BIF_undo_push("Selectmode Set: Edge");
+		DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
 		allqueue(REDRAWVIEW3D, 1);
 		break;
 	case B_SEL_FACE:
@@ -4831,10 +4839,13 @@
 				//EDITBMESHGREP if(G.qual==LR_CTRLKEY) EM_convertsel((G.scene->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE);
 			}
 			G.scene->selectmode = SCE_SELECT_FACE;
+			BME_change_mode_exclusive(G.editMesh,SCE_SELECT_FACE);
 		}
+		else BME_strip_selections(G.editMesh);
 		//EDITBMESHGREP EM_selectmode_set();
 		countall();
 		BIF_undo_push("Selectmode Set: Face");
+		DAG_object_flush_update(G.scene,G.obedit,OB_RECALC_DATA);
 		allqueue(REDRAWVIEW3D, 1);
 		break;	
 	





More information about the Bf-blender-cvs mailing list