[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42288] trunk/blender/source/blender: fix [#29450] Mirror Vertex Groups issue

Campbell Barton ideasman42 at gmail.com
Wed Nov 30 08:11:31 CET 2011


Revision: 42288
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42288
Author:   campbellbarton
Date:     2011-11-30 07:11:29 +0000 (Wed, 30 Nov 2011)
Log Message:
-----------
fix [#29450] Mirror Vertex Groups issue

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2011-11-30 06:27:38 UTC (rev 42287)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2011-11-30 07:11:29 UTC (rev 42288)
@@ -57,6 +57,7 @@
 float  defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num);
 
 void defvert_copy(struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
+void defvert_copy_index(struct MDeformVert *dv_dst, const struct MDeformVert *dv_src, const int defgroup);
 void defvert_sync(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, int use_verify);
 void defvert_sync_mapped(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, const int *flip_map, const int flip_map_len, const int use_verify);
 void defvert_remap (struct MDeformVert *dvert, int *map);

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2011-11-30 06:27:38 UTC (rev 42287)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2011-11-30 07:11:29 UTC (rev 42288)
@@ -94,6 +94,31 @@
 	}
 }
 
+/* copy an index from one dvert to another
+ * - do nothing if neither are set.
+ * - add destination weight if needed.
+ */
+void defvert_copy_index (MDeformVert *dv_dst, const MDeformVert *dv_src, const int defgroup)
+{
+	MDeformWeight *dw_src, *dw_dst;
+
+	dw_src= defvert_find_index(dv_src, defgroup);
+
+	if (dw_src) {
+		/* source is valid, verify destination */
+		dw_dst= defvert_verify_index(dv_dst, defgroup);
+		dw_dst->weight= dw_src->weight;
+	}
+	else {
+		/* source was NULL, assign zero, could also remove */
+		dw_dst= defvert_find_index(dv_dst, defgroup);
+
+		if (dw_dst) {
+			dw_dst->weight= 0.0f;
+		}
+	}
+}
+
 /* only sync over matching weights, don't add or remove groups
  * warning, loop within loop.
  */

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2011-11-30 06:27:38 UTC (rev 42287)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2011-11-30 07:11:29 UTC (rev 42288)
@@ -1576,13 +1576,21 @@
 		}
 	}
 	else {
-		/* dvert should always be the target */
+		/* dvert should always be the target, only swaps pointer */
 		if(sel_mirr) {
 			SWAP(MDeformVert *, dvert, dvert_mirr);
 		}
 
-		if(mirror_weights)
-			defvert_copy(dvert, dvert_mirr);
+		if(mirror_weights) {
+			if (all_vgroups) {
+				defvert_copy(dvert, dvert_mirr);
+			}
+			else {
+				defvert_copy_index(dvert, dvert_mirr, act_vgroup);
+			}
+		}
+
+		/* flip map already modified for 'all_vgroups' */
 		if(flip_vgroups) {
 			defvert_flip(dvert, flip_map, flip_map_len);
 		}




More information about the Bf-blender-cvs mailing list