[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60043] branches/ soc-2013-meshdata_transfer/source/blender: code rewrite: adding transfer by topology for vertex based data types
Walid Shouman
eng.walidshouman at gmail.com
Wed Sep 11 13:41:11 CEST 2013
Revision: 60043
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60043
Author: walid
Date: 2013-09-11 11:41:11 +0000 (Wed, 11 Sep 2013)
Log Message:
-----------
code rewrite: adding transfer by topology for vertex based data types
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-09-11 11:18:08 UTC (rev 60042)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.c 2013-09-11 11:41:11 UTC (rev 60043)
@@ -78,12 +78,6 @@
return true;
}
-typedef enum TransferMode {
- TRANSFER_BY_INDEX = 1,
- TRANSFER_BY_TOPOLOGY = 2,
- TRANSFER_BY_INTERPOLATION = 3,
-} TransferMode;
-
typedef struct BMFace_match {
BMFace *f_src;
BMFace *f_dst;
@@ -96,14 +90,28 @@
BMVert *v_dst;
} BMVert_match;
-static void BM_mesh_cd_array_transfer(CustomData *cd_src, BMElem **array_src, int array_src_count,
+//---------------helping functions-----------------------
+void *BM_mesh_mapping(BMesh *bm_src, BMesh *bm_dst, const char htype);
+
+//--------------index based transfer functions ----------
+static void BM_mesh_cd_transfer_array(CustomData *cd_src, BMElem **array_src, int array_src_count,
+ CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
+ const int layer_type, const struct ReplaceLayerInfo *UNUSED_replace_info);
+
+static void BM_mesh_transfer_aligned(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
+ const struct ReplaceLayerInfo *replace_info);
+
+//--------------topology based transfer functions ------
+void BM_mesh_cd_transfer_mapped(CustomData *cd_src, BMElem **array_src, int array_src_count,
CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
- const int layer_type, const struct ReplaceLayerInfo *UNUSED_replace_info);
+ const int layer_type, const struct ReplaceLayerInfo *UNUSED_replace_info,
+ int *index_mapping);
-static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
- const struct ReplaceLayerInfo *replace_info);
+static void BM_mesh_transfer_mapped(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
+ const struct ReplaceLayerInfo *replace_info);
-bool BM_mesh_data_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo *replace_info, int type)
+bool BM_mesh_data_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo *replace_info, int type,
+ TransferMode transfer_mode)
{
/* BMFace *f_src, *f_dst;
@@ -112,7 +120,8 @@
int a;
*/
//stub
- TransferMode transfer_mode = TRANSFER_BY_INDEX;
+// TransferMode transfer_mode = TRANSFER_BY_INDEX; //working for the UV, Colors & DeformVert
+// TransferMode transfer_mode = TRANSFER_BY_TOPOLOGY;
//+-------------+
//| |
@@ -146,15 +155,28 @@
switch (type) {
case CD_SHAPEKEY:
case CD_MDEFORMVERT:
- BM_mesh_aligned_transfer(bm_src, bm_dst, BM_VERT, CD_SHAPEKEY, replace_info);
+ BM_mesh_transfer_aligned(bm_src, bm_dst, BM_VERT, type, replace_info);
break;
case CD_MLOOPCOL:
case CD_MLOOPUV:
- BM_mesh_aligned_transfer(bm_src, bm_dst, BM_LOOP, type, replace_info);
+ BM_mesh_transfer_aligned(bm_src, bm_dst, BM_LOOP, type, replace_info);
}
}
+ else if(transfer_mode == TRANSFER_BY_TOPOLOGY) {
+ switch (type) {
+ case CD_SHAPEKEY:
+ case CD_MDEFORMVERT:
+ BM_mesh_transfer_mapped(bm_src, bm_dst, BM_VERT, type, replace_info);
+ break;
+
+ case CD_MLOOPCOL:
+ case CD_MLOOPUV:
+ BM_mesh_transfer_mapped(bm_src, bm_dst, BM_LOOP, type, replace_info);
+ }
+ }
+
//transfer by interpolation (3.1)
// |
// |
@@ -196,7 +218,7 @@
return true;
}
-static void BM_mesh_cd_array_transfer(CustomData *cd_src, BMElem **array_src, int array_src_count,
+static void BM_mesh_cd_transfer_array(CustomData *cd_src, BMElem **array_src, int array_src_count,
CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
const int layer_type, const struct ReplaceLayerInfo *UNUSED(replace_info))
{
@@ -218,7 +240,38 @@
}
}
-static void BM_mesh_aligned_transfer(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
+void BM_mesh_cd_transfer_mapped(CustomData *cd_src, BMElem **array_src, int array_src_count,
+ CustomData *cd_dst, BMElem **array_dst, int array_dst_count,
+ const int layer_type, const struct ReplaceLayerInfo *UNUSED(replace_info),
+ int *index_mapping)
+{
+ //... copy between arrays with a mapping! ...
+
+ if ((array_dst && array_src) && (array_src_count == array_dst_count)) {
+ int i;
+
+ void *ptr;
+
+ for (i = 0; i < array_dst_count; i++) {
+
+ BMElem *ele_src;
+ BMElem *ele_dst;
+
+ if (index_mapping[i] == -1) { //shall never be reached!!
+ continue;
+ }
+
+ ele_src = array_src[index_mapping[i]];
+ ele_dst = array_dst[i];
+
+ ptr = CustomData_bmesh_get(cd_src, ele_src->head.data, layer_type);
+ CustomData_bmesh_set(cd_dst, ele_dst->head.data, layer_type, ptr);
+
+ }
+ }
+}
+
+static void BM_mesh_transfer_aligned(BMesh *bm_src, BMesh *bm_dst, const char htype, const int layer_type,
const struct ReplaceLayerInfo *replace_info)
{
int array_dst_len;
@@ -286,6 +339,106 @@
///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);
+ BM_mesh_cd_transfer_array(cd_src, array_src, array_src_len, cd_dst, array_dst, array_dst_len, layer_type, replace_info);
}
+static void BM_mesh_transfer_mapped(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;
+ BMElem **array_dst;
+
+ CustomData *cd_dst;
+ CustomData *cd_src;
+
+ int *index_mapping;
+ 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);
+ index_mapping = BM_mesh_mapping(bm_src, bm_dst, BM_VERT);
+ break;
+
+ case BM_LOOP:
+ break;
+
+ default:
+ break;
+ }
+
+
+ /* this could be its own function even */
+ switch (htype) {
+ case BM_VERT:
+ cd_src = &bm_src->vdata;
+ cd_dst = &bm_dst->vdata;
+ break;
+
+ 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?
+ }
+
+// BM_mesh_cd_transfer_array(cd_src, array_src, array_src_len, cd_dst, array_dst, array_dst_len, layer_type, replace_info);
+
+ BM_mesh_cd_transfer_mapped(cd_src, array_src, array_src_len, cd_dst, array_dst, array_dst_len, layer_type, replace_info,
+ index_mapping);
+}
+
+void *BM_mesh_mapping(BMesh *bm_src, BMesh *bm_dst, const char htype)
+{
+ BMVert *v_src, *v_dst;
+ BMIter iter;
+ int a;
+ int *index_mapping;
+
+ //does the bm_src get affected when we do_tesselation ?
+ BMBVHTree *bmtree_src;
+
+ BMEditMesh *em_src;// = BKE_editmesh_create(bm_src, true);
+ em_src = BKE_editmesh_create(bm_src, true);
+ bmtree_src = BKE_bmbvh_new(em_src, 0, NULL, false);
+
+ switch (htype) {
+ case BM_VERT:
+ index_mapping = MEM_mallocN(bm_dst->totvert, "index_mapping bmesh_data_transfer.c");
+/// BM_ITER_MESH_INDEX (v_dst, &iter, bm_dst, BM_VERTS_OF_MESH, a) {
+ for (v_dst = BM_iter_new(&iter, bm_dst, BM_VERTS_OF_MESH, NULL), a = 0; v_dst; v_dst = BM_iter_step(&iter), (a)++) {
+
+ v_src = BKE_bmbvh_find_vert_closest(bmtree_src, v_dst->co, FLT_MAX);
+ if (v_src != NULL) {
+ index_mapping[a] = v_src->head.index;
+ }
+ else {
+ index_mapping[a] = -1;
+ }
+
+ }
+
+ break;
+ case BM_FACE:
+
+ break;
+ default:
+ ///raises an error!
+// BKE_bmbvh_free(bmtree_src);
+ return false;
+ //break;
+ }
+
+///raises an error!
+// BKE_bmbvh_free(bmtree_src);
+
+ return index_mapping;
+}
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-09-11 11:18:08 UTC (rev 60042)
+++ branches/soc-2013-meshdata_transfer/source/blender/bmesh/tools/bmesh_data_transfer.h 2013-09-11 11:41:11 UTC (rev 60043)
@@ -48,6 +48,12 @@
int dst_lay_end;
} ReplaceLayerInfo;
+typedef enum TransferMode {
+ TRANSFER_BY_INDEX = 1,
+ TRANSFER_BY_TOPOLOGY = 2,
+ TRANSFER_BY_INTERPOLATION = 3,
+} TransferMode;
+
struct BM_loops_per_face_mapping;
bool BKE_bmesh_calc_relative_deform(const int v_count, const float (*vert_cos_src)[], const float (*vert_cos_dst)[],
@@ -79,7 +85,8 @@
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,
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);
+bool BM_mesh_data_copy2(BMesh *bm_src, BMesh* bm_dst, const struct ReplaceLayerInfo *replace_info, int type,
+ TransferMode transfer_mode);
#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-09-11 11:18:08 UTC (rev 60042)
+++ branches/soc-2013-meshdata_transfer/source/blender/editors/mesh/mesh_data.c 2013-09-11 11:41:11 UTC (rev 60043)
@@ -491,6 +491,16 @@
{0, NULL, 0, NULL, NULL}
};
+static EnumPropertyItem transfer_mode_item[] = {
+ {TRANSFER_BY_INDEX,
+ "TRANSFER_BY_INDEX", 0, "By index", "copy between identical indices meshes"},
+ {TRANSFER_BY_TOPOLOGY,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list