Commit: 06d90a5a15e84f7a840dff373ede4c34bc6abf0f
Author: Bastien Montagne
Date:   Sat Nov 8 12:56:12 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB06d90a5a15e84f7a840dff373ede4c34bc6abf0f

On second though, allow modifier to create vgroups too.

This is rather hard to handle in fact, should a modifier be allowed to create 
vgroups,
when it cannot delete them really (because vgroups are defined at object level, 
not CD / DM level)?
Open question for review! :P

Also, fixed some (stupid) bugs, fixed some potential bugs, and did some cleanup.

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

M       source/blender/blenkernel/intern/customdata.c
M       source/blender/blenkernel/intern/deform.c

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

diff --git a/source/blender/blenkernel/intern/customdata.c 
b/source/blender/blenkernel/intern/customdata.c
index 23a7a85..cfc1285 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -670,7 +670,7 @@ static void layerCopyValue_mloopcol(const void *source, 
void *dest, const int mi
        switch (mixmode) {
                case CDT_MIX_MIX:
                        blend_color_interpolate_byte((unsigned char *)&m2->r, 
(unsigned char *)&m2->r,
-                                                            (unsigned char 
*)&m1->r, mixfactor);
+                                                    (unsigned char *)&m1->r, 
mixfactor);
                        break;
                case CDT_MIX_ADD:
                        blend_color_add_byte(tmp_col, (unsigned char *)&m2->r, 
(unsigned char *)&m1->r);
diff --git a/source/blender/blenkernel/intern/deform.c 
b/source/blender/blenkernel/intern/deform.c
index 4365678..5ff6a01 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -1102,7 +1102,7 @@ static void vgroups_datatransfer_interp(const 
DataTransferLayerMapping *laymap,
                        return;  /* Do not affect destination. */
                }
                else {
-                       float weight_dst_org = dw_dst ? dw_dst->weight : 0.0f;
+                       const float weight_dst_org = dw_dst ? dw_dst->weight : 
0.0f;
                        switch (mix_mode) {
                                case CDT_MIX_MIX:
                                        /* Nothing to do, mere interp is enough 
here. */;
@@ -1117,7 +1117,7 @@ static void vgroups_datatransfer_interp(const 
DataTransferLayerMapping *laymap,
                                        weight_dst = weight_dst_org * 
weight_dst;
                                        break;
                        }
-                       interpf(weight_dst, weight_dst_org, mix_factor);
+                       weight_dst = interpf(weight_dst, weight_dst_org, 
mix_factor);
                        CLAMP(weight_dst, 0.0f, 1.0f);
                }
        }
@@ -1132,10 +1132,10 @@ static void vgroups_datatransfer_interp(const 
DataTransferLayerMapping *laymap,
 
 static bool data_transfer_layersmapping_vgroups_multisrc_to_dst(
         ListBase *r_map, const int mix_mode, const float mix_factor, const 
float *mix_weights, const int num_create,
-        Object *ob_src, Object *ob_dst, MDeformVert *data_dst, MDeformVert 
*data_src, const bool dup_dst,
+        Object *ob_src, Object *ob_dst, MDeformVert *data_src, MDeformVert 
*data_dst, const bool UNUSED(dup_dst),
         const int tolayers, bool *use_layers_src, const int num_layers_src)
 {
-       int idx_src = num_layers_src;
+       int idx_src;
        int idx_dst;
 
        const size_t elem_size = sizeof(*((MDeformVert *)NULL));
@@ -1145,12 +1145,12 @@ static bool 
data_transfer_layersmapping_vgroups_multisrc_to_dst(
                        idx_dst = BLI_countlist(&ob_dst->defbase);
 
                        /* Find last source actually used! */
+                       idx_src = num_layers_src;
                        while (idx_src-- && !use_layers_src[idx_src]);
                        idx_src++;
 
                        if (idx_dst < idx_src) {
-                               /* XXX In DM case (modifier), we **cannot 
create new vgroups!** */
-                               if (!num_create || dup_dst) {
+                               if (!num_create) {
                                        return false;
                                }
                                /* Create as much vgroups as necessary! */
@@ -1169,29 +1169,28 @@ static bool 
data_transfer_layersmapping_vgroups_multisrc_to_dst(
                        }
                        break;
                case DT_TOLAYERS_NAME:
-                       while (idx_src--) {
+                       {
                                bDeformGroup *dg_src;
+                               for (idx_src = 0, dg_src = 
ob_src->defbase.first; idx_src < num_layers_src; idx_src++, dg_src = 
dg_src->next) {
+                                       if (!use_layers_src[idx_src]) {
+                                               continue;
+                                       }
 
-                               if (!use_layers_src[idx_src]) {
-                                       continue;
-                               }
-
-                               dg_src = BLI_findlink(&ob_src->defbase, 
idx_src);
-                               if ((idx_dst = defgroup_name_index(ob_dst, 
dg_src->name)) == -1) {
-                                       /* XXX In DM case (modifier), we 
**cannot create new vgroups!** */
-                                       if (!num_create || dup_dst) {
-                                               BLI_freelistN(r_map);
-                                               return false;
+                                       if ((idx_dst = 
defgroup_name_index(ob_dst, dg_src->name)) == -1) {
+                                               if (!num_create) {
+                                                       BLI_freelistN(r_map);
+                                                       return false;
+                                               }
+                                               BKE_defgroup_new(ob_dst, 
dg_src->name);
+                                               ob_dst->actdef = 
BLI_countlist(&ob_dst->defbase);
+                                               idx_dst = ob_dst->actdef - 1;
                                        }
-                                       BKE_defgroup_new(ob_dst, dg_src->name);
-                                       ob_dst->actdef = 
BLI_countlist(&ob_dst->defbase);
-                                       idx_dst = ob_dst->actdef - 1;
+                                       
data_transfer_layersmapping_add_item(r_map, CD_FAKE_MDEFORMVERT, mix_mode, 
mix_factor, mix_weights,
+                                                                            
data_src, data_dst, idx_src, idx_dst,
+                                                                            
elem_size, 0, 0, 0, vgroups_datatransfer_interp);
                                }
-                               data_transfer_layersmapping_add_item(r_map, 
CD_FAKE_MDEFORMVERT, mix_mode, mix_factor, mix_weights,
-                                                                    data_src, 
data_dst, idx_src, idx_dst,
-                                                                    elem_size, 
0, 0, 0, vgroups_datatransfer_interp);
+                               break;
                        }
-                       break;
                default:
                        return false;
        }
@@ -1257,8 +1256,7 @@ bool data_transfer_layersmapping_vgroups(
                else if (tolayers == DT_TOLAYERS_ACTIVE) {
                        if ((idx_dst = ob_dst->actdef - 1) == -1) {
                                bDeformGroup *dg_src;
-                               /* XXX In DM case (modifier), we **cannot 
create new vgroups!** */
-                               if (!num_create || dup_dst) {
+                               if (!num_create) {
                                        return false;
                                }
                                dg_src = BLI_findlink(&ob_src->defbase, 
idx_src);
@@ -1271,8 +1269,7 @@ bool data_transfer_layersmapping_vgroups(
                        int num = BLI_countlist(&ob_src->defbase);
                        idx_dst = idx_src;
                        if (num <= idx_dst) {
-                               /* XXX In DM case (modifier), we **cannot 
create new vgroups!** */
-                               if (!num_create || dup_dst) {
+                               if (!num_create) {
                                        return false;
                                }
                                /* Create as much vgroups as necessary! */
@@ -1285,8 +1282,7 @@ bool data_transfer_layersmapping_vgroups(
                else if (tolayers == DT_TOLAYERS_NAME) {
                        bDeformGroup *dg_src = BLI_findlink(&ob_src->defbase, 
idx_src);
                        if ((idx_dst = defgroup_name_index(ob_dst, 
dg_src->name)) == -1) {
-                               /* XXX In DM case (modifier), we **cannot 
create new vgroups!** */
-                               if (!num_create || dup_dst) {
+                               if (!num_create) {
                                        return false;
                                }
                                BKE_defgroup_new(ob_dst, dg_src->name);
@@ -1305,7 +1301,7 @@ bool data_transfer_layersmapping_vgroups(
        else {
                int num_src, num_sel_unused;
                bool *use_layers_src = NULL;
-               bool ret;
+               bool ret = false;
 
                switch (fromlayers) {
                        case DT_FROMLAYERS_ALL:
@@ -1322,11 +1318,13 @@ bool data_transfer_layersmapping_vgroups(
                                break;
                }
 
-               ret = 
data_transfer_layersmapping_vgroups_multisrc_to_dst(r_map, mix_mode, 
mix_factor, mix_weights, num_create,
-                                                                         
ob_src, ob_dst, data_src, data_dst, dup_dst,
-                                                                         
tolayers, use_layers_src, num_src);
+               if (use_layers_src) {
+                       ret = 
data_transfer_layersmapping_vgroups_multisrc_to_dst(r_map, mix_mode, 
mix_factor, mix_weights, num_create,
+                                                                               
  ob_src, ob_dst, data_src, data_dst, dup_dst,
+                                                                               
  tolayers, use_layers_src, num_src);
+               }
 
-               MEM_freeN(use_layers_src);
+               MEM_SAFE_FREE(use_layers_src);
                return ret;
        }

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

Reply via email to