[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59095] trunk/blender/source/blender: fix own regression, rip tool wasn't handling selection.

Campbell Barton ideasman42 at gmail.com
Tue Aug 13 03:00:08 CEST 2013


Revision: 59095
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59095
Author:   campbellbarton
Date:     2013-08-13 01:00:07 +0000 (Tue, 13 Aug 2013)
Log Message:
-----------
fix own regression, rip tool wasn't handling selection.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_core.c
    trunk/blender/source/blender/bmesh/intern/bmesh_core.h
    trunk/blender/source/blender/bmesh/operators/bmo_inset.c
    trunk/blender/source/blender/bmesh/operators/bmo_split_edges.c
    trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c
    trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.h
    trunk/blender/source/blender/editors/mesh/editmesh_rip.c
    trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2013-08-13 01:00:07 UTC (rev 59095)
@@ -1915,7 +1915,8 @@
  *
  * \return Success
  */
-void bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
+void bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
+                         const bool copy_select)
 {
 	const int v_edgetot = BM_vert_face_count(v);
 	BMEdge **stack = BLI_array_alloca(stack, v_edgetot);
@@ -1970,6 +1971,9 @@
 	verts[0] = v;
 	for (i = 1; i < maxindex; i++) {
 		verts[i] = BM_vert_create(bm, v->co, v, 0);
+		if (copy_select) {
+			BM_elem_select_copy(bm, bm, verts[i], v);
+		}
 	}
 
 	/* Replace v with the new verts in each group */
@@ -2052,11 +2056,11 @@
 	for (i = 0; i < e_in_len; i++) {
 		BMEdge *e = e_in[i];
 		if (e->l && BM_vert_in_edge(e, v)) {
-			bmesh_edge_separate(bm, e, e->l);
+			bmesh_edge_separate(bm, e, e->l, false);
 		}
 	}
 
-	bmesh_vert_separate(bm, v, r_vout, r_vout_len);
+	bmesh_vert_separate(bm, v, r_vout, r_vout_len, false);
 }
 
 /**
@@ -2112,7 +2116,8 @@
  * \note Does nothing if \a l_sep is already the only loop in the
  * edge radial.
  */
-void bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep)
+void bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep,
+                         const bool copy_select)
 {
 	BMEdge *e_new;
 #ifndef NDEBUG
@@ -2136,6 +2141,10 @@
 	bmesh_radial_append(e_new, l_sep);
 	l_sep->e = e_new;
 
+	if (copy_select) {
+		BM_elem_select_copy(bm, bm, e_new, e);
+	}
+
 	BLI_assert(bmesh_radial_length(e->l) == radlen - 1);
 	BLI_assert(bmesh_radial_length(e_new->l) == 1);
 
@@ -2159,8 +2168,8 @@
 
 	/* peel the face from the edge radials on both sides of the
 	 * loop vert, disconnecting the face from its fan */
-	bmesh_edge_separate(bm, l_sep->e, l_sep);
-	bmesh_edge_separate(bm, l_sep->prev->e, l_sep->prev);
+	bmesh_edge_separate(bm, l_sep->e, l_sep, false);
+	bmesh_edge_separate(bm, l_sep->prev->e, l_sep->prev, false);
 
 	if (bmesh_disk_count(v_sep) == 2) {
 		/* If there are still only two edges out of v_sep, then
@@ -2178,7 +2187,7 @@
 
 	/* Split all fans connected to the vert, duplicating it for
 	 * each fans. */
-	bmesh_vert_separate(bm, v_sep, &vtar, &len);
+	bmesh_vert_separate(bm, v_sep, &vtar, &len, false);
 
 	/* There should have been at least two fans cut apart here,
 	 * otherwise the early exit would have kicked in. */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.h	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.h	2013-08-13 01:00:07 UTC (rev 59095)
@@ -50,11 +50,13 @@
 void    BM_edge_kill(BMesh *bm, BMEdge *e);
 void    BM_vert_kill(BMesh *bm, BMVert *v);
 
-void    bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep);
+void    bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep,
+                            const bool copy_select);
 bool    BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *e_target);
 bool    BM_vert_splice(BMesh *bm, BMVert *v, BMVert *v_target);
 
-void    bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len);
+void    bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len,
+                            const bool copy_select);
 
 bool    bmesh_loop_reverse(BMesh *bm, BMFace *f);
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_inset.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_inset.c	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/bmesh/operators/bmo_inset.c	2013-08-13 01:00:07 UTC (rev 59095)
@@ -457,7 +457,7 @@
 
 
 		/* run the separate arg */
-		bmesh_edge_separate(bm, es->e_old, es->l);
+		bmesh_edge_separate(bm, es->e_old, es->l, false);
 
 		/* calc edge-split info */
 		es->e_new = es->l->e;
@@ -535,7 +535,7 @@
 				/* disable touching twice, this _will_ happen if the flags not disabled */
 				BM_elem_flag_disable(v, BM_ELEM_TAG);
 
-				bmesh_vert_separate(bm, v, &vout, &r_vout_len);
+				bmesh_vert_separate(bm, v, &vout, &r_vout_len, false);
 				v = NULL; /* don't use again */
 
 				/* in some cases the edge doesn't split off */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_split_edges.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_split_edges.c	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/bmesh/operators/bmo_split_edges.c	2013-08-13 01:00:07 UTC (rev 59095)
@@ -48,7 +48,7 @@
 	}
 
 	/* this is where everything happens */
-	BM_mesh_edgesplit(bm, use_verts, true);
+	BM_mesh_edgesplit(bm, use_verts, true, false);
 
 	BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_INTERNAL_TAG);
 }

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.c	2013-08-13 01:00:07 UTC (rev 59095)
@@ -98,7 +98,7 @@
 	MEM_freeN(vtouch);
 }
 
-void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only)
+void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, const bool copy_select)
 {
 	BMIter iter;
 	BMEdge *e;
@@ -136,7 +136,7 @@
 
 			/* keep splitting until each loop has its own edge */
 			do {
-				bmesh_edge_separate(bm, e, e->l);
+				bmesh_edge_separate(bm, e, e->l, copy_select);
 			} while (!BM_edge_is_boundary(e));
 
 			BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
@@ -159,11 +159,11 @@
 		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);
+				bmesh_vert_separate(bm, e->v1, 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);
+				bmesh_vert_separate(bm, e->v2, NULL, NULL, copy_select);
 			}
 		}
 	}

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.h	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_edgesplit.h	2013-08-13 01:00:07 UTC (rev 59095)
@@ -27,6 +27,6 @@
  *  \ingroup bmesh
  */
 
-void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only);
+void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, const bool copy_select);
 
 #endif /* __BMESH_EDGESPLIT_H__ */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_rip.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_rip.c	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/editors/mesh/editmesh_rip.c	2013-08-13 01:00:07 UTC (rev 59095)
@@ -50,6 +50,8 @@
 #include "ED_transform.h"
 #include "ED_view3d.h"
 
+#include "tools/bmesh_edgesplit.h"
+
 #include "mesh_intern.h"  /* own include */
 
 /**
@@ -510,24 +512,6 @@
 
 /* --- end 'face-fill' code --- */
 
-
-static bool edbm_rip_call_edgesplit(BMEditMesh *em, wmOperator *op)
-{
-	BMOperator bmop;
-
-	if (!EDBM_op_init(em, &bmop, op, "split_edges edges=%he verts=%hv use_verts=%b",
-	                  BM_ELEM_TAG, BM_ELEM_SELECT, true))
-	{
-		return false;
-	}
-	BMO_op_exec(em->bm, &bmop);
-	if (!EDBM_op_finish(em, &bmop, op, true)) {
-		return false;
-	}
-
-	return true;
-}
-
 /**
  * This is the main vert ripping function (rip when one vertex is selected)
  */
@@ -648,7 +632,7 @@
 
 		BM_vert_select_set(bm, v, false);
 
-		bmesh_vert_separate(bm, v, &vout, &vout_len);
+		bmesh_vert_separate(bm, v, &vout, &vout_len, true);
 
 		if (vout_len < 2) {
 			MEM_freeN(vout);
@@ -784,10 +768,7 @@
 			fill_uloop_pairs = edbm_tagged_loop_pairs_to_fill(bm);
 		}
 
-		if (!edbm_rip_call_edgesplit(em, op)) {
-			if (fill_uloop_pairs) MEM_freeN(fill_uloop_pairs);
-			return OPERATOR_CANCELLED;
-		}
+		BM_mesh_edgesplit(em->bm, true, true, true);
 	}
 
 	dist = FLT_MAX;
@@ -949,10 +930,7 @@
 		fill_uloop_pairs = edbm_tagged_loop_pairs_to_fill(bm);
 	}
 
-	if (!edbm_rip_call_edgesplit(em, op)) {
-		if (fill_uloop_pairs) MEM_freeN(fill_uloop_pairs);
-		return OPERATOR_CANCELLED;
-	}
+	BM_mesh_edgesplit(em->bm, true, true, true);
 
 	/* note: the output of the bmesh operator is ignored, since we built
 	 * the contiguous loop pairs to split already, its possible that some

Modified: trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2013-08-13 00:35:23 UTC (rev 59094)
+++ trunk/blender/source/blender/modifiers/intern/MOD_edgesplit.c	2013-08-13 01:00:07 UTC (rev 59095)
@@ -91,7 +91,7 @@
 		}
 	}
 	
-	BM_mesh_edgesplit(bm, FALSE, TRUE);
+	BM_mesh_edgesplit(bm, false, true, false);
 
 	/* BM_mesh_validate(bm); */ /* for troubleshooting */
 




More information about the Bf-blender-cvs mailing list