[Bf-blender-cvs] [efa114f] soc-2016-layer_manager: Fix crash deleting objects

Julian Eisel noreply at git.blender.org
Sat Aug 13 20:14:00 CEST 2016


Commit: efa114f388fafb9e27bb33e4b5cb0ec00a78b9c6
Author: Julian Eisel
Date:   Sat Aug 13 20:12:40 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBefa114f388fafb9e27bb33e4b5cb0ec00a78b9c6

Fix crash deleting objects

===================================================================

M	source/blender/blenkernel/intern/object_layer.c
M	source/blender/editors/object/object_add.c

===================================================================

diff --git a/source/blender/blenkernel/intern/object_layer.c b/source/blender/blenkernel/intern/object_layer.c
index 74e86cc..51e9c7e 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -79,7 +79,11 @@ void BKE_objectlayer_base_assign_ex(Base *base, LayerTreeItem *litem, const bool
 	}
 	/* offset current elements to give space for new one at start of array */
 	if (add_head && oblayer->tot_bases > 0) {
-		memmove(oblayer->bases[1], oblayer->bases[0], sizeof(*oblayer->bases) * oblayer->tot_bases);
+		/* Could use memmove for offsetting base pointers, but indices need to be updated anyway. */
+		for (int i = oblayer->tot_bases; i > 0; i--) {
+			oblayer->bases[i] = oblayer->bases[i - 1];
+			oblayer->bases[i]->index = i;
+		}
 	}
 
 	base->layer = litem;
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index c756c90..ce14f7e 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1324,8 +1324,8 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base,
 		basen->flag &= ~(OB_FROMDUPLI | OB_FROMGROUP);
 		ob->flag = basen->flag;
 		basen->lay = base->lay;
-		BKE_objectlayer_base_assign_ex(basen, base->layer, false, true); /* addhead: othwise eternal loop */
 		basen->object = ob;
+		BKE_objectlayer_base_assign_ex(basen, base->layer, false, true); /* addhead: othwise eternal loop */
 
 		/* make sure apply works */
 		BKE_animdata_free(&ob->id, true);
@@ -1927,8 +1927,8 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
 
 		basen = MEM_mallocN(sizeof(Base), "duplibase");
 		*basen = *base;
-		BKE_objectlayer_base_assign_ex(basen, base->layer, false, true); /* addhead: othwise eternal loop */
 		basen->object = obn;
+		BKE_objectlayer_base_assign_ex(basen, base->layer, false, true); /* addhead: othwise eternal loop */
 
 		/* 1) duplis should end up in same group as the original
 		 * 2) Rigid Body sim participants MUST always be part of a group...




More information about the Bf-blender-cvs mailing list