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