svn merge ^/trunk/blender -r42722:42742
[blender.git] / source / blender / modifiers / intern / MOD_weightvgmix.c
index 43f503a7624a4042828d5453e748fce6f9b48464..34e73adb4b43efcdf5f1a8c9e9337dcc9a65054d 100644 (file)
@@ -219,10 +219,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
        WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
-       DerivedMesh *dm = derivedData, *ret = NULL;
-#if 0
-       Mesh *ob_m = NULL;
-#endif
+       DerivedMesh *dm = derivedData;
        MDeformVert *dvert = NULL;
        MDeformWeight **dw1, **tdw1, **dw2, **tdw2;
        int numVerts;
@@ -232,7 +229,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        int *tidx, *indices = NULL;
        int numIdx = 0;
        int i;
-       char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
 
        /* Get number of verts. */
        numVerts = dm->getNumVerts(dm);
@@ -254,49 +250,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                        return dm;
        }
 
-       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file...
-        */
-#if 0
-       /* Get actual dverts (ie vertex group data). */
-       dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data... */
-       if (dvert == NULL)
-               return dm;
-
-       /* Get org mesh, only to test whether affected cdata layer has already been copied
-        * somewhere up in the modifiers stack.
-        */
-       ob_m = get_mesh(ob);
-       if (ob_m == NULL)
-               return dm;
-
-       /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
-       if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
-               /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess...
-                */
-//             DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
-               ret = CDDM_copy(dm);
-               dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
-               if (dvert == NULL) {
-                       ret->release(ret);
-                       return dm;
-               }
-               rel_ret = 1;
-       }
-       else
-               ret = dm;
-#else
-       ret = CDDM_copy(dm, 0);
-       rel_ret = 1;
-       dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
-       if (dvert == NULL) {
-               if (rel_ret)
-                       ret->release(ret);
-               return dm;
-       }
-#endif
+       dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
 
        /* Find out which vertices to work on. */
        tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
@@ -364,8 +318,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                MEM_freeN(tdw1);
                MEM_freeN(tdw2);
                MEM_freeN(tidx);
-               if (rel_ret)
-                       ret->release(ret);
                return dm;
        }
        if (numIdx != -1) {
@@ -400,7 +352,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        }
 
        /* Do masking. */
-       weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+       weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant,
                         wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
                         wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
 
@@ -419,7 +371,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                MEM_freeN(indices);
 
        /* Return the vgroup-modified mesh. */
-       return ret;
+       return dm;
 }
 
 static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,