[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53986] trunk/blender/source/blender/ editors: fix [#33889] Unexpected weights after parenting with Empty Groups

Campbell Barton ideasman42 at gmail.com
Tue Jan 22 11:52:00 CET 2013


Revision: 53986
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53986
Author:   campbellbarton
Date:     2013-01-22 10:51:57 +0000 (Tue, 22 Jan 2013)
Log Message:
-----------
fix [#33889] Unexpected weights after parenting with Empty Groups

out of range dvert's are now cleared before adding new-empty groups.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/source/blender/editors/armature/editarmature.c
===================================================================
--- trunk/blender/source/blender/editors/armature/editarmature.c	2013-01-22 09:37:46 UTC (rev 53985)
+++ trunk/blender/source/blender/editors/armature/editarmature.c	2013-01-22 10:51:57 UTC (rev 53986)
@@ -4997,6 +4997,10 @@
 	bArmature *arm = par->data;
 
 	if (mode == ARM_GROUPS_NAME) {
+		/* its possible there are DWeight's outside the range of the current
+		 * objects deform groups, in this case the new groups wont be empty [#33889] */
+		ED_vgroup_data_clamp_range(ob->data, BLI_countlist(&ob->defbase));
+
 		/* Traverse the bone list, trying to create empty vertex 
 		 * groups corresponding to the bone.
 		 */

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2013-01-22 09:37:46 UTC (rev 53985)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2013-01-22 10:51:57 UTC (rev 53986)
@@ -227,6 +227,7 @@
 void                 ED_vgroup_clear(struct Object *ob);
 void                 ED_vgroup_select_by_name(struct Object *ob, const char *name);
 int                  ED_vgroup_data_create(struct ID *id);
+void                 ED_vgroup_data_clamp_range(struct ID *id, const int total);
 int                  ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
 int                  ED_vgroup_copy_array(struct Object *ob, struct Object *ob_from);
 void                 ED_vgroup_mirror(struct Object *ob, const short mirror_weights, const short flip_vgroups, const short all_vgroups);

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2013-01-22 09:37:46 UTC (rev 53985)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2013-01-22 10:51:57 UTC (rev 53986)
@@ -82,6 +82,7 @@
 static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *defgroup);
 static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg);
 static void vgroup_delete_all(Object *ob);
+static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot, const short use_vert_sel);
 
 static int vertex_group_use_vert_sel(Object *ob)
 {
@@ -183,6 +184,29 @@
 	}
 }
 
+/**
+ * Removes out of range MDeformWeights
+ */
+void ED_vgroup_data_clamp_range(ID *id, const int total)
+{
+	MDeformVert **dvert_arr;
+	int dvert_tot;
+
+	if (ED_vgroup_give_parray(id, &dvert_arr, &dvert_tot, false)) {
+		int i;
+		for (i = 0; i < dvert_tot; i++) {
+			MDeformVert *dv = dvert_arr[i];
+			int j;
+			for (j = 0; j < dv->totweight; j++) {
+				if (dv->dw[j].def_nr >= total) {
+					defvert_remove_group(dv, &dv->dw[j]);
+					j--;
+				}
+			}
+		}
+	}
+}
+
 static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot, const short use_vert_sel)
 {
 	*dvert_tot = 0;




More information about the Bf-blender-cvs mailing list