[Bf-blender-cvs] [5bcea4f] soc-2016-layer_manager: Make scene copying work with layers

Julian Eisel noreply at git.blender.org
Fri Aug 19 01:01:37 CEST 2016


Commit: 5bcea4feb076cb33b85640d9de7dee5ce2140adc
Author: Julian Eisel
Date:   Fri Aug 19 00:58:19 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB5bcea4feb076cb33b85640d9de7dee5ce2140adc

Make scene copying work with layers

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/scene/layer_types.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index c964002..7901d22 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -53,7 +53,7 @@ typedef enum eLayerTree_Type {
 } eLayerTree_Type;
 
 LayerTree *BKE_layertree_new(const eLayerTree_Type type);
-//LayerTree *BKE_layertree_copy(const LayerTree *oldtree); /* TODO */
+LayerTree *BKE_layertree_copy(const LayerTree *original_tree);
 void BKE_layertree_delete(LayerTree *ltree);
 
 bool BKE_layertree_iterate(const LayerTree *ltree, LayerTreeIterFunc foreach, void *customdata, const bool inverse);
@@ -90,6 +90,8 @@ typedef struct LayerType {
 	/* drawing of the expanded layer settings (gear wheel icon) */
 	void (*draw_settings)(const struct bContext *, struct LayerTreeItem *, struct uiLayout *); /* LayerItemDrawSettingsFunc */
 
+	/* Optional callback called when duplicating a layer */
+	void (*copy)(struct LayerTreeItem *copied_item, const struct LayerTreeItem *original_item);
 	/* Optional free callback. Don't free item itself! */
 	void (*free)(struct LayerTreeItem *);
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 930ed5c..0344fae 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -67,6 +67,43 @@ LayerTree *BKE_layertree_new(const eLayerTree_Type type)
 	return ltree;
 }
 
+LayerTree *BKE_layertree_copy(const LayerTree *original_tree)
+{
+	LayerTree *copied_tree = MEM_dupallocN(original_tree);
+
+	/* copy layer items */
+	LayerTreeItem *copied_item;
+	copied_tree->items_all = MEM_dupallocN(original_tree->items_all);
+	BKE_LAYERTREE_ITER_START(original_tree, 0, i, original_item)
+	{
+		copied_item = copied_tree->items_all[i] = MEM_dupallocN(original_item);
+		copied_item->tree = copied_tree;
+		copied_item->prop = IDP_CopyProperty(original_item->prop);
+		copied_item->ptr = MEM_callocN(sizeof(PointerRNA), "LayerTreeItem PointerRNA duplicate");
+		RNA_pointer_create(NULL, copied_item->type->srna, copied_item->prop, copied_item->ptr);
+
+		if (original_item->parent) {
+			/* we assume here that parent came before the child */
+			copied_item->parent = copied_tree->items_all[original_item->parent->index];
+			BLI_addhead(&copied_item->parent->childs, copied_item);
+		}
+		else {
+			BLI_addhead(&copied_tree->items, copied_item);
+		}
+
+		if (copied_item->type->copy) {
+			copied_item->type->copy(copied_item, original_item);
+		}
+	}
+	BKE_LAYERTREE_ITER_END;
+
+	copied_tree->active_layer = copied_tree->items_all[original_tree->active_layer->index];
+	/* should use new address by now */
+	BLI_assert(copied_tree->active_layer != original_tree->active_layer);
+
+	return copied_tree;
+}
+
 void BKE_layertree_delete(LayerTree *ltree)
 {
 	BKE_LAYERTREE_ITER_START(ltree, 0, i, litem)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index a972e93..be0b9a2 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -207,6 +207,7 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
 		BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
 		BLI_duplicatelist(&(scen->r.views), &(sce->r.views));
 		BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
+		scen->object_layers = BKE_layertree_copy(sce->object_layers);
 
 		if (sce->nodetree) {
 			/* ID's are managed on both copy and switch */
@@ -458,7 +459,7 @@ void BKE_scene_free(Scene *sce)
 	MEM_SAFE_FREE(sce->fps_info);
 
 	BLI_assert(sce->object_layers != NULL);
-	/* Calls BKE_objectlayer_free (which frees bases) as callback */
+	/* bases are freed in this through object layer callbacks */
 	BKE_layertree_delete(sce->object_layers);
 
 	BKE_sound_destroy_scene(sce);
diff --git a/source/blender/editors/scene/layer_types.c b/source/blender/editors/scene/layer_types.c
index 5b377ca..9dea372 100644
--- a/source/blender/editors/scene/layer_types.c
+++ b/source/blender/editors/scene/layer_types.c
@@ -131,6 +131,23 @@ static void object_layer_draw_settings(const bContext *UNUSED(C), LayerTreeItem
 	uiTemplateLayers(row, litem->ptr, "visibility_bits", NULL, NULL, 0);
 }
 
+static void object_layer_copy(LayerTreeItem *copied_item, const LayerTreeItem *original_item)
+{
+	LayerTypeObject *original_oblayer = (LayerTypeObject *)original_item;
+	LayerTypeObject *copied_oblayer = (LayerTypeObject *)copied_item;
+
+	BLI_assert(&copied_oblayer->litem == copied_item);
+
+	/* copy bases */
+	copied_oblayer->bases = MEM_dupallocN(original_oblayer->bases);
+	BKE_OBJECTLAYER_BASES_ITER_START(original_oblayer, i, original_base)
+	{
+		copied_oblayer->bases[i] = MEM_dupallocN(original_base);
+		copied_oblayer->bases[i]->layer = copied_item;
+	}
+	BKE_OBJECTLAYER_BASES_ITER_END;
+}
+
 static void LAYERTYPE_object(LayerType *lt)
 {
 	/* Should always be same default as set in BKE_objectlayer_add */
@@ -143,6 +160,7 @@ static void LAYERTYPE_object(LayerType *lt)
 
 	lt->draw = object_layer_draw;
 	lt->draw_settings = object_layer_draw_settings;
+	lt->copy = object_layer_copy;
 	lt->free = BKE_objectlayer_free;
 
 	RNA_def_enum(lt->srna, "color_set", rna_enum_color_sets_items, 0, "Color Set", "Custom color set for this layer");




More information about the Bf-blender-cvs mailing list