WeightVG: Made Edit and Proximity also use the new weightvg_update_vg MDeformWeight...
authorBastien Montagne <montagne29@wanadoo.fr>
Thu, 15 Sep 2011 17:28:18 +0000 (17:28 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Thu, 15 Sep 2011 17:28:18 +0000 (17:28 +0000)
Also added to Proximity a check in case vgroup would have no vertices in it.
Plus a few minor edits...

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

index c856c95..233ad8b 100644 (file)
@@ -187,6 +187,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        Mesh *ob_m = NULL;
 #endif
        MDeformVert *dvert = NULL;
+       MDeformWeight **dw = NULL;
        float *org_w; /* Array original weights. */
        float *new_w; /* Array new weights. */
        int numVerts;
@@ -257,13 +258,15 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 
        /* 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, org_w");
+       new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, new_w");
+       dw = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGEdit Modifier, dw");
        for (i = 0; i < numVerts; i++) {
-               MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_idx);
-               org_w[i] = new_w[i] = wmd->default_weight;
-
-               if(dw) {
-                       org_w[i] = new_w[i] = dw->weight;
+               dw[i] = defvert_find_index(&dvert[i], defgrp_idx);
+               if(dw[i]) {
+                       org_w[i] = new_w[i] = dw[i]->weight;
+               }
+               else {
+                       org_w[i] = new_w[i] = wmd->default_weight;
                }
        }
 
@@ -278,12 +281,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                         wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
 
        /* Update/add/remove from vgroup. */
-       weightvg_update_vg(dvert, defgrp_idx, NULL, numVerts, NULL, org_w, do_add, wmd->add_threshold,
+       weightvg_update_vg(dvert, defgrp_idx, dw, numVerts, NULL, org_w, do_add, wmd->add_threshold,
                           do_rem, wmd->rem_threshold);
 
        /* Freeing stuff. */
        MEM_freeN(org_w);
        MEM_freeN(new_w);
+       MEM_freeN(dw);
 
        /* Return the vgroup-modified mesh. */
        return ret;
index 73c7134..283e812 100644 (file)
@@ -412,7 +412,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        /* 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, dw1, numIdx, indices, org_w, TRUE, -FLT_MAX, 0, 0.0f);
+       weightvg_update_vg(dvert, defgrp_idx, dw1, numIdx, indices, org_w, TRUE, -FLT_MAX, FALSE, 0.0f);
 
        /* Freeing stuff. */
        MEM_freeN(org_w);
index a2b10ef..76be25a 100644 (file)
@@ -344,6 +344,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        Mesh *ob_m = NULL;
 #endif
        MDeformVert *dvert = NULL;
+       MDeformWeight **dw, **tdw;
        int numVerts;
        float (*v_cos)[3] = NULL; /* The vertices coordinates. */
        Object *obr = NULL; /* Our target object. */
@@ -353,7 +354,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
        float *new_w =NULL;
        int *tidx, *indices = NULL;
        int numIdx = 0;
-       int i, j;
+       int i;
        char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
 
        /* Get number of verts. */
@@ -423,22 +424,34 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
         */
        tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGProximity Modifier, tidx");
        tw = MEM_mallocN(sizeof(float) * numVerts, "WeightVGProximity Modifier, tw");
+       tdw = MEM_mallocN(sizeof(MDeformWeight*) * numVerts, "WeightVGProximity Modifier, tdw");
        for (i = 0; i < numVerts; i++) {
-               for (j = 0; j < dvert[i].totweight; j++) {
-                       if(dvert[i].dw[j].def_nr == defgrp_idx) {
-                               tidx[numIdx] = i;
-                               tw[numIdx++] = dvert[i].dw[j].weight;
-                               break;
-                       }
+               MDeformWeight *_dw = defvert_find_index(&dvert[i], defgrp_idx);
+               if(_dw) {
+                       tidx[numIdx] = i;
+                       tw[numIdx] = _dw->weight;
+                       tdw[numIdx++] = _dw;
                }
        }
+       /* If no vertices found, return org data! */
+       if(numIdx == 0) {
+               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");
        memcpy(indices, tidx, sizeof(int) * numIdx);
        org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w");
        new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, new_w");
        memcpy(org_w, tw, sizeof(float) * numIdx);
+       dw = MEM_mallocN(sizeof(MDeformWeight*) * numIdx, "WeightVGProximity Modifier, dw");
+       memcpy(dw, tdw, sizeof(MDeformWeight*) * numIdx);
        MEM_freeN(tidx);
        MEM_freeN(tw);
+       MEM_freeN(tdw);
 
        /* Get our vertex coordinates. */
        v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos");
@@ -447,7 +460,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
 
        /* Compute wanted distances. */
        if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) {
-               float dist = get_ob2ob_distance(ob, obr);
+               const float dist = get_ob2ob_distance(ob, obr);
                for(i = 0; i < numIdx; i++)
                        new_w[i] = dist;
        }
@@ -482,8 +495,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                                                       target_dm, &loc2trgt);
                                for(i = 0; i < numIdx; i++) {
                                        new_w[i] = dists_v ? dists_v[i] : FLT_MAX;
-                                       new_w[i] = dists_e ? minf(dists_e[i], new_w[i]) : new_w[i];
-                                       new_w[i] = dists_f ? minf(dists_f[i], new_w[i]) : new_w[i];
+                                       if(dists_e)
+                                               new_w[i] = minf(dists_e[i], new_w[i]);
+                                       if(dists_f)
+                                               new_w[i] = minf(dists_f[i], new_w[i]);
                                }
                                if(dists_v) MEM_freeN(dists_v);
                                if(dists_e) MEM_freeN(dists_e);
@@ -508,11 +523,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
                         wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
 
        /* Update vgroup. Note we never add nor remove vertices from vgroup here. */
-       weightvg_update_vg(dvert, defgrp_idx, NULL, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f);
+       weightvg_update_vg(dvert, defgrp_idx, dw, numIdx, indices, org_w, FALSE, 0.0f, FALSE, 0.0f);
 
        /* Freeing stuff. */
        MEM_freeN(org_w);
        MEM_freeN(new_w);
+       MEM_freeN(dw);
        MEM_freeN(indices);
        MEM_freeN(v_cos);