[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45001] trunk/blender/source/blender: Fix #30531: mirror modifier with vertex groups did not add both the left and

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Mar 19 22:09:20 CET 2012


Revision: 45001
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45001
Author:   blendix
Date:     2012-03-19 21:09:16 +0000 (Mon, 19 Mar 2012)
Log Message:
-----------
Fix #30531: mirror modifier with vertex groups did not add both the left and
right groups to merged vertices, only one. This made the result asymmetric,
now merged vertices will be part of both groups with half weight.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/modifiers/intern/MOD_mirror.c

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2012-03-19 20:47:17 UTC (rev 45000)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2012-03-19 21:09:16 UTC (rev 45001)
@@ -64,6 +64,7 @@
                          const int *flip_map, const int flip_map_len, const int use_verify);
 void defvert_remap (struct MDeformVert *dvert, int *map, const int map_len);
 void defvert_flip(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len);
+void defvert_flip_merged(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len);
 void defvert_normalize(struct MDeformVert *dvert);
 void defvert_normalize_lock(struct MDeformVert *dvert, const int def_nr_lock);
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2012-03-19 20:47:17 UTC (rev 45000)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2012-03-19 21:09:16 UTC (rev 45001)
@@ -260,7 +260,30 @@
 	}
 }
 
+void defvert_flip_merged(MDeformVert *dvert, const int *flip_map, const int flip_map_len)
+{
+	MDeformWeight *dw, *copydw;
+	float weight;
+	int i, totweight = dvert->totweight;
 
+	/* copy weights */
+	for (dw= dvert->dw, i=0; i<totweight; dw++, i++) {
+		if (dw->def_nr < flip_map_len) {
+			if (flip_map[dw->def_nr] >= 0) {
+				copydw= defvert_verify_index(dvert, flip_map[dw->def_nr]);
+				dw= &dvert->dw[i]; /* in case array got realloced */
+
+				/* distribute weights: if only one of the vertex groups was
+				   assigned this will halve the weights, otherwise it gets
+				   evened out. this keeps it proportional to other groups */
+				weight = 0.5f*(copydw->weight + dw->weight);
+				copydw->weight= weight;
+				dw->weight= weight;
+			}
+		}
+	}
+}
+
 bDeformGroup *defgroup_find_name(Object *ob, const char *name)
 {
 	/* return a pointer to the deform group with this name

Modified: trunk/blender/source/blender/modifiers/intern/MOD_mirror.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_mirror.c	2012-03-19 20:47:17 UTC (rev 45000)
+++ trunk/blender/source/blender/modifiers/intern/MOD_mirror.c	2012-03-19 21:09:16 UTC (rev 45001)
@@ -272,8 +272,12 @@
 		flip_map= defgroup_flip_map(ob, &flip_map_len, FALSE);
 		
 		if (flip_map) {
-			for (i = maxVerts; i-- > 0; dvert++) {
-				defvert_flip(dvert, flip_map, flip_map_len);
+			for (i = 0; i < maxVerts; dvert++, i++) {
+				/* merged vertices get both groups, others get flipped */
+				if(do_vtargetmap && (vtargetmap[i] != -1))
+					defvert_flip_merged(dvert, flip_map, flip_map_len);
+				else
+					defvert_flip(dvert, flip_map, flip_map_len);
 			}
 
 			MEM_freeN(flip_map);




More information about the Bf-blender-cvs mailing list