vgroup_modifiers: coded a way to test whether the dm needs to be copied (i.e. if...
authorBastien Montagne <montagne29@wanadoo.fr>
Wed, 27 Jul 2011 18:48:23 +0000 (18:48 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Wed, 27 Jul 2011 18:48:23 +0000 (18:48 +0000)
However, as this piece of code tends to slow down things (see e.g. scene 5 of WeightVG test blend file), I deactivated it for now...

source/blender/modifiers/intern/MOD_weightvgedit.c
source/blender/modifiers/intern/MOD_weightvgmix.c
source/blender/modifiers/intern/MOD_weightvgproximity.c

index c8d7ab52ce898a6f647378b53d777c8d2e27e601..e84ecffa74b45064990af5d9b6744cc2aa1c584d 100644 (file)
@@ -190,8 +190,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
        WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
-       DerivedMesh *dm = derivedData;
-       DerivedMesh *ret;
+       DerivedMesh *dm = derivedData, *ret = NULL;
+       Mesh *ob_m = NULL;
        MDeformVert *dvert = NULL;
        float *org_w = NULL; /* Array original weights. */
        float *new_w = NULL; /* Array new weights. */
@@ -217,30 +217,54 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        if ((numVerts == 0) || (ob->defbase.first == NULL))
                return dm;
 
-       /* Create a copy of our dmesh.
-        * TODO: This should be done only if needed, i.e. if dm has the org data !
+       /* Get vgroup idx from its name. */
+       defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+       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 (1) {
-               /* XXX Seems to create problems with weightpaint mode... */
+#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;
-
-       /* Get vgroup idx from its name. */
-       defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
-
-       /* Get actual dverts (ie vertex group data). */
-       if (defgrp_idx >= 0)
-               dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data… */
-       if ((defgrp_idx < 0) || (dvert == NULL)) {
+#else
+       ret = CDDM_copy(dm);
+       rel_ret = 1;
+       dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+       if (dvert == NULL) {
                if (rel_ret)
                        ret->release(ret);
                return dm;
        }
+#endif
 
        /* Get org weights, assuming 0.0 for vertices not in given vgroup. */
        org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
index c4f107de72e85bf6b5f8755a24b0e396319f5333..f99060bdf63738de6b3eb8d306e82a4a16b61579 100644 (file)
@@ -220,8 +220,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
        WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
-       DerivedMesh *dm = derivedData;
-       DerivedMesh *ret;
+       DerivedMesh *dm = derivedData, *ret = NULL;
+       Mesh *ob_m = NULL;
        MDeformVert *dvert = NULL;
        int numVerts;
        int defgrp_idx, defgrp_idx2 = -1;
@@ -241,34 +241,60 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        if ((numVerts == 0) || (ob->defbase.first == NULL))
                return dm;
 
-       /* Create a copy of our dmesh.
-        * TODO: This should be done only if needed !
+       /* Get vgroup idx from its name. */
+       defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+       if (defgrp_idx < 0)
+               return dm;
+       /* Get seconf vgroup idx from its name, if given. */
+       if (wmd->defgrp_name2[0] != (char)0) {
+               defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2);
+               if (defgrp_idx2 < 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.
         */
-       if (1) {
-               /* XXX Seems to create problems with weightpaint mode... */
+       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;
-
-       /* Get first vgroup idx from its name. */
-       defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
-
-       /* Get seconf vgroup idx from its name, if given. */
-       if (wmd->defgrp_name2)
-               defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2);
-
-       /* Get actual dverts (ie vertex group data). */
-       if (defgrp_idx >= 0)
-               dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data… */
-       if ((defgrp_idx < 0) || (dvert == NULL)) {
+#else
+       ret = CDDM_copy(dm);
+       rel_ret = 1;
+       dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+       if (dvert == NULL) {
                if (rel_ret)
                        ret->release(ret);
                return dm;
        }
+#endif
 
        /* Find out which vertices to work on. */
        tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
index 06ffb5e451055db7996bc3a300670bb8efae57ea..80524eec9af9ff9a64e33dbebdb6642cf26a1cde 100644 (file)
@@ -314,12 +314,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                   int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
 {
        WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
-       DerivedMesh *dm = derivedData;
-       DerivedMesh *ret;
+       DerivedMesh *dm = derivedData, *ret = NULL;
+       Mesh *ob_m = NULL;
        MDeformVert *dvert = NULL;
        int numVerts;
        float (*v_cos)[3] = NULL; /* The vertices coordinates. */
-       Object *obr; /* Our target object. */
+       Object *obr = NULL; /* Our target object. */
        int defgrp_idx;
        float *tw = NULL;
        float *org_w = NULL;
@@ -338,32 +338,59 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        if ((numVerts == 0) || (ob->defbase.first == NULL))
                return dm;
 
-       /* Create a copy of our dmesh.
-        * TODO: This should be done only if needed !
+       /* Get our target object. */
+       obr = wmd->proximity_ob_target;
+       if (obr == NULL)
+               return dm;
+
+       /* Get vgroup idx from its name. */
+       defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+       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 (1) {
-               /* XXX Seems to create problems with weightpaint mode... */
+#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;
-
-       /* Get vgroup idx from its name. */
-       defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
-
-       /* Get actual dverts (ie vertex group data). */
-       if (defgrp_idx >= 0)
-               dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
-       /* Get our target object. */
-       obr = wmd->proximity_ob_target;
-       /* If no dverts or target object, return unmodified data… */
-       if ((defgrp_idx < 0) || (dvert == NULL) || (!obr)) {
+#else
+       ret = CDDM_copy(dm);
+       rel_ret = 1;
+       dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+       if (dvert == NULL) {
                if (rel_ret)
                        ret->release(ret);
                return dm;
        }
+#endif
 
        /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight.
         */