[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37302] trunk/blender/source/blender/ editors: fix for vertex group copy to selected

Campbell Barton ideasman42 at gmail.com
Tue Jun 7 20:04:03 CEST 2011


Revision: 37302
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37302
Author:   campbellbarton
Date:     2011-06-07 18:04:03 +0000 (Tue, 07 Jun 2011)
Log Message:
-----------
fix for vertex group copy to selected
- was using un-initialized stack memory if the source / target object had no vertex group.
- if the target object had no vertex groups it would fails silently (not a bug but not very good functionality)
- added an error message if any copying fails.

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

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2011-06-07 17:59:38 UTC (rev 37301)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2011-06-07 18:04:03 UTC (rev 37302)
@@ -206,7 +206,7 @@
 struct bDeformGroup		*ED_vgroup_add_name(struct Object *ob, const char *name);
 void 					ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup);
 void					ED_vgroup_select_by_name(struct Object *ob, const char *name);
-void					ED_vgroup_data_create(struct ID *id);
+int						ED_vgroup_data_create(struct ID *id);
 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);

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2011-06-07 17:59:38 UTC (rev 37301)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2011-06-07 18:04:03 UTC (rev 37302)
@@ -77,6 +77,7 @@
 static void vgroup_remap_update_users(Object *ob, int *map);
 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 Lattice *vgroup_edit_lattice(Object *ob)
 {
@@ -138,22 +139,30 @@
 		vgroup_delete_object_mode(ob, dg);
 }
 
-void ED_vgroup_data_create(ID *id)
+int ED_vgroup_data_create(ID *id)
 {
 	/* create deform verts */
 
 	if(GS(id->name)==ID_ME) {
 		Mesh *me= (Mesh *)id;
 		me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, me->totvert);
+		return TRUE;
 	}
 	else if(GS(id->name)==ID_LT) {
 		Lattice *lt= (Lattice *)id;
 		lt->dvert= MEM_callocN(sizeof(MDeformVert)*lt->pntsu*lt->pntsv*lt->pntsw, "lattice deformVert");
+		return TRUE;
 	}
+	else {
+		return FALSE;
+	}
 }
 
 static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
 {
+	*dvert_tot = 0;
+	*dvert_arr = NULL;
+
 	if(id) {
 		switch(GS(id->name)) {
 			case ID_ME:
@@ -166,8 +175,6 @@
 					int i;
 
 					if (!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
-						*dvert_tot = 0;
-						*dvert_arr = NULL;
 						return 0;
 					}
 
@@ -195,8 +202,9 @@
 
 					return 1;
 				}
-				else
+				else {
 					return 0;
+				}
 			}
 			case ID_LT:
 			{
@@ -222,8 +230,6 @@
 		}
 	}
 
-	*dvert_arr= NULL;
-	*dvert_tot= 0;
 	return 0;
 }
 
@@ -265,13 +271,24 @@
 	int i;
 	int totdef_from= BLI_countlist(&ob_from->defbase);
 	int totdef= BLI_countlist(&ob->defbase);
+	short new_vgroup= FALSE;
 
 	ED_vgroup_give_parray(ob_from->data, &dvert_array_from, &dvert_tot_from);
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
+	if((dvert_array == NULL) && (dvert_array_from != NULL) && ED_vgroup_data_create(ob->data)) {
+		ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
+		new_vgroup= TRUE;
+	}
+
 	if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || dvert_array_from==NULL || dvert_array==NULL) {
 		if (dvert_array) MEM_freeN(dvert_array);
 		if (dvert_array_from) MEM_freeN(dvert_array_from);
+
+		if(new_vgroup == TRUE) {
+			/* free the newly added vgroup since it wasn't compatible */
+			vgroup_delete_all(ob->data);
+		}
 		return 0;
 	}
 
@@ -1988,17 +2005,25 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *UNUSED(op))
+static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *op)
 {
 	Object *obact= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+	int change= 0;
+	int fail= 0;
 
 	CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
 	{
-		if(obact != ob)
-			ED_vgroup_copy_array(ob, obact);
+		if(obact != ob) {
+			if(ED_vgroup_copy_array(ob, obact)) change++;
+			else                                fail++;
+		}
 	}
 	CTX_DATA_END;
 
+	if((change == 0 && fail == 0) || fail) {
+		BKE_reportf(op->reports, RPT_ERROR, "Copy to VGroups to Selected warning done %d, failed %d, object data must have matching indicies", change, fail);
+	}
+
 	return OPERATOR_FINISHED;
 }
 

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2011-06-07 17:59:38 UTC (rev 37301)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2011-06-07 18:04:03 UTC (rev 37302)
@@ -4027,7 +4027,6 @@
 						if ((seq != seq_prev)) {
 							/* check effects strips, we cant change their time */
 							if((seq->type & SEQ_EFFECT) && seq->seq1) {
-								// shuffle_seq(seqbasep, seq, t->scene);
 								has_effect= TRUE;
 							}
 							else {




More information about the Bf-blender-cvs mailing list