Commit: ed4732e391aa27e206a4ab148275f876c704f4ef
Author: Julian Eisel
Date: Thu Jul 7 01:43:44 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBed4732e391aa27e206a4ab148275f876c704f4ef
Drop support for objects in multiple layers (for now)
I don't want to waste time trying to keep this working if we eventually decide
to drop it. If we decide to keep it, I can still bring it back.
Note that compatibility can be kept even without support for objects on
multiple layers.
===================================================================
M source/blender/blenkernel/intern/object_layer.c
M source/blender/editors/space_layers/layers_ops.c
M source/blender/editors/space_layers/space_layers.c
M source/blender/makesdna/DNA_space_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/object_layer.c
b/source/blender/blenkernel/intern/object_layer.c
index 5d1b6f6..5ca5500 100644
--- a/source/blender/blenkernel/intern/object_layer.c
+++ b/source/blender/blenkernel/intern/object_layer.c
@@ -118,6 +118,7 @@ void BKE_objectlayer_bases_unassign_all(LayerTreeItem
*litem, const bool unset_b
BKE_OBJECTLAYER_BASES_ITER_END;
}
MEM_freeN(oblayer->bases);
+ oblayer->bases = NULL;
oblayer->tot_bases = 0;
}
diff --git a/source/blender/editors/space_layers/layers_ops.c
b/source/blender/editors/space_layers/layers_ops.c
index 5e6cdcb..691aa7c 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -138,37 +138,18 @@ enum {
LAYER_DELETE_WITH_CONTENT,
};
-static void layers_remove_layer_objects(bContext *C, SpaceLayers *slayer,
LayerTreeItem *litem)
+static void layers_remove_layer_objects(bContext *C, LayerTreeItem *litem)
{
LayerTypeObject *oblayer = (LayerTypeObject *)litem;
struct Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
- ListBase remlist = {NULL};
- LinkData *base_links = BLI_array_alloca(base_links, oblayer->tot_bases);
-
BKE_OBJECTLAYER_BASES_ITER_START(oblayer, i, base)
{
- base_links[i].data = base;
- BLI_addhead(&remlist, &base_links[i]);
- }
- BKE_OBJECTLAYER_BASES_ITER_END;
-
- 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 */
- GHashIterator gh_iter;
- 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_remlink(&remlist, base_link);
}
- BLI_assert(BLI_listbase_is_empty(&remlist));
+ BKE_OBJECTLAYER_BASES_ITER_END;
+ BKE_objectlayer_bases_unassign_all(litem, false);
DAG_relations_tag_update(bmain);
}
@@ -198,7 +179,7 @@ static int layer_remove_exec(bContext *C, wmOperator *op)
if (rem_type == LAYER_DELETE_WITH_CONTENT) {
switch (slayer->act_tree->type) {
case LAYER_TREETYPE_OBJECT:
- layers_remove_layer_objects(C, slayer,
litem);
+ layers_remove_layer_objects(C, litem);
break;
}
}
@@ -545,7 +526,7 @@ BLI_INLINE void layer_selection_set(SpaceLayers *slayer,
LayerTile *tile, const
{
if (enable) {
(tile->flag |= LAYERTILE_SELECTED);
- slayer->last_selected = tile->litem->index;
+ slayer->active_item = tile->litem->index;
}
else {
tile->flag &= ~LAYERTILE_SELECTED;
@@ -609,7 +590,7 @@ static int layer_select_invoke(bContext *C, wmOperator *op,
const wmEvent *event
layers_selection_set_all(slayer, false);
}
if (extend) {
- if (fill && layers_select_fill(slayer,
slayer->last_selected, tile->litem->index)) {
+ if (fill && layers_select_fill(slayer,
slayer->active_item, tile->litem->index)) {
/* skip */
}
else {
@@ -680,33 +661,17 @@ static int layer_objects_assign_invoke(bContext *C,
wmOperator *UNUSED(op), cons
{
Scene *scene = CTX_data_scene(C);
SpaceLayers *slayer = CTX_wm_space_layers(C);
- int tot_sel = 0;
- /* Count selected tiles (could be cached to avoid extra loop). */
- GHashIterator gh_iter;
- GHASH_ITER(gh_iter, slayer->tiles) {
- LayerTile *tile = BLI_ghashIterator_getValue(&gh_iter);
- if (tile->flag & LAYERTILE_SELECTED) {
- tot_sel++;
- }
- }
- /* Collect selected items in an array */
- LayerTreeItem **litems = BLI_array_alloca(litems, tot_sel);
- int i = 0;
- GHASH_ITER(gh_iter, slayer->tiles) {
- LayerTile *tile = BLI_ghashIterator_getValue(&gh_iter);
- if (tile->flag & LAYERTILE_SELECTED) {
- litems[i] = tile->litem;
- i++;
- }
- }
+ if (slayer->active_item == -1)
+ return OPERATOR_CANCELLED;
+ LayerTreeItem *active =
slayer->act_tree->items_all[slayer->active_item];
for (Base *base = scene->base.first; base; base = base->next) {
if (base->flag & SELECT) {
- /* Only iterate over selected items */
- for (i = 0; i < tot_sel; i++) {
- BKE_objectlayer_base_assign(base, litems[i],
false);
+ if (base->layer) {
+ BKE_objectlayer_base_unassign(base,
base->layer);
}
+ BKE_objectlayer_base_assign(base, active, false);
}
}
diff --git a/source/blender/editors/space_layers/space_layers.c
b/source/blender/editors/space_layers/space_layers.c
index f918c67..9a3b788 100644
--- a/source/blender/editors/space_layers/space_layers.c
+++ b/source/blender/editors/space_layers/space_layers.c
@@ -57,7 +57,7 @@ static SpaceLink *layers_new(const bContext *C)
slayer = MEM_callocN(sizeof(SpaceLayers), __func__);
slayer->spacetype = SPACE_LAYERS;
- slayer->last_selected = -1;
+ slayer->active_item = -1;
layers_data_refresh(scene, slayer);
/* header */
diff --git a/source/blender/makesdna/DNA_space_types.h
b/source/blender/makesdna/DNA_space_types.h
index 933afb3..5c4b8fe 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1384,8 +1384,8 @@ typedef struct SpaceLayers {
* Use to get the LayerTile from a LayerTreeItem or for iterating over
layer tree where order doesn't matter. */
struct GHash *tiles;
- /* Index of last selected item, will likely become redundant when
active layers are supported. */
- int last_selected;
+ /* LayerTree.items_all index of last selected LayerTreeItem */
+ int active_item;
/* filtering (unused still) */
short filterflag, pad2;
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs