[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59909] branches/ soc-2013-meshdata_transfer/source/blender: code rewrite: re-adding transfer by index for vertex colors and UVs

Walid Shouman eng.walidshouman at gmail.com
Sat Sep 7 07:59:05 CEST 2013


Revision: 59909
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59909
Author:   walid
Date:     2013-09-07 05:59:05 +0000 (Sat, 07 Sep 2013)
Log Message:
-----------
code rewrite: re-adding transfer by index for vertex colors and UVs

Modified Paths:
--------------
    branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
    branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c

Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-09-07 04:35:26 UTC (rev 59908)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-09-07 05:59:05 UTC (rev 59909)
@@ -100,7 +100,7 @@
                                       CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
                                       const int layer_type, const struct ReplaceLayerInfo *UNUSED_replace_info);
 
-static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char itype, const int layer_type,
+static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
                          const struct ReplaceLayerInfo *replace_info);
 
 bool BM_mesh_multi_layer_copy2(BMesh *bm_src, BMesh *bm_dst, const struct ReplaceLayerInfo *replace_info,
@@ -147,12 +147,13 @@
 	if(transfer_mode == TRANSFER_BY_INDEX) {
 		switch (type) {
 			case CD_SHAPEKEY:
+			case CD_MDEFORMVERT:
 				BM_mesh_aligned_transfer(bm_src, bm_dst, BM_VERTS_OF_MESH, CD_SHAPEKEY, replace_info);
 				break;
 
-			case CD_MDEFORMVERT:
-				BM_mesh_aligned_transfer(bm_src, bm_dst, BM_VERTS_OF_MESH, CD_MDEFORMVERT, replace_info);
-				break;
+			case CD_MLOOPCOL:
+			case CD_MLOOPUV:
+				BM_mesh_aligned_transfer(bm_src, bm_dst, BM_LOOP, type, replace_info);
 		}
 	}
 
@@ -397,30 +398,71 @@
 	}
 }
 
-static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char itype, const int layer_type,
+static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
                                      const struct ReplaceLayerInfo *replace_info)
 {
 	int array_dst_len;
 	int array_src_len;
 
-	BMElem **array_src = BM_iter_as_arrayN(bm_src, itype, NULL, &array_src_len, NULL, 0);
-	BMElem **array_dst = BM_iter_as_arrayN(bm_dst, itype, NULL, &array_dst_len, NULL, 0);
+	BMElem **array_src;
+	BMElem **array_dst;
 
 	CustomData *cd_dst;
 	CustomData *cd_src;
 
+	int b;					//counter
+	BMFace *f;
+	BMLoop *l;
+	BMIter fiter, liter;
+
+	switch (htype) {
+		case BM_VERT:
+			array_src = BM_iter_as_arrayN(bm_src, BM_VERTS_OF_MESH, NULL, &array_src_len, NULL, 0);
+			array_dst = BM_iter_as_arrayN(bm_dst, BM_VERTS_OF_MESH, NULL, &array_dst_len, NULL, 0);
+			break;
+
+		case BM_LOOP:
+			array_src_len = bm_src->totloop;
+			array_dst_len = bm_dst->totloop;
+			array_src = MEM_mallocN(sizeof(*array_src) * array_src_len, "array_src bmesh_data_transfer.c");
+            array_dst = MEM_mallocN(sizeof(*array_dst) * array_dst_len, "array_dst bmesh_data_transfer.c");
+			b = 0;
+			BM_ITER_MESH (f, &fiter, bm_src, BM_FACES_OF_MESH) {
+				BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+					array_src[b] = (BMElem*) l;
+					b++;
+				}
+			}
+
+			b = 0;
+			BM_ITER_MESH (f, &fiter, bm_dst, BM_FACES_OF_MESH) {
+				BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+					array_dst[b] = (BMElem*) l;
+					b++;
+				}
+			}
+
+			break;
+	}
+
+
 	/* this could be its own function even */
-	switch (itype) {
-		case BM_VERTS_OF_MESH:
+	switch (htype) {
+		case BM_VERT:
 			cd_src = &bm_src->vdata;
 			cd_dst = &bm_dst->vdata;
 			break;
 
-		case BM_EDGES_OF_MESH:
+		case BM_EDGE:
 			cd_src = &bm_src->edata;
 			cd_dst = &bm_dst->edata;
 			break;
 
+		case BM_LOOP:
+			cd_src = &bm_src->ldata;
+			cd_dst = &bm_dst->ldata;
+			break;
+
 			///should the pdata be associated to the FACES_OF_MESH?
 	}
 

Modified: branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c	2013-09-07 04:35:26 UTC (rev 59908)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c	2013-09-07 05:59:05 UTC (rev 59909)
@@ -648,6 +648,10 @@
 		return false;
 	}
 
+	if(!BM_mesh_data_copy2(bm_src, bm_dst, &replace_info, CD_MLOOPUV)) {
+		return false;
+	}
+
 	//transfer the BMesh back to Mesh
 	BM_mesh_bm_to_me(bm_src, me_src, FALSE);
 	BM_mesh_bm_to_me(bm_dst, me_dst, TRUE);
@@ -904,6 +908,10 @@
 		return false;
 	}
 
+	if(!BM_mesh_data_copy2(bm_src, bm_dst, &replace_info, CD_MLOOPCOL)) {
+		return false;
+	}
+
 	//transfer the BMesh back to Mesh
 	BM_mesh_bm_to_me(bm_src, me_src, FALSE);
 	BM_mesh_bm_to_me(bm_dst, me_dst, TRUE);




More information about the Bf-blender-cvs mailing list