Fix (unreported) broken MixWeight modifier in debug builds.
defvert_find_index() & co now assert when '-1' invalid vgroup index is passed. We used to rely on NULL value returned in this case, but with the assert... The assert completely stalls blender actually (repeated for every vertex!). So much better to not call that func when vgroup index is invalid.
This commit is contained in:
parent
9ee1f96a0f
commit
66dd9fbf22
|
@ -247,7 +247,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws,
|
|||
for (i = 0; i < num; i++) {
|
||||
float w = weights[i];
|
||||
MDeformVert *dv = &dvert[indices ? indices[i] : i];
|
||||
MDeformWeight *dw = dws ? dws[i] : defvert_find_index(dv, defgrp_idx);
|
||||
MDeformWeight *dw = dws ? dws[i] : ((defgrp_idx >= 0) ? defvert_find_index(dv, defgrp_idx) : NULL);
|
||||
|
||||
/* Never allow weights out of [0.0, 1.0] range. */
|
||||
CLAMP(w, 0.0f, 1.0f);
|
||||
|
|
|
@ -267,7 +267,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
|
|||
defgrp_index = defgroup_name_index(ob, wmd->defgrp_name_a);
|
||||
if (defgrp_index == -1)
|
||||
return dm;
|
||||
/* Get seconf vgroup idx from its name, if given. */
|
||||
/* Get second vgroup idx from its name, if given. */
|
||||
if (wmd->defgrp_name_b[0] != (char)0) {
|
||||
defgrp_index_other = defgroup_name_index(ob, wmd->defgrp_name_b);
|
||||
if (defgrp_index_other == -1)
|
||||
|
@ -298,7 +298,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
|
|||
MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_index);
|
||||
if (dw) {
|
||||
tdw1[numIdx] = dw;
|
||||
tdw2[numIdx] = defvert_find_index(&dvert[i], defgrp_index_other);
|
||||
tdw2[numIdx] = (defgrp_index_other >= 0) ? defvert_find_index(&dvert[i], defgrp_index_other) : NULL;
|
||||
tidx[numIdx++] = i;
|
||||
}
|
||||
}
|
||||
|
@ -306,7 +306,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
|
|||
case MOD_WVG_SET_B:
|
||||
/* All vertices in second vgroup. */
|
||||
for (i = 0; i < numVerts; i++) {
|
||||
MDeformWeight *dw = defvert_find_index(&dvert[i], defgrp_index_other);
|
||||
MDeformWeight *dw = (defgrp_index_other >= 0) ? defvert_find_index(&dvert[i], defgrp_index_other) : NULL;
|
||||
if (dw) {
|
||||
tdw1[numIdx] = defvert_find_index(&dvert[i], defgrp_index);
|
||||
tdw2[numIdx] = dw;
|
||||
|
@ -318,7 +318,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
|
|||
/* All vertices in one vgroup or the other. */
|
||||
for (i = 0; i < numVerts; i++) {
|
||||
MDeformWeight *adw = defvert_find_index(&dvert[i], defgrp_index);
|
||||
MDeformWeight *bdw = defvert_find_index(&dvert[i], defgrp_index_other);
|
||||
MDeformWeight *bdw = (defgrp_index_other >= 0) ? defvert_find_index(&dvert[i], defgrp_index_other) : NULL;
|
||||
if (adw || bdw) {
|
||||
tdw1[numIdx] = adw;
|
||||
tdw2[numIdx] = bdw;
|
||||
|
@ -330,7 +330,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
|
|||
/* All vertices in both vgroups. */
|
||||
for (i = 0; i < numVerts; i++) {
|
||||
MDeformWeight *adw = defvert_find_index(&dvert[i], defgrp_index);
|
||||
MDeformWeight *bdw = defvert_find_index(&dvert[i], defgrp_index_other);
|
||||
MDeformWeight *bdw = (defgrp_index_other >= 0) ? defvert_find_index(&dvert[i], defgrp_index_other) : NULL;
|
||||
if (adw && bdw) {
|
||||
tdw1[numIdx] = adw;
|
||||
tdw2[numIdx] = bdw;
|
||||
|
@ -343,7 +343,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
|
|||
/* Use all vertices. */
|
||||
for (i = 0; i < numVerts; i++) {
|
||||
tdw1[i] = defvert_find_index(&dvert[i], defgrp_index);
|
||||
tdw2[i] = defvert_find_index(&dvert[i], defgrp_index_other);
|
||||
tdw2[i] = (defgrp_index_other >= 0) ? defvert_find_index(&dvert[i], defgrp_index_other) : NULL;
|
||||
}
|
||||
numIdx = -1;
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue