Commit: 2a5cc75a2fb83e31359806225fb0d3ec4aac4849
Author: Bastien Montagne
Date:   Tue Oct 28 10:13:09 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB2a5cc75a2fb83e31359806225fb0d3ec4aac4849

Add advanced mix modes to vcol (theorical only for now) and vgroups (working).

Also fixed stupid bug with vgroups when mdef CD layer already existed.

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

M       source/blender/editors/object/object_vgroup.c

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

diff --git a/source/blender/editors/object/object_vgroup.c 
b/source/blender/editors/object/object_vgroup.c
index edea2f5..7c81ca8 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -754,6 +754,10 @@ static void vgroups_datatransfer_interp(const 
DataTransferLayerMapping *laymap,
        MDeformVert *data_dst = (MDeformVert *)dest;
        const int idx_src = laymap->data_n_src;
        const int idx_dst = laymap->data_n_dst;
+
+       const int mix_mode = laymap->mix_mode;
+       const int mix_factor = laymap->mix_factor;
+
        int i, j;
 
        MDeformWeight *dw_src;
@@ -769,6 +773,37 @@ static void vgroups_datatransfer_interp(const 
DataTransferLayerMapping *laymap,
                }
        }
 
+       if (mix_mode != CDT_MIX_REPLACE_ALL) {
+               if (!dw_dst && (mix_mode == CDT_MIX_REPLACE_ABOVE_THRESHOLD)) {
+                       return;  /* Do not affect destination. */
+               }
+               if (dw_dst &&
+                   ((mix_mode == CDT_MIX_REPLACE_ABOVE_THRESHOLD && 
(dw_dst->weight <= mix_factor)) ||
+                    (mix_mode == CDT_MIX_REPLACE_BELOW_THRESHOLD && 
(dw_dst->weight >= mix_factor))))
+               {
+                       return;  /* Do not affect destination. */
+               }
+               else {
+                       float weight_dst_org = dw_dst ? dw_dst->weight : 0.0f;
+                       switch (mix_mode) {
+                               case CDT_MIX_MIX:
+                                       weight_dst = (weight_dst_org + 
weight_dst) / 2.0f;
+                                       break;
+                               case CDT_MIX_ADD:
+                                       weight_dst = weight_dst_org + 
weight_dst;
+                                       break;
+                               case CDT_MIX_SUB:
+                                       weight_dst = weight_dst_org - 
weight_dst;
+                                       break;
+                               case CDT_MIX_MUL:
+                                       weight_dst = weight_dst_org * 
weight_dst;
+                                       break;
+                       }
+                       interpf(weight_dst, weight_dst_org, mix_factor);
+                       CLAMP(weight_dst, 0.0f, 1.0f);
+               }
+       }
+
        if (!dw_dst) {
                defvert_add_index_notest(data_dst, idx_dst, weight_dst);
        }
@@ -857,12 +892,15 @@ bool data_transfer_layersmapping_vgroups(
        if ((data_src = CustomData_get_layer(cd_src, CD_MDEFORMVERT)) == NULL) {
                return false;
        }
+
        if (!CustomData_has_layer(cd_dst, CD_MDEFORMVERT)) {
                if (!num_create) {
                        return false;
                }
                ED_vgroup_data_create((ID *)ob_dst->data);
-               data_dst = CustomData_get_layer(cd_dst, CD_MDEFORMVERT);
+       }
+       if ((data_dst = CustomData_get_layer(cd_dst, CD_MDEFORMVERT)) == NULL) {
+               return false;
        }
 
        if (fromlayers_select == MDT_FROMLAYERS_ACTIVE) {
@@ -916,12 +954,24 @@ bool data_transfer_layersmapping_vgroups(
                                                     data_src, data_dst, 
idx_src, idx_dst,
                                                     elem_size, 0, 0, 0, 
vgroups_datatransfer_interp);
        }
-       else if (fromlayers_select == MDT_FROMLAYERS_ALL) {
-               int num_src = BLI_countlist(&ob_src->defbase);
-               bool *use_layers_src = MEM_mallocN(sizeof(*use_layers_src) * 
(size_t)num_src, __func__);
+       else {
+               int num_src, num_sel_unused;
+               bool *use_layers_src = NULL;
                bool ret;
 
-               memset(use_layers_src, true, sizeof(*use_layers_src) * num_src);
+               switch (fromlayers_select) {
+                       case MDT_FROMLAYERS_ALL:
+                               use_layers_src = 
ED_vgroup_subset_from_select_type(ob_src, WT_VGROUP_ALL, &num_src, 
&num_sel_unused);
+                               break;
+                       case MDT_FROMLAYERS_VGROUP_BONE_SELECTED:
+                               use_layers_src = 
ED_vgroup_subset_from_select_type(ob_src, WT_VGROUP_BONE_SELECT,
+                                                                               
   &num_src, &num_sel_unused);
+                               break;
+                       case MDT_FROMLAYERS_VGROUP_BONE_DEFORM:
+                               use_layers_src = 
ED_vgroup_subset_from_select_type(ob_src, WT_VGROUP_BONE_DEFORM,
+                                                                               
   &num_src, &num_sel_unused);
+                               break;
+               }
 
                ret = 
data_transfer_layersmapping_vgroups_multisrc_to_dst(r_map, mix_mode, 
mix_factor, num_create,
                                                                          
ob_src, ob_dst, data_src, data_dst,
@@ -930,10 +980,6 @@ bool data_transfer_layersmapping_vgroups(
                MEM_freeN(use_layers_src);
                return ret;
        }
-       /* TODO: add vgroups-specific 'from-select' modes here! */
-       else {
-               return false;
-       }
 
        return true;
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to