Commit: 08a343d1c8a802014fed366fc6421aa03da3327c
Author: Bastien Montagne
Date:   Tue Nov 4 10:36:49 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB08a343d1c8a802014fed366fc6421aa03da3327c

Make transfer data code accept DM too.

First step towards transfer data modifier (DM part not yet tested).

===================================================================

M       source/blender/blenkernel/intern/mesh_mapping.c
M       source/blender/editors/include/ED_object.h
M       source/blender/editors/object/object_intern.h
M       source/blender/editors/object/object_transfer_data.c
M       source/blender/editors/object/object_vgroup.c

===================================================================

diff --git a/source/blender/blenkernel/intern/mesh_mapping.c 
b/source/blender/blenkernel/intern/mesh_mapping.c
index 1ef8535..86f61d2 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -1975,7 +1975,6 @@ void BKE_dm2mesh_mapping_loops_compute(
                                                        w /= 
M2MMAP_RAYCAST_APPROXIMATE_FAC;
                                                }
                                                if (n == -1) {
-                                                       printf("foo\n");
                                                        /* No source for this 
dest loop! */
                                                        
islands_res[tidx][plidx_dst].factor = 0.0f;
                                                        
islands_res[tidx][plidx_dst].hit_distance = FLT_MAX;
diff --git a/source/blender/editors/include/ED_object.h 
b/source/blender/editors/include/ED_object.h
index ec05ca6..0d812ce 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -43,6 +43,7 @@ struct Base;
 struct BezTriple;
 struct Curve;
 struct CustomData;
+struct DerivedMesh;
 struct EditBone;
 struct EnumPropertyItem;
 struct ID;
@@ -251,16 +252,17 @@ enum {
 #endif
 };
 
-bool ED_data_transfer_layersmapping_cdlayers(
-        struct ListBase *r_map, const int data_type, const int mix_mode, const 
float mix_factor,
-        const int num_create, struct CustomData *data_src, struct CustomData 
*data_dst,
-        const int fromlayers_select, const int tolayers_select);
-
 bool ED_data_transfer(
         struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, 
const int data_type, const bool use_create,
         const int map_vert_mode, const int map_edge_mode, const int 
map_poly_mode, const int map_loop_mode,
         struct SpaceTransform *space_transform, const float max_distance, 
const float precision,
         const int fromlayers_select, const int tolayers_select, const int 
mix_mode, const float mix_factor);
+bool ED_data_transfer_dm(
+        struct Scene *scene, struct Object *ob_src, struct Object *ob_dst, 
struct DerivedMesh *dm_dst,
+        const int data_type, const bool use_create,
+        const int map_vert_mode, const int map_edge_mode, const int 
map_poly_mode, const int map_loop_mode,
+        struct SpaceTransform *space_transform, const float max_distance, 
const float ray_radius,
+        const int fromlayers_select, const int tolayers_select, const int 
mix_mode, const float mix_factor);
 
 
 
diff --git a/source/blender/editors/object/object_intern.h 
b/source/blender/editors/object/object_intern.h
index b7ed71b..7b32020 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -241,7 +241,7 @@ void OBJECT_OT_vertex_weight_copy(struct wmOperatorType 
*ot);
 
 bool data_transfer_layersmapping_vgroups(
         struct ListBase *r_map, const int mix_mode, const float mix_factor, 
const int num_create,
-        struct Object *ob_src, struct Object *ob_dst,
+        struct Object *ob_src, struct Object *ob_dst, const bool dup_dst,
         struct CustomData *cd_src, struct CustomData *cd_dst, const int 
fromlayers_select, const int tolayers_select);
 
 /* object_warp.c */
diff --git a/source/blender/editors/object/object_transfer_data.c 
b/source/blender/editors/object/object_transfer_data.c
index b1b89d4..4fd93a0 100644
--- a/source/blender/editors/object/object_transfer_data.c
+++ b/source/blender/editors/object/object_transfer_data.c
@@ -414,7 +414,7 @@ static void 
data_transfer_layersmapping_add_item_cd(ListBase *r_map, const int d
 
 static bool data_transfer_layersmapping_cdlayers_multisrc_to_dst(
         ListBase *r_map, const int data_type, const int mix_mode, const float 
mix_factor,
-        const int num_create, CustomData *cd_src, CustomData *cd_dst,
+        const int num_create, CustomData *cd_src, CustomData *cd_dst, const 
bool dup_dst,
         const int tolayers_select, bool *use_layers_src, const int 
num_layers_src)
 {
        void *data_src, *data_dst = NULL;
@@ -444,7 +444,9 @@ static bool 
data_transfer_layersmapping_cdlayers_multisrc_to_dst(
                                                continue;
                                        }
                                        data_src = 
CustomData_get_layer_n(cd_src, data_type, idx_src);
-                                       data_dst = 
CustomData_get_layer_n(cd_dst, data_type, idx_src);
+                                       /* If dest is a derivedmesh, we do not 
want to overwrite cdlayers of org mesh! */
+                                       data_dst = dup_dst ? 
CustomData_duplicate_referenced_layer_n(cd_dst, data_type, num_create, idx_src) 
:
+                                                            
CustomData_get_layer_n(cd_dst, data_type, idx_src);
                                        
data_transfer_layersmapping_add_item_cd(r_map, data_type, mix_mode, mix_factor, 
data_src, data_dst);
                                }
                        }
@@ -467,7 +469,9 @@ static bool 
data_transfer_layersmapping_cdlayers_multisrc_to_dst(
                                        idx_dst = 
CustomData_get_named_layer(cd_dst, data_type, name);
                                }
                                data_src = CustomData_get_layer_n(cd_src, 
data_type, idx_src);
-                               data_dst = CustomData_get_layer_n(cd_dst, 
data_type, idx_dst);
+                               /* If dest is a derivedmesh, we do not want to 
overwrite cdlayers of org mesh! */
+                               data_dst = dup_dst ? 
CustomData_duplicate_referenced_layer_n(cd_dst, data_type, num_create, idx_dst) 
:
+                                                    
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
                                data_transfer_layersmapping_add_item_cd(r_map, 
data_type, mix_mode, mix_factor, data_src, data_dst);
                        }
                        break;
@@ -478,9 +482,9 @@ static bool 
data_transfer_layersmapping_cdlayers_multisrc_to_dst(
        return true;
 }
 
-bool ED_data_transfer_layersmapping_cdlayers(
+static bool data_transfer_layersmapping_cdlayers(
         ListBase *r_map, const int data_type, const int mix_mode, const float 
mix_factor,
-        const int num_create, CustomData *cd_src, CustomData *cd_dst,
+        const int num_create, CustomData *cd_src, CustomData *cd_dst, const 
bool dup_dst,
         const int fromlayers_select, const int tolayers_select)
 {
        int idx_src, idx_dst;
@@ -490,7 +494,10 @@ bool ED_data_transfer_layersmapping_cdlayers(
                if (!(data_src = CustomData_get_layer(cd_src, data_type))) {
                        return false;
                }
-               if (!(data_dst = CustomData_get_layer(cd_dst, data_type))) {
+               /* If dest is a derivedmesh, we do not want to overwrite 
cdlayers of org mesh! */
+               data_dst = dup_dst ? 
CustomData_duplicate_referenced_layer(cd_dst, data_type, num_create) :
+                                    CustomData_get_layer(cd_dst, data_type);
+               if (!data_dst) {
                        if (!num_create) {
                                return false;
                        }
@@ -513,7 +520,9 @@ bool ED_data_transfer_layersmapping_cdlayers(
                                        data_dst = CustomData_add_layer(cd_dst, 
data_type, CD_CALLOC, NULL, num_create);
                                }
                                else {
-                                       data_dst = 
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
+                                       /* If dest is a derivedmesh, we do not 
want to overwrite cdlayers of org mesh! */
+                                       data_dst = dup_dst ? 
CustomData_duplicate_referenced_layer_n(cd_dst, data_type, num_create, idx_dst) 
:
+                                                            
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
                                }
                                break;
                        case MDT_TOLAYERS_INDEX:
@@ -529,7 +538,9 @@ bool ED_data_transfer_layersmapping_cdlayers(
                                                        
CustomData_add_layer(cd_dst, data_type, CD_CALLOC, NULL, num_create);
                                                }
                                        }
-                                       data_dst = 
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
+                                       /* If dest is a derivedmesh, we do not 
want to overwrite cdlayers of org mesh! */
+                                       data_dst = dup_dst ? 
CustomData_duplicate_referenced_layer_n(cd_dst, data_type, num_create, idx_dst) 
:
+                                                            
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
                                }
                                break;
                        case MDT_TOLAYERS_NAME:
@@ -542,7 +553,9 @@ bool ED_data_transfer_layersmapping_cdlayers(
                                                
CustomData_add_layer_named(cd_dst, data_type, CD_CALLOC, NULL, num_create, 
name);
                                                idx_dst = 
CustomData_get_named_layer(cd_dst, data_type, name);
                                        }
-                                       data_dst = 
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
+                                       /* If dest is a derivedmesh, we do not 
want to overwrite cdlayers of org mesh! */
+                                       data_dst = dup_dst ? 
CustomData_duplicate_referenced_layer_n(cd_dst, data_type, num_create, idx_dst) 
:
+                                                            
CustomData_get_layer_n(cd_dst, data_type, idx_dst);
                                }
                                break;
                        default:
@@ -559,7 +572,7 @@ bool ED_data_transfer_layersmapping_cdlayers(
                memset(use_layers_src, true, sizeof(*use_layers_src) * num_src);
 
                ret = 
data_transfer_layersmapping_cdlayers_multisrc_to_dst(r_map, data_type, 
mix_mode, mix_factor,
-                                                                          
num_create, cd_src, cd_dst,
+                                                                          
num_create, cd_src, cd_dst, dup_dst,
                                                                           
tolayers_select, use_layers_src, num_src);
 
                MEM_freeN(use_layers_src);
@@ -573,8 +586,8 @@ bool ED_data_transfer_layersmapping_cdlayers(
 }
 
 static bool data_transfer_layersmapping_generate(
-        ListBase *r_map, Object *ob_src, Object *ob_dst, DerivedMesh *dm_src, 
Mesh *me_dst, const int elem_type,
-        int data_type, int mix_mode, float mix_factor,
+        ListBase *r_map, Object *ob_src, Object *ob_dst, DerivedMesh *dm_src, 
DerivedMesh *dm_dst, Mesh *me_dst,
+        const int elem_type, int data_type, int mix_mode, float mix_factor,
         const int num_create, const int fromlayers_select, const int 
tolayers_select)
 {
        CustomData *cd_src, *cd_dst;
@@ -582,15 +595,14 @@ static bool data_transfer_layersmapping_generate(
        if (elem_type == ME_VERT) {
                if (!(data_type & CD_FAKE)) {
                        cd_src = dm_src->getVertDataLayout(dm_src);
-                       cd_dst = &me_dst->vdata;
+                       cd_dst = dm_dst ? dm_dst->getVertDataLayout(dm_dst) : 
&me_dst->vdata;
 
                        if (!CustomData_has_layer(cd_src, data_type)) {
                                return false;
                        }
 
-                       if (!ED_data_transfer_layersmapping_cdlayers(r_map, 
data_type, mix_mode, mix_factor,
-                                                                    
num_create, cd_src, cd_dst,
-                                                                    
fromlayers_select, tolayers_select))
+                       if (!data_transfer_layersmapping_cdlayers(r_map, 
data_type, mix_mode, mix_factor, num_create, cd_src,
+                                                                 cd_dst, 
dm_dst != NULL, fromlayers_select, tolayers_select))
                        {
                                /* We handle specific source selection cases 
here. */
                                return false;
@@ -606,20 +618,27 @@ static bool data_transfer_layersmapping_generate(
                        if (!(dm_src->cd_flag & ME_CDFLAG_VERT_BWEIGHT)) {
                                return false;
                        }
-                       me_dst->cd_flag |= ME_CD

@@ 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