[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58580] trunk/blender/source/blender: internal bmesh api change: BM_elem_attrs_copy() no longer copies the selection flag.

Campbell Barton ideasman42 at gmail.com
Wed Jul 24 21:31:59 CEST 2013


Revision: 58580
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58580
Author:   campbellbarton
Date:     2013-07-24 19:31:58 +0000 (Wed, 24 Jul 2013)
Log Message:
-----------
internal bmesh api change: BM_elem_attrs_copy() no longer copies the selection flag.
this was slowing down modifiers since the selection flags would be copied and flushed to connected geometry.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.h
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.h
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/editors/mesh/editmesh_knife.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2013-07-24 18:38:55 UTC (rev 58579)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2013-07-24 19:31:58 UTC (rev 58580)
@@ -817,11 +817,6 @@
 
 	BLI_assert(ele_src->htype == ele_dst->htype);
 
-	if (ele_src->htype != ele_dst->htype) {
-		BLI_assert(!"type mismatch");
-		return;
-	}
-
 	if ((hflag_mask & BM_ELEM_SELECT) == 0) {
 		/* First we copy select */
 		if (BM_elem_flag_test((BMElem *)ele_src, BM_ELEM_SELECT)) {
@@ -833,6 +828,9 @@
 	if (hflag_mask == 0) {
 		ele_dst->hflag = ele_src->hflag;
 	}
+	else if (hflag_mask == 0xff) {
+		/* pass */
+	}
 	else {
 		ele_dst->hflag = ((ele_dst->hflag & hflag_mask) | (ele_src->hflag & ~hflag_mask));
 	}
@@ -860,9 +858,21 @@
 void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src, void *ele_dst)
 {
 	/* BMESH_TODO, default 'use_flags' to false */
-	BM_elem_attrs_copy_ex(bm_src, bm_dst, ele_src, ele_dst, 0);
+	BM_elem_attrs_copy_ex(bm_src, bm_dst, ele_src, ele_dst, BM_ELEM_SELECT);
 }
 
+void BM_elem_select_copy(BMesh *UNUSED(bm_src), BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v)
+{
+	const BMHeader *ele_src = ele_src_v;
+	BMHeader *ele_dst = ele_dst_v;
+
+	BLI_assert(ele_src->htype == ele_dst->htype);
+
+	if ((ele_src->hflag & BM_ELEM_SELECT) != (ele_dst->hflag & BM_ELEM_SELECT)) {
+		BM_elem_select_set(bm_dst, (BMElem *)ele_dst, (ele_src->hflag & BM_ELEM_SELECT) != 0);
+	}
+}
+
 /* helper function for 'BM_mesh_copy' */
 static BMFace *bm_mesh_copy_new_face(BMesh *bm_new, BMesh *bm_old,
                                      BMVert **vtable, BMEdge **etable,
@@ -894,7 +904,8 @@
 	/* use totface in case adding some faces fails */
 	BM_elem_index_set(f_new, (bm_new->totface - 1)); /* set_inline */
 
-	BM_elem_attrs_copy(bm_old, bm_new, f, f_new);
+	BM_elem_attrs_copy_ex(bm_old, bm_new, f, f_new, 0xff);
+	f_new->head.hflag = f->head.hflag;  /* low level! don't do this for normal api use */
 
 	j = 0;
 	l_iter = l_first = BM_FACE_FIRST_LOOP(f_new);
@@ -951,7 +962,8 @@
 	BM_ITER_MESH_INDEX (v, &iter, bm_old, BM_VERTS_OF_MESH, i) {
 		/* copy between meshes so cant use 'example' argument */
 		v_new = BM_vert_create(bm_new, v->co, NULL, BM_CREATE_SKIP_CD);
-		BM_elem_attrs_copy(bm_old, bm_new, v, v_new);
+		BM_elem_attrs_copy_ex(bm_old, bm_new, v, v_new, 0xff);
+		v_new->head.hflag = v->head.hflag;  /* low level! don't do this for normal api use */
 		vtable[i] = v_new;
 		BM_elem_index_set(v, i); /* set_inline */
 		BM_elem_index_set(v_new, i); /* set_inline */
@@ -968,7 +980,8 @@
 		                       vtable[BM_elem_index_get(e->v2)],
 		                       e, BM_CREATE_SKIP_CD);
 
-		BM_elem_attrs_copy(bm_old, bm_new, e, e_new);
+		BM_elem_attrs_copy_ex(bm_old, bm_new, e, e_new, 0xff);
+		e_new->head.hflag = e->head.hflag;  /* low level! don't do this for normal api use */
 		etable[i] = e_new;
 		BM_elem_index_set(e, i); /* set_inline */
 		BM_elem_index_set(e_new, i); /* set_inline */
@@ -991,6 +1004,12 @@
 	bm_old->elem_index_dirty &= ~BM_FACE;
 	bm_new->elem_index_dirty &= ~BM_FACE;
 
+
+	/* low level! don't do this for normal api use */
+	bm_new->totvertsel = bm_old->totvertsel;
+	bm_new->totedgesel = bm_old->totedgesel;
+	bm_new->totfacesel = bm_old->totfacesel;
+
 	/* safety check */
 	BLI_assert(i == bm_old->totface);
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.h	2013-07-24 18:38:55 UTC (rev 58579)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.h	2013-07-24 19:31:58 UTC (rev 58580)
@@ -53,6 +53,7 @@
 void BM_elem_attrs_copy_ex(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v,
                            const char hflag_mask);
 void BM_elem_attrs_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v);
+void BM_elem_select_copy(BMesh *bm_src, BMesh *bm_dst, const void *ele_src_v, void *ele_dst_v);
 
 void   BM_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const struct BMAllocTemplate *allocsize);
 BMesh *BM_mesh_copy(BMesh *bm_old);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.h	2013-07-24 18:38:55 UTC (rev 58579)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.h	2013-07-24 19:31:58 UTC (rev 58580)
@@ -49,9 +49,9 @@
 };
 
 enum {
+	SUBDIV_SELECT_NONE,
 	SUBDIV_SELECT_ORIG,
 	SUBDIV_SELECT_INNER,
-	SUBDIV_SELECT_INNER_SEL,
 	SUBDIV_SELECT_LOOPCUT
 };
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c	2013-07-24 18:38:55 UTC (rev 58579)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c	2013-07-24 19:31:58 UTC (rev 58580)
@@ -1203,26 +1203,24 @@
 	
 	BMO_op_exec(bm, &op);
 	
-	if (seltype == SUBDIV_SELECT_INNER) {
-		BMOIter iter;
-		BMElem *ele;
-
-		for (ele = BMO_iter_new(&iter, op.slots_out, "geom_inner.out", BM_EDGE | BM_VERT); ele; ele = BMO_iter_step(&iter)) {
-			BM_elem_select_set(bm, ele, true);
-		}
+	switch (seltype) {
+		case SUBDIV_SELECT_NONE:
+			break;
+		case SUBDIV_SELECT_ORIG:
+			/* set the newly created data to be selected */
+			BMO_slot_buffer_hflag_enable(bm, op.slots_out, "geom_inner.out", BM_ALL_NOLOOP, BM_ELEM_SELECT, true);
+			BM_mesh_select_flush(bm);
+			break;
+		case SUBDIV_SELECT_INNER:
+			BMO_slot_buffer_hflag_enable(bm, op.slots_out, "geom_inner.out", BM_EDGE | BM_VERT, BM_ELEM_SELECT, true);
+			break;
+		case SUBDIV_SELECT_LOOPCUT:
+			/* deselect input */
+			BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false);
+			BMO_slot_buffer_hflag_enable(bm, op.slots_out, "geom_inner.out", BM_EDGE, BM_ELEM_SELECT, true);
+			break;
 	}
-	else if (seltype == SUBDIV_SELECT_LOOPCUT) {
-		BMOIter iter;
-		BMElem *ele;
-		
-		/* deselect input */
-		BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false);
 
-		for (ele = BMO_iter_new(&iter, op.slots_out, "geom_inner.out", BM_EDGE); ele; ele = BMO_iter_step(&iter)) {
-			BM_edge_select_set(bm, (BMEdge *)ele, true);
-		}
-	}
-
 	BMO_op_finish(bm, &op);
 }
 

Modified: trunk/blender/source/blender/editors/mesh/editmesh_knife.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_knife.c	2013-07-24 18:38:55 UTC (rev 58579)
+++ trunk/blender/source/blender/editors/mesh/editmesh_knife.c	2013-07-24 19:31:58 UTC (rev 58580)
@@ -2623,15 +2623,15 @@
 
 /* Split face f with KnifeEdges on chain.  f remains as one side, the face formed is put in *newface.
  * The new face will be on the left side of the chain as viewed from the normal-out side of f. */
-static void knife_make_chain_cut(KnifeTool_OpData *kcd, BMFace *f, ListBase *chain, BMFace **newface)
+static void knife_make_chain_cut(KnifeTool_OpData *kcd, BMFace *f, ListBase *chain, BMFace **r_f_new)
 {
 	BMesh *bm = kcd->em->bm;
 	KnifeEdge *kfe, *kfelast;
 	BMVert *v1, *v2;
-	BMFace *fnew;
+	BMFace *f_new;
 	Ref *ref;
 	KnifeVert *kfv, *kfvprev;
-	BMLoop *lnew, *l_iter;
+	BMLoop *l_new, *l_iter;
 	int i;
 	int nco = BLI_countlist(chain) - 1;
 	float (*cos)[3] = BLI_array_alloca(cos, nco);
@@ -2652,23 +2652,21 @@
 		kfvprev = kfv;
 	}
 	BLI_assert(i == nco);
-	lnew = NULL;
+	l_new = NULL;
 	if (nco == 0) {
 		/* Want to prevent creating two-sided polygons */
 		if (BM_edge_exists(v1, v2)) {
-			*newface = NULL;
+			f_new = NULL;
 		}
 		else {
-			*newface = BM_face_split(bm, f, v1, v2, &lnew, NULL, true);
+			f_new = BM_face_split(bm, f, v1, v2, &l_new, NULL, true);
 		}
 	}
 	else {
-		fnew = BM_face_split_n(bm, f, v1, v2, cos, nco, &lnew, NULL);
-		*newface = fnew;
-
-		if (fnew) {
+		f_new = BM_face_split_n(bm, f, v1, v2, cos, nco, &l_new, NULL);
+		if (f_new) {
 			/* Now go through lnew chain matching up chain kv's and assign real v's to them */
-			for (l_iter = lnew->next, i = 0; i < nco; l_iter = l_iter->next, i++) {
+			for (l_iter = l_new->next, i = 0; i < nco; l_iter = l_iter->next, i++) {
 				BLI_assert(equals_v3v3(cos[i], l_iter->v->co));
 				if (kcd->select_result) {
 					BM_edge_select_set(bm, l_iter->e, true);
@@ -2680,10 +2678,15 @@
 
 	/* the select chain above doesnt account for the first loop */
 	if (kcd->select_result) {
-		if (lnew) {
-			BM_edge_select_set(bm, lnew->e, true);
+		if (l_new) {
+			BM_edge_select_set(bm, l_new->e, true);
 		}
 	}
+	else {
+		BM_elem_select_copy(bm, bm, f, f_new);
+	}
+
+	*r_f_new = f_new;
 }
 
 static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMFace *f, ListBase *kfedges)
@@ -2887,6 +2890,7 @@
 	knife_make_cuts(kcd);
 #endif
 
+	EDBM_selectmode_flush(kcd->em);
 	EDBM_mesh_normals_update(kcd->em);
 	EDBM_update_generic(kcd->em, true, true);
 }




More information about the Bf-blender-cvs mailing list