[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