svn merge ^/trunk/blender -r42722:42742
[blender.git] / source / blender / modifiers / intern / MOD_weightvgedit.c
index a4c0f0ffa70a5c1af4bfa71cbc85d114fdfbc030..95862f5f0022743ca4ad6d505402153f5f553d67 100644 (file)
@@ -177,10 +177,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
        WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
-       DerivedMesh *dm = derivedData, *ret = NULL;
-#if 0
-       Mesh *ob_m = NULL;
-#endif
+       DerivedMesh *dm = derivedData;
        MDeformVert *dvert = NULL;
        MDeformWeight **dw = NULL;
        float *org_w; /* Array original weights. */
@@ -188,7 +185,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        int numVerts;
        int defgrp_idx;
        int i;
-       char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
        /* Flags. */
        int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
        int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
@@ -207,49 +203,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        if (defgrp_idx < 0)
                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);
 
        /* Get org weights, assuming 0.0 for vertices not in given vgroup. */
        org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
@@ -271,7 +225,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        }
 
        /* Do masking. */
-       weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, ret, wmd->mask_constant,
+       weightvg_do_mask(numVerts, NULL, 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);
 
@@ -285,7 +239,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        MEM_freeN(dw);
 
        /* Return the vgroup-modified mesh. */
-       return ret;
+       return dm;
 }
 
 static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,