[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59133] trunk/blender/source/blender: fix bug with editmesh rip, active edge could be left on the unselected side of the edge loops.

Campbell Barton ideasman42 at gmail.com
Wed Aug 14 11:14:33 CEST 2013


Revision: 59133
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59133
Author:   campbellbarton
Date:     2013-08-14 09:14:33 +0000 (Wed, 14 Aug 2013)
Log Message:
-----------
fix bug with editmesh rip, active edge could be left on the unselected side of the edge loops.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c
    trunk/blender/source/blender/editors/mesh/editmesh_rip.c

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c	2013-08-14 09:13:11 UTC (rev 59132)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c	2013-08-14 09:14:33 UTC (rev 59133)
@@ -103,7 +103,22 @@
 	BMIter iter;
 	BMEdge *e;
 
+	bool use_ese = false;
+	GHash *ese_gh = NULL;
 
+	if (copy_select && bm->selected.first) {
+		BMEditSelection *ese;
+
+		ese_gh = BLI_ghash_ptr_new(__func__);
+		for (ese = bm->selected.first; ese; ese = ese->next) {
+			if (ese->htype != BM_FACE) {
+				BLI_ghash_insert(ese_gh, ese->ele, ese);
+			}
+		}
+
+		use_ese = true;
+	}
+
 	if (tag_only == false) {
 		BM_mesh_elem_hflag_enable_all(bm, BM_EDGE | (use_verts ? BM_VERT : 0), BM_ELEM_TAG, false);
 	}
@@ -135,10 +150,19 @@
 			BM_elem_flag_enable(e, BM_ELEM_INTERNAL_TAG);
 
 			/* keep splitting until each loop has its own edge */
-			do {
-				bmesh_edge_separate(bm, e, e->l, copy_select);
-			} while (!BM_edge_is_boundary(e));
+			while (!BM_edge_is_boundary(e)) {
+				BMLoop *l_sep = e->l;
+				bmesh_edge_separate(bm, e, l_sep, copy_select);
+				BLI_assert(l_sep->e != e);
 
+				if (use_ese) {
+					BMEditSelection *ese = BLI_ghash_lookup(ese_gh, e);
+					if (UNLIKELY(ese)) {
+						BM_select_history_store_after_notest(bm, ese, l_sep->e);
+					}
+				}
+			}
+
 			BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
 			BM_elem_flag_enable(e->v2, BM_ELEM_TAG);
 		}
@@ -157,14 +181,39 @@
 
 	BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
 		if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
-			if (BM_elem_flag_test(e->v1, BM_ELEM_TAG)) {
-				BM_elem_flag_disable(e->v1, BM_ELEM_TAG);
-				bmesh_vert_separate(bm, e->v1, NULL, NULL, copy_select);
+			unsigned int i;
+			for (i = 0; i < 2; i++) {
+				BMVert *v = ((&e->v1)[i]);
+				if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+					BM_elem_flag_disable(v, BM_ELEM_TAG);
+
+					if (use_ese) {
+						BMVert **vtar;
+						int vtar_len;
+
+						bmesh_vert_separate(bm, v, &vtar, &vtar_len, copy_select);
+
+						if (vtar_len) {
+							BMEditSelection *ese = BLI_ghash_lookup(ese_gh, v);
+							if (UNLIKELY(ese)) {
+								int j;
+								for (j = 0; j < vtar_len; j++) {
+									BLI_assert(v != vtar[j]);
+									BM_select_history_store_after_notest(bm, ese, vtar[j]);
+								}
+							}
+						}
+						MEM_freeN(vtar);
+					}
+					else {
+						bmesh_vert_separate(bm, v, NULL, NULL, copy_select);
+					}
+				}
 			}
-			if (BM_elem_flag_test(e->v2, BM_ELEM_TAG)) {
-				BM_elem_flag_disable(e->v2, BM_ELEM_TAG);
-				bmesh_vert_separate(bm, e->v2, NULL, NULL, copy_select);
-			}
 		}
 	}
+
+	if (use_ese) {
+		BLI_ghash_free(ese_gh, NULL, NULL);
+	}
 }

Modified: trunk/blender/source/blender/editors/mesh/editmesh_rip.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_rip.c	2013-08-14 09:13:11 UTC (rev 59132)
+++ trunk/blender/source/blender/editors/mesh/editmesh_rip.c	2013-08-14 09:14:33 UTC (rev 59133)
@@ -952,6 +952,8 @@
 		return OPERATOR_CANCELLED;
 	}
 
+	BM_select_history_validate(bm);
+
 	return OPERATOR_FINISHED;
 }
 




More information about the Bf-blender-cvs mailing list