diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-09-05 09:28:32 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-09-05 09:28:32 +0400 |
commit | e5209c205974b03f1090bf73414a82072a6a0d5b (patch) | |
tree | 7fcb8b45cd1f58f33464cbd50326f6bf88dd9e29 /source/blender/modifiers/intern/MOD_weightvg_util.c | |
parent | 2c740a9b5e07faec543d30c85f16f6bbe6fa0c77 (diff) |
- 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.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_weightvg_util.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_weightvg_util.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index dc6ec638b4c..8952d70d323 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -66,7 +66,6 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object 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 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object } 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 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object /* 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 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, 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 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, 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 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, 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); |