[Bf-blender-cvs] [bfb85f9] soc-2016-layer_manager: Temporary quick hack for compatibility
Julian Eisel
noreply at git.blender.org
Fri Jun 24 17:10:48 CEST 2016
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);
}
}
}
More information about the Bf-blender-cvs
mailing list