Revision: 39918
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39918
Author:   campbellbarton
Date:     2011-09-05 05:28:32 +0000 (Mon, 05 Sep 2011)
Log Message:
-----------
- vertex group modifiers isDisabled functions were incorrect, need to check if 
the string is set: == NULL will never be true.
- was doing NULL checks on freeing memory in cases where the values were 
already accessed (blender would have crashed anyway), so remove the NULL checks.
- use deform.c api weight functions to replace inline weight lookups in some 
cases.
- change if checks in weightvg_do_mask() so its more obvious whats going on.

Modified Paths:
--------------
    
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c
    
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c

Modified: 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c
===================================================================
--- 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c   
    2011-09-05 04:53:23 UTC (rev 39917)
+++ 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c   
    2011-09-05 05:28:32 UTC (rev 39918)
@@ -66,7 +66,6 @@
                       const char *tex_uvlayer_name)
 {
        int ref_didx;
-       MDeformVert *dvert = NULL;
        int i;
 
        /* If influence factor is null, nothing to do! */
@@ -139,16 +138,16 @@
                }
 
                MEM_freeN(tex_co);
-               return;
        }
+       else if ((ref_didx = defgroup_name_index(ob, defgrp_name)) != -1) {
+               MDeformVert *dvert = NULL;
 
-       /* Check whether we want to set vgroup weights from a constant weight 
factor or a vertex
-        * group.
-        */
-       /* Get vgroup idx from its name. */
-       ref_didx = defgroup_name_index(ob, defgrp_name);
-       /* Proceed only if vgroup is valid, else use constant factor. */
-       if (ref_didx >= 0) {
+               /* Check whether we want to set vgroup weights from a constant 
weight factor or a vertex
+                * group.
+                */
+               /* Get vgroup idx from its name. */
+
+               /* Proceed only if vgroup is valid, else use constant factor. */
                /* Get actual dverts (ie vertex group data). */
                dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
                /* Proceed only if vgroup is valid, else assume factor = O. */
@@ -157,23 +156,18 @@
                /* For each weight (vertex), make the mix between org and new 
weights. */
                for (i = 0; i < num; i++) {
                        int idx = indices ? indices[i] : i;
-                       int j;
-                       for (j = 0; j < dvert[idx].totweight; j++) {
-                               if(dvert[idx].dw[j].def_nr == ref_didx) {
-                                       float f = dvert[idx].dw[j].weight * 
fact;
-                                       org_w[i] = (new_w[i] * f) + (org_w[i] * 
(1.0-f));
-                                       break;
-                               }
-                       }
+                       const float f= defvert_find_weight(&dvert[idx], 
ref_didx) * fact;
+                       org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0f-f));
                        /* If that vertex is not in ref vgroup, assume null 
factor, and hence do nothing! */
                }
-               return;
        }
-
-       /* Default "influence" behavior. */
-       /* For each weight (vertex), make the mix between org and new weights. 
*/
-       for (i = 0; i < num; i++) {
-               org_w[i] = (new_w[i] * fact) + (org_w[i] * (1.0-fact));
+       else {
+               /* Default "influence" behavior. */
+               /* For each weight (vertex), make the mix between org and new 
weights. */
+               const float ifact= 1.0-fact;
+               for (i = 0; i < num; i++) {
+                       org_w[i] = (new_w[i] * fact) + (org_w[i] * ifact);
+               }
        }
 }
 
@@ -189,7 +183,7 @@
 
        for (i = 0; i < num; i++) {
                int j;
-               char add2vg = do_add;
+               int add2vg = do_add;
                float w = weights[i];
                MDeformVert *dv = &dvert[indices ? indices[i] : i];
                MDeformWeight *newdw;
@@ -207,6 +201,8 @@
                        if (dv->dw[j].def_nr == defgrp_idx) {
                                /* Remove the vertex from this vgroup if 
needed. */
                                if (do_rem && w < rem_thresh) {
+                                       /* TODO, move this into deform.c to 
make into a generic function */
+
                                        dv->totweight--;
                                        /* If there are still other deform 
weights attached to this vert then remove
                                         * this deform weight, and reshuffle 
the others.
@@ -230,14 +226,16 @@
                                else {
                                        dv->dw[j].weight = w;
                                }
-                               add2vg = 0;
+                               add2vg = FALSE;
                                break;
                        }
                }
 
                /* If the vert wasn't in the deform group, add it if needed!
                 */
-               if (add2vg && w > add_thresh) {
+               if ((add2vg == TRUE) && w > add_thresh) {
+                       /* TODO, mvoe into deform.c and make into a generic 
function, this assumes the vertex
+                        * groups have already been checked, so this has to 
remain low level */
                        newdw = 
MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, 
deformWeight");
                        if(dv->dw) {
                                memcpy(newdw, dv->dw, 
sizeof(MDeformWeight)*dv->totweight);

Modified: 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c
===================================================================
--- 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c    
    2011-09-05 04:53:23 UTC (rev 39917)
+++ 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c    
    2011-09-05 05:28:32 UTC (rev 39918)
@@ -173,7 +173,7 @@
 {
        WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
        /* If no vertex group, bypass. */
-       return (wmd->defgrp_name == NULL);
+       return (wmd->defgrp_name[0] == '\0');
 }
 
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh 
*derivedData,
@@ -185,17 +185,16 @@
        Mesh *ob_m = NULL;
 #endif
        MDeformVert *dvert = NULL;
-       float *org_w = NULL; /* Array original weights. */
-       float *new_w = NULL; /* Array new weights. */
+       float *org_w; /* Array original weights. */
+       float *new_w; /* Array new weights. */
        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! */
-       float *mapf = NULL; /* Cache for mapping factors. */
        /* Flags. */
-       char do_map = wmd->edit_flags & MOD_WVG_EDIT_CMAP;
-       char do_add = wmd->edit_flags & MOD_WVG_EDIT_ADD2VG;
-       char do_rem = wmd->edit_flags & MOD_WVG_EDIT_REMFVG;
+       int do_map = (wmd->edit_flags & MOD_WVG_EDIT_CMAP)   != 0;
+       int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
+       int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
 
        /* Get number of verts. */
        numVerts = dm->getNumVerts(dm);
@@ -259,17 +258,17 @@
        org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, 
org_w");
        new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, 
org_w");
        for (i = 0; i < numVerts; i++) {
-               int j;
+               MDeformWeight *dw= defvert_find_index(&dvert[i], defgrp_idx);
                org_w[i] = new_w[i] = wmd->default_weight;
-               for (j = 0; j < dvert[i].totweight; j++) {
-                       if(dvert[i].dw[j].def_nr == defgrp_idx) {
-                               org_w[i] = new_w[i] = dvert[i].dw[j].weight;
-                               break;
-                       }
+
+               if(dw) {
+                       org_w[i] = new_w[i] = dw->weight;
                }
+
                /* Do mapping. */
-               if (do_map)
+               if (do_map) {
                        new_w[i] = curvemapping_evaluateF(wmd->cmap_curve, 0, 
new_w[i]);
+               }
        }
 
        /* Do masking. */
@@ -282,12 +281,8 @@
                           do_rem, wmd->rem_threshold);
 
        /* Freeing stuff. */
-       if (org_w)
-               MEM_freeN(org_w);
-       if (new_w)
-               MEM_freeN(new_w);
-       if (mapf)
-               MEM_freeN(mapf);
+       MEM_freeN(org_w);
+       MEM_freeN(new_w);
 
        /* Return the vgroup-modified mesh. */
        return ret;

Modified: 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c 
2011-09-05 04:53:23 UTC (rev 39917)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c 
2011-09-05 05:28:32 UTC (rev 39918)
@@ -217,7 +217,7 @@
 {
        WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
        /* If no vertex group, bypass. */
-       return (wmd->defgrp_name_a == NULL);
+       return (wmd->defgrp_name_a[0] == '\0');
 }
 
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh 
*derivedData,
@@ -231,8 +231,8 @@
        MDeformVert *dvert = NULL;
        int numVerts;
        int defgrp_idx, defgrp_idx2 = -1;
-       float *org_w = NULL;
-       float *new_w = NULL;
+       float *org_w;
+       float *new_w;
        int *tidx, *indices = NULL;
        int numIdx = 0;
        int i, j;
@@ -416,13 +416,12 @@
        /* Update (add to) vgroup.
         * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to 
add vertices to vgroup.
         */
-       weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 1, 
-FLT_MAX, 0, 0.0f);
+       weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, TRUE, 
-FLT_MAX, 0, 0.0f);
 
        /* Freeing stuff. */
-       if (org_w)
-               MEM_freeN(org_w);
-       if (new_w)
-               MEM_freeN(new_w);
+       MEM_freeN(org_w);
+       MEM_freeN(new_w);
+
        if (indices)
                MEM_freeN(indices);
 

Modified: 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c
===================================================================
--- 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c
   2011-09-05 04:53:23 UTC (rev 39917)
+++ 
branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c
   2011-09-05 05:28:32 UTC (rev 39918)
@@ -327,7 +327,7 @@
 {
        WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) 
md;
        /* If no vertex group, bypass. */
-       if (wmd->defgrp_name == NULL) return 1;
+       if (wmd->defgrp_name[0] == '\0') return 1;
        /* If no target object, bypass. */
        return (wmd->proximity_ob_target == NULL);
 }
@@ -505,14 +505,10 @@
        weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 
0, 0.0f);
 
        /* Freeing stuff. */
-       if (org_w)
-               MEM_freeN(org_w);
-       if (new_w)
-               MEM_freeN(new_w);
-       if (indices)
-               MEM_freeN(indices);
-       if (v_cos)
-               MEM_freeN(v_cos);
+       MEM_freeN(org_w);
+       MEM_freeN(new_w);
+       MEM_freeN(indices);
+       MEM_freeN(v_cos);
 
        /* Return the vgroup-modified mesh. */
        return ret;

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

Reply via email to