[Bf-blender-cvs] [2e26844ef63] soc-2017-normal-tools: Simplify/deduplicate code to 'select' loops from faces/verts selection.

Bastien Montagne noreply at git.blender.org
Wed Feb 28 21:37:07 CET 2018


Commit: 2e26844ef635367522535acc1c7c0c4e1ae22c14
Author: Bastien Montagne
Date:   Wed Feb 28 18:19:54 2018 +0100
Branches: soc-2017-normal-tools
https://developer.blender.org/rB2e26844ef635367522535acc1c7c0c4e1ae22c14

Simplify/deduplicate code to 'select' loops from faces/verts selection.

===================================================================

M	source/blender/bmesh/intern/bmesh_mesh.c

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 8979fc0b089..8e5881bf181 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -1267,10 +1267,35 @@ void BM_lnorspace_err(BMesh *bm)
 }
 #endif
 
+static void bm_loop_normal_mark_indiv_do_loop(
+        BMLoop *l, BLI_bitmap *loops, MLoopNorSpaceArray *lnor_spacearr, int *totloopsel)
+{
+	if (l != NULL) {
+		const int l_idx = BM_elem_index_get(l);
+
+		if (!BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
+			/* If vert and face selected share a loop, mark it for editing. */
+			BLI_BITMAP_ENABLE(loops, l_idx);
+			(*totloopsel)++;
+
+			/* Mark all loops in same loop normal space (aka smooth fan). */
+			if ((lnor_spacearr->lspacearr[l_idx]->flags & MLNOR_SPACE_IS_SINGLE) == 0) {
+				for (LinkNode *node = lnor_spacearr->lspacearr[l_idx]->loops; node; node = node->next) {
+					const int lfan_idx = BM_elem_index_get((BMLoop *)node->link);
+					if (!BLI_BITMAP_TEST(loops, lfan_idx)) {
+						BLI_BITMAP_ENABLE(loops, lfan_idx);
+						(*totloopsel)++;
+					}
+				}
+			}
+		}
+	}
+}
+
 /* Mark the individual clnors to be edited, if multiple selection methods are used. */
 static int bm_loop_normal_mark_indiv(BMesh *bm, BLI_bitmap *loops)
 {
-	BMEditSelection *ese, *vert;
+	BMEditSelection *ese, *ese_prev;
 	int totloopsel = 0;
 
 	BM_mesh_elem_index_ensure(bm, BM_LOOP);
@@ -1281,43 +1306,22 @@ static int bm_loop_normal_mark_indiv(BMesh *bm, BLI_bitmap *loops)
 	/* Goes from last selected to the first selected element. */
 	for (ese = bm->selected.last; ese; ese = ese->prev) {
 		if (ese->htype == BM_FACE) {
-			vert = ese;
+			ese_prev = ese;
 			/* If current face is selected, then any verts to be edited must have been selected before it. */
-			while ((vert = vert->prev)) {
-				if (vert->htype == BM_VERT) {
-					BMLoop *l = BM_face_vert_share_loop((BMFace *)ese->ele, (BMVert *)vert->ele);	
-					if (l && !BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
-						/* If vert and face selected share a loop, mark it for editing. */
-						BLI_BITMAP_ENABLE(loops, BM_elem_index_get(l));
-						totloopsel++;
-					}
+			while ((ese_prev = ese_prev->prev)) {
+				if (ese_prev->htype == BM_VERT) {
+					bm_loop_normal_mark_indiv_do_loop(
+					            BM_face_vert_share_loop((BMFace *)ese->ele, (BMVert *)ese_prev->ele),
+					            loops, bm->lnor_spacearr, &totloopsel);
 				}
-				else if (vert->htype == BM_EDGE) {
-					BMLoop *l = BM_face_vert_share_loop((BMFace *)ese->ele, ((BMEdge *)vert->ele)->v1);
-					if (l && !BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
-						BLI_BITMAP_ENABLE(loops, BM_elem_index_get(l));
-						totloopsel++;
-					}
-					l = BM_face_vert_share_loop((BMFace *)ese->ele, ((BMEdge *)vert->ele)->v2);
-					if (l && !BLI_BITMAP_TEST(loops, BM_elem_index_get(l))) {
-						BLI_BITMAP_ENABLE(loops, BM_elem_index_get(l));
-						totloopsel++;
-					}
-				}
-			}
-		}
-	}
-
-	for (int i = 0; i < bm->totloop; i++) {  /* Mark all loops in a loop normal space. */
-		if (BLI_BITMAP_TEST(loops, i)) {
-			if ((bm->lnor_spacearr->lspacearr[i]->flags & MLNOR_SPACE_IS_SINGLE) == 0) {
-				LinkNode *node = bm->lnor_spacearr->lspacearr[i]->loops;
-				for (; node; node = node->next) {
-					const int l_index = BM_elem_index_get((BMLoop *)node->link);
-					if (!BLI_BITMAP_TEST(loops, l_index)) {
-						BLI_BITMAP_ENABLE(loops, l_index);
-						totloopsel++;
-					}
+				else if (ese_prev->htype == BM_EDGE) {
+					bm_loop_normal_mark_indiv_do_loop(
+					            BM_face_vert_share_loop((BMFace *)ese->ele, ((BMEdge *)ese_prev->ele)->v1),
+					            loops, bm->lnor_spacearr, &totloopsel);
+
+					bm_loop_normal_mark_indiv_do_loop(
+					            BM_face_vert_share_loop((BMFace *)ese->ele, ((BMEdge *)ese_prev->ele)->v2),
+					            loops, bm->lnor_spacearr, &totloopsel);
 				}
 			}
 		}



More information about the Bf-blender-cvs mailing list