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...

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to