Revision: 42728
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42728
Author:   mont29
Date:     2011-12-19 14:09:36 +0000 (Mon, 19 Dec 2011)
Log Message:
-----------
Much cleaner and satisfying code in weightvg modifiers' "init": copy only the 
CD_DEFORMVERT data layer (if it's the org one), and not the whole DerivedMesh!

Quite oddly, for Proximity mod, this increases the performances of the apply 
func (about 20-25%, e.g. from 0.04 to 0.03 sec), but decreases the global 
framerate (e.g. in TEST_5 scene of testing file, I lose about 7%, from 4.6 to 
4.3fps (open ATI driver)...).

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c
    trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c
    trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c    
2011-12-19 12:54:06 UTC (rev 42727)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c    
2011-12-19 14:09:36 UTC (rev 42728)
@@ -177,10 +177,7 @@
                                   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 @@
        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,50 +203,8 @@
        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;
+       dvert = CustomData_duplicate_referenced_layer(&dm->vertData, 
CD_MDEFORMVERT, numVerts);
 
-       /* 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);
-       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");
        new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, 
new_w");
@@ -271,7 +225,7 @@
        }
 
        /* 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 @@
        MEM_freeN(dw);
 
        /* Return the vgroup-modified mesh. */
-       return ret;
+       return dm;
 }
 
 static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c     
2011-12-19 12:54:06 UTC (rev 42727)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgmix.c     
2011-12-19 14:09:36 UTC (rev 42728)
@@ -219,10 +219,7 @@
                                   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 @@
        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,50 +250,8 @@
                        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;
+       dvert = CustomData_duplicate_referenced_layer(&dm->vertData, 
CD_MDEFORMVERT, numVerts);
 
-       /* 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);
-       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");
        tdw1 = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGMix 
Modifier, tdw1");
@@ -364,8 +318,6 @@
                MEM_freeN(tdw1);
                MEM_freeN(tdw2);
                MEM_freeN(tidx);
-               if (rel_ret)
-                       ret->release(ret);
                return dm;
        }
        if (numIdx != -1) {
@@ -400,7 +352,7 @@
        }
 
        /* 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 @@
                MEM_freeN(indices);
 
        /* Return the vgroup-modified mesh. */
-       return ret;
+       return dm;
 }
 
 static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,

Modified: trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c       
2011-12-19 12:54:06 UTC (rev 42727)
+++ trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c       
2011-12-19 14:09:36 UTC (rev 42728)
@@ -28,11 +28,17 @@
  *  \ingroup modifiers
  */
 
+#define DO_PROFILE 0
+
 #include "BLI_editVert.h"
 #include "BLI_math.h"
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
 
+#if DO_PROFILE
+       #include "PIL_time.h"
+#endif
+
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
@@ -334,10 +340,7 @@
                                   int UNUSED(useRenderParams), int 
UNUSED(isFinalCalc))
 {
        WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) 
md;
-       DerivedMesh *dm = derivedData, *ret = NULL;
-#if 0
-       Mesh *ob_m = NULL;
-#endif
+       DerivedMesh *dm = derivedData;
        MDeformVert *dvert = NULL;
        MDeformWeight **dw, **tdw;
        int numVerts;
@@ -350,8 +353,11 @@
        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! */
 
+#if DO_PROFILE
+       TIMEIT_START(perf)
+#endif
+
        /* Get number of verts. */
        numVerts = dm->getNumVerts(dm);
 
@@ -371,50 +377,8 @@
        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;
+       dvert = CustomData_duplicate_referenced_layer(&dm->vertData, 
CD_MDEFORMVERT, numVerts);
 
-       /* 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);
-       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.
         */
        tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGProximity Modifier, 
tidx");
@@ -433,8 +397,6 @@
                MEM_freeN(tidx);
                MEM_freeN(tw);
                MEM_freeN(tdw);
-               if (rel_ret)
-                       ret->release(ret);
                return dm;
        }
        indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity 
Modifier, indices");
@@ -455,7 +417,7 @@
                 */
                float (*tv_cos)[3] = MEM_mallocN(sizeof(float[3]) * numVerts, 
"WeightVGProximity Modifier, tv_cos");
                v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, 
"WeightVGProximity Modifier, v_cos");
-               ret->getVertCos(ret, tv_cos);
+               dm->getVertCos(dm, tv_cos);
                for (i = 0; i < numIdx; i++)
                        copy_v3_v3(v_cos[i], tv_cos[indices[i]]);
                MEM_freeN(tv_cos);
@@ -524,7 +486,7 @@
        do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type);
 
        /* 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,

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to