[Bf-blender-cvs] [66dd9fb] master: Fix (unreported) broken MixWeight modifier in debug builds.

Bastien Montagne noreply at git.blender.org
Mon Jul 20 17:05:45 CEST 2015


Commit: 66dd9fbf229f78207f2f7a8701bcb2da46328875
Author: Bastien Montagne
Date:   Mon Jul 20 16:55:46 2015 +0200
Branches: master
https://developer.blender.org/rB66dd9fbf229f78207f2f7a8701bcb2da46328875

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.

===================================================================

M	source/blender/modifiers/intern/MOD_weightvg_util.c
M	source/blender/modifiers/intern/MOD_weightvgmix.c

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c
index c9de1dc..da7230e 100644
--- a/source/blender/modifiers/intern/MOD_weightvg_util.c
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.c
@@ -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);
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
index 3d60c4a..0649998 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -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;




More information about the Bf-blender-cvs mailing list