[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58175] trunk/blender/source/blender/bmesh /intern: add BM_elem_attrs_copy_ex() which can take a flag arg to define which flags should be copied.

Campbell Barton ideasman42 at gmail.com
Thu Jul 11 14:43:34 CEST 2013


Revision: 58175
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58175
Author:   campbellbarton
Date:     2013-07-11 12:43:34 +0000 (Thu, 11 Jul 2013)
Log Message:
-----------
add BM_elem_attrs_copy_ex() which can take a flag arg to define which flags should be copied. (mainly to be able to avoid copying selection/hidden state)

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.h

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2013-07-11 12:22:29 UTC (rev 58174)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2013-07-11 12:43:34 UTC (rev 58175)
@@ -803,50 +803,65 @@
 }
 
 /* BMESH_TODO: Special handling for hide flags? */
+/* BMESH_TODO: swap src/dst args, everywhere else in bmesh does other way round */
 
 /**
  * Copies attributes, e.g. customdata, header flags, etc, from one element
  * to another of the same type.
  */
-void BM_elem_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, const void *source, void *target)
+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)
 {
-	const BMHeader *sheader = source;
-	BMHeader *theader = target;
+	const BMHeader *ele_src = ele_src_v;
+	BMHeader *ele_dst = ele_dst_v;
 
-	BLI_assert(sheader->htype == theader->htype);
+	BLI_assert(ele_src->htype == ele_dst->htype);
 
-	if (sheader->htype != theader->htype) {
+	if (ele_src->htype != ele_dst->htype) {
 		BLI_assert(!"type mismatch");
 		return;
 	}
 
-	/* First we copy select */
-	if (BM_elem_flag_test((BMElem *)sheader, BM_ELEM_SELECT)) {
-		BM_elem_select_set(target_mesh, (BMElem *)target, true);
+	if ((hflag_mask & BM_ELEM_SELECT) == 0) {
+		/* First we copy select */
+		if (BM_elem_flag_test((BMElem *)ele_src, BM_ELEM_SELECT)) {
+			BM_elem_select_set(bm_dst, (BMElem *)ele_dst, true);
+		}
 	}
-	
+
 	/* Now we copy flags */
-	theader->hflag = sheader->hflag;
-	
+	if (hflag_mask == 0) {
+		ele_dst->hflag = ele_src->hflag;
+	}
+	else {
+		ele_dst->hflag = ((ele_dst->hflag & hflag_mask) | (ele_src->hflag & ~hflag_mask));
+	}
+
 	/* Copy specific attributes */
-	switch (theader->htype) {
+	switch (ele_dst->htype) {
 		case BM_VERT:
-			bm_vert_attrs_copy(source_mesh, target_mesh, (const BMVert *)source, (BMVert *)target);
+			bm_vert_attrs_copy(bm_src, bm_dst, (const BMVert *)ele_src, (BMVert *)ele_dst);
 			break;
 		case BM_EDGE:
-			bm_edge_attrs_copy(source_mesh, target_mesh, (const BMEdge *)source, (BMEdge *)target);
+			bm_edge_attrs_copy(bm_src, bm_dst, (const BMEdge *)ele_src, (BMEdge *)ele_dst);
 			break;
 		case BM_LOOP:
-			bm_loop_attrs_copy(source_mesh, target_mesh, (const BMLoop *)source, (BMLoop *)target);
+			bm_loop_attrs_copy(bm_src, bm_dst, (const BMLoop *)ele_src, (BMLoop *)ele_dst);
 			break;
 		case BM_FACE:
-			bm_face_attrs_copy(source_mesh, target_mesh, (const BMFace *)source, (BMFace *)target);
+			bm_face_attrs_copy(bm_src, bm_dst, (const BMFace *)ele_src, (BMFace *)ele_dst);
 			break;
 		default:
 			BLI_assert(0);
 	}
 }
 
+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);
+}
+
 /* helper function for 'BM_mesh_copy' */
 static BMFace *bm_mesh_copy_new_face(BMesh *bm_new, BMesh *bm_old,
                                      BMVert **vtable, BMEdge **etable,

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.h	2013-07-11 12:22:29 UTC (rev 58174)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.h	2013-07-11 12:43:34 UTC (rev 58175)
@@ -50,7 +50,9 @@
 
 void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type);
 
-void BM_elem_attrs_copy(BMesh *source_mesh, BMesh *target_mesh, const void *source, void *target);
+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_mesh_copy_init_customdata(BMesh *bm_dst, BMesh *bm_src, const struct BMAllocTemplate *allocsize);
 BMesh *BM_mesh_copy(BMesh *bm_old);




More information about the Bf-blender-cvs mailing list