Commit: 0c42c39fed7f7d988ab7bcfc66696306cbce008d
Author: Julian Eisel
Date:   Sun Jun 5 17:17:36 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB0c42c39fed7f7d988ab7bcfc66696306cbce008d

Support assigning objects to layers

Selected objects are now assigned to selected layers by pressing the M-key in 
the layer manager editor. Nothing visible happens then, but objects are now 
assigned to the layer.
Deleting a layer now invokes a popup from which the user can choose to select 
the layer with or without content.

Code still needs more work, but this depends on other changes. Undo/redo and 
file read/write doesnt' work yet, it's simply crashing.

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

M       source/blender/blenkernel/BKE_layer.h
M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/CMakeLists.txt
M       source/blender/blenkernel/intern/layer.c
A       source/blender/blenkernel/intern/object_layer.c
M       source/blender/editors/space_layers/layers_ops.c
M       source/blender/editors/space_layers/layers_types.c
M       source/blender/makesdna/DNA_space_types.h

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

diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index 1596ec6..49f8fb7 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -75,6 +75,10 @@ LayerTreeItem *BKE_layeritem_add(
         LayerTree *tree, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
         const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings);
+void BKE_layeritem_register(
+        LayerTree *tree, LayerTreeItem *litem, LayerTreeItem *parent,
+        const eLayerTreeItem_Type type, const char *name,
+        const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings);
 void BKE_layeritem_remove(LayerTreeItem *litem, const bool remove_children);
 
 void BKE_layeritem_group_assign(LayerTreeItem *group, LayerTreeItem *item);
diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index 7d60964..13698c9 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -270,6 +270,22 @@ bool BKE_object_modifier_update_subframe(struct Scene 
*scene, struct Object *ob,
                                          int parent_recursion, float frame,
                                          int type);
 
+/* -------------------------------------------------------------------- */
+/* Object Layers */
+
+#include "BKE_layer.h" /* XXX */
+
+typedef struct LayerTypeObject {
+       LayerTreeItem litem;
+       struct GHash *basehash; /* The objects of this layer. */
+} LayerTypeObject;
+
+LayerTreeItem *BKE_objectlayer_add(
+        LayerTree *tree, LayerTreeItem *parent, const char *name,
+        const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings);
+void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem);
+void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/CMakeLists.txt 
b/source/blender/blenkernel/CMakeLists.txt
index 0da285e..830a91b 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -533,6 +533,7 @@ if(WITH_ADVANCED_LAYERS)
        add_definitions(-DWITH_ADVANCED_LAYERS)
        list(APPEND SRC
                intern/layer.c
+               intern/object_layer.c
                BKE_layer.h
        )
 endif()
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index d78aa7a..1b92df3 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -121,18 +121,13 @@ int BKE_layertree_get_totitems(const LayerTree *ltree)
  * \{ */
 
 /**
- * Allocate a new layer item of \a type and add it to the layer tree \a tree. 
Sorting happens later.
- *
- * \param parent: The parent layer group of the new item. NULL for ungrouped 
items
- * \return The newly created layer item.
+ * Register an already allocated \a litem.
  */
-LayerTreeItem *BKE_layeritem_add(
-        LayerTree *tree, LayerTreeItem *parent,
+void BKE_layeritem_register(
+        LayerTree *tree, LayerTreeItem *litem, LayerTreeItem *parent,
         const eLayerTreeItem_Type type, const char *name,
         const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings)
 {
-       LayerTreeItem *litem = MEM_callocN(sizeof(LayerTreeItem), __func__);
-
        litem->type = type;
        litem->tree = tree;
        BLI_strncpy(litem->name, name, sizeof(litem->name));
@@ -155,7 +150,21 @@ LayerTreeItem *BKE_layeritem_add(
        else {
                BLI_addhead(&tree->items, litem);
        }
+}
 
+/**
+ * Allocate a new layer item of \a type and add it to the layer tree \a tree. 
Sorting happens later.
+ *
+ * \param parent: The parent layer group of the new item. NULL for ungrouped 
items
+ * \return The newly created layer item.
+ */
+LayerTreeItem *BKE_layeritem_add(
+        LayerTree *tree, LayerTreeItem *parent,
+        const eLayerTreeItem_Type type, const char *name,
+        const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings)
+{
+       LayerTreeItem *litem = MEM_callocN(sizeof(LayerTreeItem), __func__);
+       BKE_layeritem_register(tree, litem, parent, type, name, poll, draw, 
draw_settings);
        return litem;
 }
 
@@ -178,6 +187,9 @@ void BKE_layeritem_remove(LayerTreeItem *litem, const bool 
remove_children)
                BLI_assert(BLI_listbase_is_empty(&litem->childs));
        }
 
+       if (litem->free) {
+               litem->free(litem);
+       }
        MEM_freeN(litem);
 }
 
diff --git a/source/blender/blenkernel/intern/object_layer.c 
b/source/blender/blenkernel/intern/object_layer.c
new file mode 100644
index 0000000..c2997e2
--- /dev/null
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -0,0 +1,74 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/object_layer.c
+ *  \ingroup bke
+ */
+
+#include "BKE_layer.h"
+#include "BKE_object.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
+#include "DNA_object_types.h"
+
+#include "MEM_guardedalloc.h"
+
+
+static void objectlayer_free(LayerTreeItem *litem)
+{
+       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+       BLI_ghash_free(oblayer->basehash, NULL, NULL);
+}
+
+LayerTreeItem *BKE_objectlayer_add(
+        LayerTree *tree, LayerTreeItem *parent, const char *name,
+        const LayerItemPollFunc poll, LayerItemDrawFunc draw, 
LayerItemDrawSettingsFunc draw_settings)
+{
+       LayerTypeObject *oblayer = MEM_callocN(sizeof(LayerTypeObject), 
__func__);
+
+       BLI_assert(tree->type == LAYER_TREETYPE_OBJECT);
+       BKE_layeritem_register(tree, &oblayer->litem, parent, 
LAYER_ITEMTYPE_LAYER, name, poll, draw, draw_settings);
+       oblayer->basehash = BLI_ghash_str_new(__func__);
+       oblayer->litem.free = objectlayer_free;
+
+       return &oblayer->litem;
+}
+
+/**
+ * Assign \a base to object layer \a litem.
+ */
+void BKE_objectlayer_base_assign(Base *base, LayerTreeItem *litem)
+{
+       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+       if (!BLI_ghash_haskey(oblayer->basehash, base->object->id.name)) {
+               BLI_ghash_insert(oblayer->basehash, base->object->id.name, 
base);
+       }
+}
+
+/**
+ * Un-assign \a base from object layer \a litem.
+ */
+void BKE_objectlayer_base_unassign(const Base *base, LayerTreeItem *litem)
+{
+       const LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+       BLI_ghash_remove(oblayer->basehash, base->object->id.name, NULL, NULL);
+}
diff --git a/source/blender/editors/space_layers/layers_ops.c 
b/source/blender/editors/space_layers/layers_ops.c
index bf71b39..6402ca6 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -25,8 +25,11 @@
 #include <stdlib.h>
 
 #include "BKE_context.h"
+#include "BKE_depsgraph.h"
 #include "BKE_layer.h"
+#include "BKE_object.h"
 
+#include "BLI_alloca.h"
 #include "BLI_compiler_attrs.h"
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
@@ -79,10 +82,48 @@ static void LAYERS_OT_layer_add(wmOperatorType *ot)
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
-static int layer_remove_invoke(bContext *C, wmOperator *UNUSED(op), const 
wmEvent *UNUSED(event))
+enum {
+       LAYER_DELETE_LAYER_ONLY,
+       LAYER_DELETE_WITH_CONTENT,
+};
+
+static void layers_remove_layer_objects(bContext *C, SpaceLayers *slayer, 
LayerTreeItem *litem)
+{
+       struct Main *bmain = CTX_data_main(C);
+       Scene *scene = CTX_data_scene(C);
+       LayerTypeObject *oblayer = (LayerTypeObject *)litem;
+       ListBase remlist = {NULL};
+       GHashIterator gh_iter;
+
+       GHASH_ITER(gh_iter, oblayer->basehash) {
+               Base *base = BLI_ghashIterator_getValue(&gh_iter);
+               LinkData *base_link = BLI_genericNodeN(base);
+               BLI_addhead(&remlist, base_link);
+       }
+
+       for (LinkData *base_link = remlist.first, *baselink_next; base_link; 
base_link = baselink_next) {
+               Base *base = base_link->data;
+               /* remove object from other layers */
+               /* XXX bases could have info about the layers they are in, then
+                * we could avoid loop in loop and do this all on BKE_level */
+               GHASH_ITER(gh_iter, slayer->tiles) {
+                       BKE_objectlayer_base_unassign(base, 
BLI_ghashIterator_getKey(&gh_iter));
+               }
+               ED_base_object_free_and_unlink(bmain, scene, base);
+
+               baselink_next = base_link->next;
+               BLI_freelinkN(&remlist, base_link);
+       }
+       BLI_assert(BLI_listbase_is_empty(&remlist));
+
+       DAG_relations_tag_update(bmain);
+}
+
+static int layer_remove_exec(bContext *C, wmOperator *op)
 {
        SpaceLayers *slayer = CTX_wm_space_layers(C);
        ListBase remlist = {NULL};
+       const int rem_type = RNA_enum_get(op->ptr, "type");
 
        /* First iterate over tiles. Ghash iterator doesn't allow removing items
         * while iterating, so temporarily store selected items in a list */
@@ -94,11 +135,20 @@ static int layer_remove_invoke(bContext *C, wmOperator 
*UNUSED(op), const wmEven
                        BLI_addhead(&remlist, tile_link);
                }
        }
-       /* Now, delete all items in the list. */
+       /* Now, delete all items in the list (and content if needed). */
        for (LinkData *tile_link = remlist.first, *next_link; tile_link; 
tile_link = next_link) {
                LayerTile *tile = tile_link->data;
                LayerTreeItem *litem = tile->litem;
 
+               /* delete layer content */
+               if (rem_type == LAYER_DELETE_WITH_CONTENT) {
+                       switch (slayer->act_tree->type) {
+                               case LAYER_TREETYPE_OBJECT:
+                                       layers_remove_layer_objects(C, slayer, 
litem);
+                                       break;
+                       }
+               }
+
                layers_tile_remove(slayer, tile, true);
                BKE_layeritem_remove(litem, true);
 
@@ -114,17 +164,27 @@ stati

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to