[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58173] trunk/blender/source/blender/ editors/armature/armature_utils.c: fix [#36099] Undo crashes on an armature with ID-Properties

Campbell Barton ideasman42 at gmail.com
Thu Jul 11 13:38:28 CEST 2013


Revision: 58173
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58173
Author:   campbellbarton
Date:     2013-07-11 11:38:28 +0000 (Thu, 11 Jul 2013)
Log Message:
-----------
fix [#36099] Undo crashes on an armature with ID-Properties
armatures undo state now stores ID-properties.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/armature/armature_utils.c

Modified: trunk/blender/source/blender/editors/armature/armature_utils.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_utils.c	2013-07-11 11:29:45 UTC (rev 58172)
+++ trunk/blender/source/blender/editors/armature/armature_utils.c	2013-07-11 11:38:28 UTC (rev 58173)
@@ -588,6 +588,60 @@
 /* *************************************************************** */
 /* Undo for Armature EditMode*/
 
+/* free's bones and their properties */
+
+static void ED_armature_ebone_listbase_free(ListBase *lb)
+{
+	EditBone *ebone, *ebone_next;
+
+	for (ebone = lb->first; ebone; ebone = ebone_next) {
+		ebone_next = ebone->next;
+
+		if (ebone->prop) {
+			IDP_FreeProperty(ebone->prop);
+			MEM_freeN(ebone->prop);
+		}
+
+		MEM_freeN(ebone);
+	}
+
+	lb->first = NULL;
+	lb->last = NULL;
+}
+
+static void ED_armature_ebone_listbase_copy(ListBase *lb_dst, ListBase *lb_src)
+{
+	EditBone *ebone_src;
+	EditBone *ebone_dst;
+
+	BLI_assert(lb_dst->first == NULL);
+
+	for (ebone_src = lb_src->first; ebone_src; ebone_src = ebone_src->next) {
+		ebone_dst = MEM_dupallocN(ebone_src);
+		if (ebone_dst->prop) {
+			ebone_dst->prop = IDP_CopyProperty(ebone_dst->prop);
+		}
+		ebone_src->temp = ebone_dst;
+		BLI_addtail(lb_dst, ebone_dst);
+	}
+
+	/* set pointers */
+	for (ebone_dst = lb_dst->first; ebone_dst; ebone_dst = ebone_dst->next) {
+		if (ebone_dst->parent) {
+			ebone_dst->parent = ebone_dst->parent->temp;
+		}
+	}
+}
+
+static void ED_armature_ebone_listbase_temp_clear(ListBase *lb)
+{
+	EditBone *ebone;
+	/* be sure they don't hang ever */
+	for (ebone = lb->first; ebone; ebone = ebone->next) {
+		ebone->temp = NULL;
+	}
+}
+
 typedef struct UndoArmature {
 	EditBone *act_edbone;
 	ListBase lb;
@@ -597,60 +651,40 @@
 {
 	UndoArmature *uarm = uarmv;
 	bArmature *arm = armv;
-	EditBone *ebo, *newebo;
+	EditBone *ebone;
 	
-	BLI_freelistN(arm->edbo);
+	ED_armature_ebone_listbase_free(arm->edbo);
+	ED_armature_ebone_listbase_copy(arm->edbo, &uarm->lb);
 	
-	/* copy  */
-	for (ebo = uarm->lb.first; ebo; ebo = ebo->next) {
-		newebo = MEM_dupallocN(ebo);
-		ebo->temp = newebo;
-		BLI_addtail(arm->edbo, newebo);
-	}
-	
 	/* active bone */
 	if (uarm->act_edbone) {
-		ebo = uarm->act_edbone;
-		arm->act_edbone = ebo->temp;
+		ebone = uarm->act_edbone;
+		arm->act_edbone = ebone->temp;
 	}
-	else
+	else {
 		arm->act_edbone = NULL;
+	}
 
-	/* set pointers */
-	for (newebo = arm->edbo->first; newebo; newebo = newebo->next) {
-		if (newebo->parent) newebo->parent = newebo->parent->temp;
-	}
-	/* be sure they don't hang ever */
-	for (newebo = arm->edbo->first; newebo; newebo = newebo->next) {
-		newebo->temp = NULL;
-	}
+	ED_armature_ebone_listbase_temp_clear(arm->edbo);
 }
 
 static void *editBones_to_undoBones(void *armv, void *UNUSED(obdata))
 {
 	bArmature *arm = armv;
 	UndoArmature *uarm;
-	EditBone *ebo, *newebo;
+	EditBone *ebone;
 	
 	uarm = MEM_callocN(sizeof(UndoArmature), "listbase undo");
 	
-	/* copy */
-	for (ebo = arm->edbo->first; ebo; ebo = ebo->next) {
-		newebo = MEM_dupallocN(ebo);
-		ebo->temp = newebo;
-		BLI_addtail(&uarm->lb, newebo);
-	}
+	ED_armature_ebone_listbase_copy(&uarm->lb, arm->edbo);
 	
 	/* active bone */
 	if (arm->act_edbone) {
-		ebo = arm->act_edbone;
-		uarm->act_edbone = ebo->temp;
+		ebone = arm->act_edbone;
+		uarm->act_edbone = ebone->temp;
 	}
 
-	/* set pointers */
-	for (newebo = uarm->lb.first; newebo; newebo = newebo->next) {
-		if (newebo->parent) newebo->parent = newebo->parent->temp;
-	}
+	ED_armature_ebone_listbase_temp_clear(&uarm->lb);
 	
 	return uarm;
 }
@@ -659,7 +693,8 @@
 {
 	UndoArmature *uarm = uarmv;
 	
-	BLI_freelistN(&uarm->lb);
+	ED_armature_ebone_listbase_free(&uarm->lb);
+
 	MEM_freeN(uarm);
 }
 




More information about the Bf-blender-cvs mailing list