[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40185] branches/bmesh/blender/source/ blender: Submit of patch [#28568] BMesh: make active element highlights work

Andrew Wiggin ender79bl at gmail.com
Tue Sep 13 15:41:21 CEST 2011


Revision: 40185
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40185
Author:   ender79
Date:     2011-09-13 13:41:20 +0000 (Tue, 13 Sep 2011)
Log Message:
-----------
Submit of patch [#28568] BMesh: make active element highlights work

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.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/editface.c
    branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
    branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_draw.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h	2011-09-13 12:55:21 UTC (rev 40184)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_marking.h	2011-09-13 13:41:20 UTC (rev 40185)
@@ -41,6 +41,8 @@
 int BM_CountFlag(struct BMesh *bm, int type, int flag, int respectflag);
 
 /*edit selection stuff*/
+void BM_set_actFace(BMesh *em, BMFace *f);
+BMFace *BM_get_actFace(BMesh *bm, int sloppy);
 void BM_editselection_center(BMesh *bm, float *center, BMEditSelection *ese);
 void BM_editselection_normal(float *normal, BMEditSelection *ese);
 void BM_editselection_plane(BMesh *bm, float *plane, BMEditSelection *ese);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2011-09-13 12:55:21 UTC (rev 40184)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2011-09-13 13:41:20 UTC (rev 40185)
@@ -104,6 +104,9 @@
 		}
 	}
 
+	/*Remove any deselected elements from the BMEditSelection*/
+	BM_validate_selections(bm);
+
 	recount_totsels(bm);
 }
 
@@ -339,7 +342,48 @@
 	return BM_TestHFlag(head, BM_SELECT);
 }
 
+/* this replaces the active flag used in uv/face mode */
+void BM_set_actFace(BMesh *bm, BMFace *efa)
+{
+	bm->act_face = efa;
+}
 
+BMFace *BM_get_actFace(BMesh *bm, int sloppy)
+{
+	if (bm->act_face) {
+		return bm->act_face;
+	} else if (sloppy) {
+		BMIter iter;
+		BMFace *f= NULL;
+		BMEditSelection *ese;
+		
+		/* Find the latest non-hidden face from the BMEditSelection */
+		ese = bm->selected.last;
+		for (; ese; ese=ese->prev){
+			if(ese->type == BM_FACE) {
+				f = (BMFace *)ese->data;
+				
+				if (BM_TestHFlag(f, BM_HIDDEN)) {
+					f= NULL;
+				}
+				else {
+					break;
+				}
+			}
+		}
+		/* Last attempt: try to find any selected face */
+		if (f==NULL) {
+			BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+				if (BM_TestHFlag(f, BM_SELECT)) {
+					break;
+				}
+			}
+		}
+		return f; /* can still be null */
+	}
+	return NULL;
+}
+
 /* generic way to get data from an EditSelection type 
 These functions were written to be used by the Modifier widget when in Rotate about active mode,
 but can be used anywhere.
@@ -347,7 +391,7 @@
 EM_editselection_normal
 EM_editselection_plane
 */
-void BM_editselection_center(BMesh *em, float *center, BMEditSelection *ese)
+void BM_editselection_center(BMesh *bm, float *center, BMEditSelection *ese)
 {
 	if (ese->type==BM_VERT) {
 		BMVert *eve= ese->data;
@@ -358,7 +402,7 @@
 		mul_v3_fl(center, 0.5);
 	} else if (ese->type==BM_FACE) {
 		BMFace *efa= ese->data;
-		BM_Compute_Face_Center(em, efa, center);
+		BM_Compute_Face_Center(bm, efa, center);
 	}
 }
 
@@ -392,14 +436,14 @@
 /* Calculate a plane that is rightangles to the edge/vert/faces normal
 also make the plane run allong an axis that is related to the geometry,
 because this is used for the manipulators Y axis.*/
-void BM_editselection_plane(BMesh *em, float *plane, BMEditSelection *ese)
+void BM_editselection_plane(BMesh *bm, float *plane, BMEditSelection *ese)
 {
 	if (ese->type==BM_VERT) {
 		BMVert *eve= ese->data;
 		float vec[3]={0,0,0};
 		
 		if (ese->prev) { /*use previously selected data to make a usefull vertex plane */
-			BM_editselection_center(em, vec, ese->prev);
+			BM_editselection_center(bm, vec, ese->prev);
 			sub_v3_v3v3(plane, vec, eve->co);
 		} else {
 			/* make a fake  plane thats at rightangles to the normal
@@ -471,54 +515,56 @@
 	normalize_v3(plane);
 }
 
-static int BM_check_selection(BMesh *em, void *data)
+static int BM_check_selection(BMesh *bm, void *data)
 {
 	BMEditSelection *ese;
 	
-	for(ese = em->selected.first; ese; ese = ese->next){
+	for(ese = bm->selected.first; ese; ese = ese->next){
 		if(ese->data == data) return 1;
 	}
 	
 	return 0;
 }
 
-void BM_remove_selection(BMesh *em, void *data)
+void BM_remove_selection(BMesh *bm, void *data)
 {
 	BMEditSelection *ese;
-	for(ese=em->selected.first; ese; ese = ese->next){
+	for(ese=bm->selected.first; ese; ese = ese->next){
 		if(ese->data == data){
-			BLI_freelinkN(&(em->selected),ese);
+			BLI_freelinkN(&(bm->selected),ese);
 			break;
 		}
 	}
 }
 
-void BM_clear_selection_history(BMesh *em)
+void BM_clear_selection_history(BMesh *bm)
 {
-	BLI_freelistN(&em->selected);
-	em->selected.first = em->selected.last = NULL;
+	BLI_freelistN(&bm->selected);
+	bm->selected.first = bm->selected.last = NULL;
 }
 
-void BM_store_selection(BMesh *em, void *data)
+void BM_store_selection(BMesh *bm, void *data)
 {
 	BMEditSelection *ese;
-	if(!BM_check_selection(em, data)){
+	if(!BM_check_selection(bm, data)){
 		ese = (BMEditSelection*) MEM_callocN( sizeof(BMEditSelection), "BMEdit Selection");
 		ese->type = ((BMHeader*)data)->type;
 		ese->data = data;
-		BLI_addtail(&(em->selected),ese);
+		BLI_addtail(&(bm->selected),ese);
 	}
 }
 
-void BM_validate_selections(BMesh *em)
+void BM_validate_selections(BMesh *bm)
 {
 	BMEditSelection *ese, *nextese;
 
-	ese = em->selected.first;
+	ese = bm->selected.first;
 
-	while(ese){
+	while(ese) {
 		nextese = ese->next;
-		if (!BM_TestHFlag(ese->data, BM_SELECT)) BLI_freelinkN(&(em->selected), ese);
+		if (!BM_TestHFlag(ese->data, BM_SELECT)) {
+			BLI_freelinkN(&(bm->selected), ese);
+		}
 		ese = nextese;
 	}
 }
@@ -656,5 +702,3 @@
 			break;
 	}
 }
-
-

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2011-09-13 12:55:21 UTC (rev 40184)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2011-09-13 13:41:20 UTC (rev 40185)
@@ -141,7 +141,6 @@
 struct BMVert *EDBM_get_vert_for_index(struct BMEditMesh *em, int index);
 struct BMEdge *EDBM_get_edge_for_index(struct BMEditMesh *em, int index);
 struct BMFace *EDBM_get_face_for_index(struct BMEditMesh *em, int index);
-struct BMFace *EDBM_get_actFace(struct BMEditMesh *em, int sloppy);
 
 int EDBM_CallAndSelectOpf(struct BMEditMesh *em, struct wmOperator *op, 
 						  const char *selectslot, const char *fmt, ...);
@@ -181,7 +180,6 @@
 void EDBM_deselect_by_material(struct BMEditMesh *em, const short index, const short select);
 
 void EDBM_select_swap(struct BMEditMesh *em); /* exported for UV */
-void EDBM_set_actFace(struct BMEditMesh *em, struct BMFace *efa);
 
 int EDBM_texFaceCheck(struct BMEditMesh *em);
 struct MTexPoly *EDBM_get_active_mtexpoly(struct BMEditMesh *em, struct BMFace **act_efa, int sloppy);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2011-09-13 12:55:21 UTC (rev 40184)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2011-09-13 13:41:20 UTC (rev 40185)
@@ -888,6 +888,9 @@
 	BMW_Init(&walker, bm, walkercode, 0, 0);
 	h = BMW_Begin(&walker, start);
 	for (; h; h=BMW_Step(&walker)) {
+		if (!select) {
+			BM_remove_selection(bm, h);
+		}
 		BM_Select(bm, h, select);
 	}
 	BMW_End(&walker);
@@ -1447,7 +1450,7 @@
 		
 		if(efa) {
 			/* set the last selected face */
-			EDBM_set_actFace(vc.em, efa);
+			BM_set_actFace(vc.em->bm, efa);
 			
 			if(!BM_TestHFlag(efa, BM_SELECT)) {
 				EDBM_store_selection(vc.em, efa);
@@ -2109,37 +2112,6 @@
 	EDBM_select_flush(em, SCE_SELECT_VERTEX);
 }
 
-BMFace *EM_get_actFace(BMEditMesh *em, int sloppy)
-{
-	if (em->bm->act_face) {
-		return em->bm->act_face;
-	} else if (sloppy) {
-		BMIter iter;
-		BMFace *f= NULL;
-		BMEditSelection *ese;
-		
-		/* Find the latest non-hidden face from the BMEditSelection */
-		ese = em->bm->selected.last;
-		for (; ese; ese=ese->prev){
-			if(ese->type == BM_FACE) {
-				f = (BMFace *)ese->data;
-				
-				if (BM_TestHFlag(f, BM_HIDDEN))	f= NULL;
-				else		break;
-			}
-		}
-		/* Last attempt: try to find any selected face */
-		if (f==NULL) {
-			BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
-				if (BM_TestHFlag(f, BM_SELECT))
-					break;
-			}
-		}
-		return f; /* can still be null */
-	}
-	return NULL;
-}
-
 static void deselect_nth_active(BMEditMesh *em, BMVert **v_p, BMEdge **e_p, BMFace **f_p)
 {
 	BMVert *v;
@@ -2186,7 +2158,7 @@
 		}
 	}
 	else if(em->selectmode & SCE_SELECT_FACE) {
-		f= EM_get_actFace(em, 1);
+		f= BM_get_actFace(em->bm, 1);
 		if(f) {
 			*f_p= f;
 			return;

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-13 12:55:21 UTC (rev 40184)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-09-13 13:41:20 UTC (rev 40185)
@@ -2516,8 +2516,8 @@
 
 	s = t = NULL;
 
-	ese = ((EditSelection*)em->selected.last);
-	if(ese && ese->type == EDITVERT && ese->prev && ese->prev->type == EDITVERT){
+	ese = ((BMEditSelection*)em->selected.last);
+	if(ese && ese->type == BM_VERT && ese->prev && ese->prev->type == BM_VERT) {
 		physical= pupmenu("Distance Method? %t|Edge Length%x1|Topological%x0");
 
 		t = (EditVert*)ese->data;

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-09-13 12:55:21 UTC (rev 40184)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-09-13 13:41:20 UTC (rev 40185)
@@ -371,43 +371,6 @@
 	return (tm->face_index && index<tm->bm->totface && index>=0) ? tm->face_index[index] : NULL;
 }
 
-/* this replaces the active flag used in uv/face mode */
-void EDBM_set_actFace(BMEditMesh *em, BMFace *efa)
-{
-	em->bm->act_face = efa;
-}
-
-BMFace *EDBM_get_actFace(BMEditMesh *em, int sloppy)
-{
-	if (em->bm->act_face) {
-		return em->bm->act_face;
-	} else if (sloppy) {
-		BMFace *efa= NULL;
-		BMEditSelection *ese;
-		
-		ese = em->bm->selected.last;
-		for (; ese; ese=ese->prev){
-			if(ese->type == BM_FACE) {
-				efa = (BMFace *)ese->data;
-				
-				if (BM_TestHFlag(efa, BM_HIDDEN)) efa= NULL;
-				else break;
-			}
-		}
-		if (efa==NULL) {
-			BMIter iter;
-			efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL);
-			for ( ; efa; efa=BMIter_Step(&iter)) {
-				if (BM_TestHFlag(efa, BM_SELECT))

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list