[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