[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56800] trunk/blender/source/blender/ blenkernel/intern: Fix #35347: constraints with vertex group targets were not using the vertex group

Brecht Van Lommel brechtvanlommel at pandora.be
Tue May 14 18:22:54 CEST 2013


Revision: 56800
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56800
Author:   blendix
Date:     2013-05-14 16:22:53 +0000 (Tue, 14 May 2013)
Log Message:
-----------
Fix #35347: constraints with vertex group targets were not using the vertex group
weights, it assumed all weights were 1. This gave very different results with the
new bevel modifier due to slightly different vertex group interpolation.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/customdata.c

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2013-05-14 16:16:25 UTC (rev 56799)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2013-05-14 16:22:53 UTC (rev 56800)
@@ -380,29 +380,31 @@
 	if (dm) {
 		MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
 		int numVerts = dm->getNumVerts(dm);
-		int i, count = 0;
+		int i;
 		float co[3], nor[3];
 		
 		/* check that dvert is a valid pointers (just in case) */
 		if (dvert) {
 			MDeformVert *dv = dvert;
+			float weightsum = 0.0f;
+
 			/* get the average of all verts with that are in the vertex-group */
 			for (i = 0; i < numVerts; i++, dv++) {
 				MDeformWeight *dw = defvert_find_index(dv, defgroup);
-				if (dw && dw->weight != 0.0f) {
+
+				if (dw && dw->weight > 0.0f) {
 					dm->getVertCo(dm, i, co);
 					dm->getVertNo(dm, i, nor);
-					add_v3_v3(vec, co);
-					add_v3_v3(normal, nor);
-					count++;
-					
+					madd_v3_v3fl(vec, co, dw->weight);
+					madd_v3_v3fl(normal, nor, dw->weight);
+					weightsum += dw->weight;
 				}
 			}
 
 			/* calculate averages of normal and coordinates */
-			if (count > 0) {
-				mul_v3_fl(vec, 1.0f / count);
-				mul_v3_fl(normal, 1.0f / count);
+			if (weightsum > 0) {
+				mul_v3_fl(vec, 1.0f / weightsum);
+				mul_v3_fl(normal, 1.0f / weightsum);
 			}
 			
 			

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2013-05-14 16:16:25 UTC (rev 56799)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2013-05-14 16:22:53 UTC (rev 56800)
@@ -239,12 +239,16 @@
 
 		for (j = 0; j < source->totweight; ++j) {
 			MDeformWeight *dw = &source->dw[j];
+			float weight = dw->weight * interp_weight;
 
+			if (weight == 0.0f)
+				continue;
+
 			for (node = dest_dw; node; node = node->next) {
 				MDeformWeight *tmp_dw = (MDeformWeight *)node->link;
 
 				if (tmp_dw->def_nr == dw->def_nr) {
-					tmp_dw->weight += dw->weight * interp_weight;
+					tmp_dw->weight += weight;
 					break;
 				}
 			}
@@ -254,7 +258,7 @@
 				MDeformWeight *tmp_dw = MEM_callocN(sizeof(*tmp_dw),
 				                                    "layerInterp_mdeformvert tmp_dw");
 				tmp_dw->def_nr = dw->def_nr;
-				tmp_dw->weight = dw->weight * interp_weight;
+				tmp_dw->weight = weight;
 				BLI_linklist_prepend(&dest_dw, tmp_dw);
 				totweight++;
 			}




More information about the Bf-blender-cvs mailing list