[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59535] branches/ soc-2013-meshdata_transfer/source/blender: code rewrite: re-adding transfer by index for vertex group and shapekeys to be achieved using BM_mesh_cd_array_transfer and BM_mesh_aligned_transfer

Walid Shouman eng.walidshouman at gmail.com
Mon Aug 26 22:29:37 CEST 2013


Revision: 59535
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59535
Author:   walid
Date:     2013-08-26 20:29:36 +0000 (Mon, 26 Aug 2013)
Log Message:
-----------
code rewrite: re-adding transfer by index for vertex group and shapekeys to be achieved using BM_mesh_cd_array_transfer and BM_mesh_aligned_transfer

Modified Paths:
--------------
    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.h
    branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c
    branches/soc-2013-meshdata_transfer/source/blender/editors/object/object_shapekey.c
    branches/soc-2013-meshdata_transfer/source/blender/editors/object/object_vgroup.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-08-26 20:23:26 UTC (rev 59534)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c	2013-08-26 20:29:36 UTC (rev 59535)
@@ -22,10 +22,10 @@
 #include "BKE_deform.h"
 
 //stub!! shall be rewired to the main function after the rewrite
-bool BM_mesh_data_copy(BMesh *UNUSED(bm_src), BMesh* UNUSED(bm_dst), int UNUSED(type), const struct ReplaceLayerInfo UNUSED(replace_info), bool UNUSED(relative_to_target),
+bool BM_mesh_data_copy(BMesh *UNUSED(bm_src), BMesh* UNUSED(bm_dst), int UNUSED(type), const struct ReplaceLayerInfo *UNUSED(replace_info), bool UNUSED(relative_to_target),
                   float UNUSED(tmp_mat[4][4]), bool UNUSED(use_tolerance), float UNUSED(tolerance))
 {
-	return false;
+	return true;
 }
 
 //******************
@@ -96,17 +96,23 @@
 	BMVert *v_dst;
 } BMVert_match;
 
-bool BM_mesh_data_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo *replace_info, int type);
+static void BM_mesh_cd_array_transfer(const CustomData *cd_src, BMElem **array_src, int array_src_count,
+                                      const CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
+                                      const int layer_type, const struct ReplaceLayerInfo *replace_info);
+
+static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char itype, 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,
                                TransferMode transfer_mode, int type, void *match_table);
 bool BM_mesh_data_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo *replace_info, int type)
 {
 
-	BMFace *f_src, *f_dst;
+/*	BMFace *f_src, *f_dst;
 	BMVert *v_src, *v_dst;
 	BMIter fiter, UNUSED(liter), iter;
 	int a;
-
+*/
 	//stub
 	TransferMode transfer_mode = TRANSFER_BY_INDEX;
 
@@ -139,83 +145,15 @@
 	//		V
 
 	if(transfer_mode == TRANSFER_BY_INDEX) {
-		BMVert_match *v_match_table = MEM_mallocN(sizeof(*v_match_table) * bm_dst->totvert,
-		                                          "v_match_table bmesh_data_transfer.c");
-		BMFace_match *f_match_table = MEM_mallocN(sizeof(*f_match_table) * bm_dst->totface,
-		                                          "f_match_table bmesh_data_transfer.c");
-	//+-----------------+
-	//|	sub_Block 3.0.1	|	//get each loop's/vert's value
-	//+-----------------+
-
-		//match loops
-		for (f_dst = BM_iter_new(&fiter, bm_dst, BM_FACES_OF_MESH, NULL),
-		     f_src = BM_iter_new(&fiter, bm_src, BM_FACES_OF_MESH, NULL); f_dst;
-		     f_dst = BM_iter_step(&fiter), f_src = BM_iter_step(&fiter)) {
-
-			int index = f_dst->head.index;
-			int l_num = f_dst->len;
-			BMLoop **l_src_grp = MEM_mallocN(l_num, "l_src_grp bmesh_data_transfer.c");
-			BMLoop **l_dst_grp = MEM_mallocN(l_num, "l_dst_grp bmesh_data_transfer.c");
-
-			f_match_table[index].f_dst = f_dst;
-			f_match_table[index].f_src = f_src;
-			f_match_table[index].l_src = l_src_grp;
-			f_match_table[index].l_src = l_dst_grp;
-
-			if (!BM_match_loops(f_src, f_dst, l_src_grp, l_dst_grp))
-				return false;
-		}
-
-		//match vertices
-		for (v_dst = BM_iter_new(&iter, bm_dst, BM_VERTS_OF_MESH, NULL),
-		     v_src = BM_iter_new(&iter, bm_src, BM_VERTS_OF_MESH, NULL); v_dst;
-		     v_dst = BM_iter_step(&iter), v_src = BM_iter_step(&iter)) {
-
-			int index = v_dst->head.index;
-
-			v_match_table[index].v_dst = v_dst;
-			v_match_table[index].v_src = v_src;
-		}
-
-	//+-----------------+
-	//|	sub_Block 3.0.2	|	//Call the respective transfer function for all the layers with the loops/verts values
-	//+-----------------+
-
 		switch (type) {
-			case CD_MLOOPCOL:
-			{
-				BM_mesh_multi_layer_copy2(bm_src, bm_dst, replace_info, transfer_mode, type, f_match_table);
-
+			case CD_SHAPEKEY:
+				BM_mesh_aligned_transfer(bm_src, bm_dst, BM_VERTS_OF_MESH, CD_SHAPEKEY, replace_info);
 				break;
-			}
-			case CD_MLOOPUV:
-			{
-				BM_mesh_multi_layer_copy2(bm_src, bm_dst, replace_info, transfer_mode, type, f_match_table);
 
-				break;
-			}
-			case CD_SHAPEKEY:
-			{
-				BM_mesh_multi_layer_copy2(bm_src, bm_dst, replace_info, transfer_mode, type, f_match_table);
-
-				break;
-			}
 			case CD_MDEFORMVERT:
-			{
-				BM_mesh_multi_layer_copy2(bm_src, bm_dst, replace_info, transfer_mode, type, f_match_table);
-
+				BM_mesh_aligned_transfer(bm_src, bm_dst, BM_VERTS_OF_MESH, CD_MDEFORMVERT, replace_info);
 				break;
-			}
 		}
-
-		BM_ITER_MESH_INDEX (f_dst, &fiter, bm_dst, BM_FACES_OF_MESH, a) {
-			MEM_freeN(f_match_table[a].l_src);
-			MEM_freeN(f_match_table[a].l_dst);
-		}
-
-		MEM_freeN(f_match_table);
-		MEM_freeN(v_match_table);
-
 	}
 
 	//transfer by interpolation	(3.1)
@@ -435,3 +373,116 @@
 	}
 	return true;
 }
+
+
+static void BM_mesh_cd_array_transfer(const CustomData *cd_src, BMElem **array_src, int array_src_count,
+                                      const CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
+                                      const int layer_type, const struct ReplaceLayerInfo *replace_info)
+{
+	//... copy between arrays aligned arrays ...
+
+	if ((array_dst && array_src) && (array_src_count == array_dst_count)) {
+		int src_lay_iter, dst_lay_iter;
+		int src_lay_start = replace_info->src_lay_start;
+		int src_lay_end = replace_info->src_lay_end;
+		int dst_lay_start = replace_info->dst_lay_start;
+
+		int i;
+
+		for (src_lay_iter = src_lay_start, dst_lay_iter = dst_lay_start; src_lay_iter <= src_lay_end;
+			src_lay_iter++, dst_lay_iter++) {
+			switch (layer_type) {
+				case CD_SHAPEKEY:
+				{
+					//fix the layers
+					int CD_basis_src = CustomData_get_n_offset(cd_src, CD_SHAPEKEY, 0);
+					int CD_basis_dst = CustomData_get_n_offset(cd_dst, CD_SHAPEKEY, 0);
+					int CD_offset_src = CustomData_get_n_offset(cd_src, CD_SHAPEKEY, src_lay_iter);
+					int CD_offset_dst = CustomData_get_n_offset(cd_dst, CD_SHAPEKEY, dst_lay_iter);
+
+					for (i = 0; i < array_dst_count; i++) {
+
+						BMElem *ele_src = array_src[i];
+						BMElem *ele_dst = array_dst[i];
+
+						float *cos_src = BM_ELEM_CD_GET_VOID_P(ele_src, CD_offset_src);
+						float *cos_dst = BM_ELEM_CD_GET_VOID_P(ele_dst, CD_offset_dst);
+
+						float *cos_src_basis = BM_ELEM_CD_GET_VOID_P(ele_src, CD_basis_src);
+						float *cos_dst_basis = BM_ELEM_CD_GET_VOID_P(ele_dst, CD_basis_dst);
+
+						float offset[3];
+
+						sub_v3_v3v3(offset, cos_src, cos_src_basis);
+						add_v3_v3v3(cos_dst, offset, cos_dst_basis);
+						sub_v3_v3v3(offset, cos_src, cos_src_basis);
+					}
+
+					break;
+				}
+
+				case CD_MDEFORMVERT:
+				{
+					const int cd_dvert_src_offset = CustomData_get_offset(cd_src, CD_MDEFORMVERT);
+					const int cd_dvert_dst_offset = CustomData_get_offset(cd_dst, CD_MDEFORMVERT);
+
+					const int src_grp_ind = src_lay_start + src_lay_iter;
+					const int dst_grp_ind = dst_lay_start + dst_lay_iter;
+
+					for (i = 0; i < array_dst_count; i++) {
+						MDeformVert *dv_src, *dv_dst;
+						MDeformWeight *dw_src, *dw_dst;
+
+						BMElem *ele_src = array_src[i];
+						BMElem *ele_dst = array_dst[i];
+
+						dv_src = BM_ELEM_CD_GET_VOID_P(ele_src, cd_dvert_src_offset);
+						dw_src = defvert_verify_index(dv_src, src_grp_ind);
+
+						dv_dst = BM_ELEM_CD_GET_VOID_P(ele_dst, cd_dvert_dst_offset);
+						dw_dst = defvert_verify_index(dv_dst, dst_grp_ind);
+
+						if (dw_src == NULL)
+							dw_dst = NULL;
+
+						else
+							dw_dst->weight = dw_src->weight;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+}
+
+static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char itype, 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);
+
+	CustomData *cd_dst;
+	CustomData *cd_src;
+
+	/* this could be its own function even */
+	switch (itype) {
+		case BM_VERTS_OF_MESH:
+			cd_src = &bm_src->vdata;
+			cd_dst = &bm_dst->vdata;
+			break;
+
+		case BM_EDGES_OF_MESH:
+			cd_src = &bm_src->edata;
+			cd_dst = &bm_dst->edata;
+			break;
+
+			///should the pdata be associated to the FACES_OF_MESH?
+	}
+
+	BM_mesh_cd_array_transfer(cd_src, array_src, array_src_len, cd_dst, array_dst, array_dst_len, layer_type, replace_info);
+}
+

Modified: branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h
===================================================================
--- branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h	2013-08-26 20:23:26 UTC (rev 59534)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h	2013-08-26 20:29:36 UTC (rev 59535)
@@ -77,8 +77,9 @@
 
 bool BM_mesh_multi_layer_copy(BMesh* bm_src, BMesh *bm_dst, const struct ReplaceLayerInfo replace_info, int type, void *weights,
                               struct BM_loops_per_face_mapping *fl_table);
-bool BM_mesh_data_copy(BMesh *bm_src, BMesh* bm_dst, int type, const struct ReplaceLayerInfo replace_info, bool relative_to_target,
+bool BM_mesh_data_copy(BMesh *bm_src, BMesh* bm_dst, int type, const struct ReplaceLayerInfo *replace_info, bool relative_to_target,
                   float tmp_mat[4][4], bool use_tolerance, float tolerance);
+bool BM_mesh_data_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo *replace_info, int type);
 
 #endif /* __BMESH_DATA_TRANSFER_H__ */
 

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-08-26 20:23:26 UTC (rev 59534)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c	2013-08-26 20:29:36 UTC (rev 59535)
@@ -643,7 +643,7 @@
 	BM_mesh_bm_from_me(bm_src, me_src, TRUE, true, 0);	//TRUE -> should transfer shapekeys too!!
 	BM_mesh_bm_from_me(bm_dst, me_dst, TRUE, true, 0);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list