[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