Commit: bfb85f92e5dc3f5e11d9dc54f2ab06525509fc24
Author: Julian Eisel
Date:   Fri Jun 24 16:58:48 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBbfb85f92e5dc3f5e11d9dc54f2ab06525509fc24

Temporary quick hack for compatibility

When reading an old .blend, all objects of it are simply moved to a new layer 
of the new system. In future this can be resolved better though.

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

M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/object_layer.c
M       source/blender/blenloader/intern/versioning_270.c
M       source/blender/editors/space_layers/layers_ops.c

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

diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index 7e642a8..b7bb0c9 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -282,8 +282,9 @@ bool BKE_object_modifier_update_subframe(struct Scene 
*scene, struct Object *ob,
 
 LayerTreeItem *BKE_objectlayer_add(LayerTree *tree, LayerTreeItem *parent, 
const char *name);
 void BKE_objectlayer_free(LayerTreeItem *litem);
-void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem);
+void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem, const bool 
has_reserved);
 void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem);
+void BKE_objectlayer_base_entries_reserve(LayerTreeItem *litem, const unsigned 
int nentries_reserve);
 LayerTypeObject *BKE_objectlayer_from_base(LayerTree *ltree, const Base *base, 
const bool inverse);
 
 #ifdef __cplusplus
diff --git a/source/blender/blenkernel/intern/object_layer.c 
b/source/blender/blenkernel/intern/object_layer.c
index d606b1b..a086304 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -59,16 +59,20 @@ static void objectlayer_array_resize(LayerTypeObject 
*oblayer, unsigned int new_
        else {
                MEM_SAFE_FREE(oblayer->bases);
        }
-       oblayer->tot_bases = new_tot_objects;
 }
 
 /**
  * Assign \a base to object layer \a litem.
+ * \param has_reserved: Set to true if entries have been reserved before using 
#BKE_objectlayer_bases_reserve.
  */
-void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem)
+void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem, const bool 
has_reserved)
 {
        LayerTypeObject *oblayer = (LayerTypeObject *)litem;
-       objectlayer_array_resize(oblayer, oblayer->tot_bases + 1);
+
+       oblayer->tot_bases++;
+       if (!has_reserved) {
+               objectlayer_array_resize(oblayer, oblayer->tot_bases);
+       }
        oblayer->bases[oblayer->tot_bases - 1] = base;
 }
 
@@ -89,7 +93,17 @@ void BKE_objectlayer_base_unassign(const Base *base, 
LayerTreeItem *litem)
                }
        }
 
-       objectlayer_array_resize(oblayer, oblayer->tot_bases - 1);
+       objectlayer_array_resize(oblayer, --oblayer->tot_bases);
+}
+
+/**
+ * Reserve memory for \a nentries_reserve number of entries. Use to avoid 
multiple
+ * allocations, but note that it's up to you to insert the entries correctly.
+ */
+void BKE_objectlayer_base_entries_reserve(LayerTreeItem *litem, const unsigned 
int nentries_reserve)
+{
+       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+       objectlayer_array_resize(oblayer, nentries_reserve);
 }
 
 /**
diff --git a/source/blender/blenloader/intern/versioning_270.c 
b/source/blender/blenloader/intern/versioning_270.c
index 1c1daa3..a9cb1c8 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -61,6 +61,7 @@
 #include "BKE_main.h"
 #include "BKE_modifier.h"
 #include "BKE_node.h"
+#include "BKE_object.h"
 #include "BKE_scene.h"
 #include "BKE_sequencer.h"
 #include "BKE_screen.h"
@@ -1221,7 +1222,13 @@ void blo_do_versions_270(FileData *fd, Library 
*UNUSED(lib), Main *main)
                if (!DNA_struct_elem_find(fd->filesdna, "Scene", "LayerTree", 
"object_layers")) {
                        for (Scene *sce = main->scene.first; sce; sce = 
sce->id.next) {
                                sce->object_layers = 
BKE_layertree_new(LAYER_TREETYPE_OBJECT);
-                               /* TODO convert old layers to new ones */
+                               LayerTreeItem *litem = 
BKE_objectlayer_add(sce->object_layers, NULL, "Default layer");
+
+                               BKE_objectlayer_base_entries_reserve(litem, 
BLI_listbase_count(&sce->base));
+                               /* For now, simply create a new layer and move 
all objects into it */
+                               for (Base *base = sce->base.first; base; base = 
base->next) {
+                                       BKE_objectlayer_base_assign(base, 
litem, true);
+                               }
                        }
                }
        }
diff --git a/source/blender/editors/space_layers/layers_ops.c 
b/source/blender/editors/space_layers/layers_ops.c
index 6299858..6827f84 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -692,7 +692,7 @@ static int layer_objects_assign_invoke(bContext *C, 
wmOperator *UNUSED(op), cons
                if (base->flag & SELECT) {
                        /* Only iterate over selected items */
                        for (i = 0; i < tot_sel; i++) {
-                               BKE_objectlayer_base_assign(base, litems[i]);
+                               BKE_objectlayer_base_assign(base, litems[i], 
false);
                        }
                }
        }

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

Reply via email to