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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to