diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2017-04-26 11:40:41 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2017-04-26 11:42:40 +0300 |
commit | f88e6763d64f7f79e13680082f30e06aea11fab0 (patch) | |
tree | d6e586a513f8c3a2cb37c251091374ccc601d81d | |
parent | 3dc6528cd45aa840e4a7782669f01e84671d0247 (diff) |
Depsgraph and selection: Flush selcol on Depsgraph
Selection code needs to iterate over DEG_OBJECT_ITER otherwise we won't
get modifiers, dupli objects, ...
Also make selection respect selectability flag.
Review by: Sergey Sharybin
4 files changed, 19 insertions, 15 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc index 3f9febc1228..db71dad5e5f 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc @@ -43,6 +43,7 @@ extern "C" { #include "BLI_utildefines.h" #include "DNA_node_types.h" +#include "DNA_layer_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -80,12 +81,14 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene) } /* scene objects */ - FOREACH_SCENE_OBJECT(scene, ob) - { - /* object itself */ - build_object(scene, ob); + int selection_color = 1; + for (SceneLayer *sl = (SceneLayer *)scene->render_layers.first; sl; sl = sl->next) { + for (Base *base = (Base *)sl->object_bases.first; base; base = base->next) { + /* object itself */ + build_object(scene, base->object); + base->selcol = selection_color++; + } } - FOREACH_SCENE_OBJECT_END /* rigidbody */ if (scene->rigidbody_world) { diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index 6193fd3d7cf..eff1a44be01 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -137,6 +137,7 @@ void DAG_objects_iterator_next(Iterator *iter) /* Flushing depsgraph data. */ ob->base_flag = (base->flag | BASE_FROM_SET) & data->flag; ob->base_collection_properties = base->collection_properties; + ob->base_selection_color = base->selcol; data->base = base; return; } diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index ca21102551e..d866a4c52db 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2109,23 +2109,21 @@ void DRW_draw_select_loop( /* or render properties / materials change */ if (cache_is_dirty) { - int code = 1; - DRW_engines_cache_init(); if (use_obedit) { DRW_engines_cache_populate(vc->obedit); } else { - /* TODO, use DEG_OBJECT_ITER or similar. - * Currently its not well suited for selection - * since it loops over Objects instead of bases and does so recursively. */ - for (Base *base = sl->object_bases.first; base; base = base->next) { - base->selcol = code++; - DRW_select_load_id(base->selcol); - - DRW_engines_cache_populate(base->object); + Depsgraph *graph = scene->depsgraph; // CTX_data_depsgraph(C); + DEG_OBJECT_ITER(graph, ob) + { + if ((ob->base_flag & BASE_SELECTABLED) != 0) { + DRW_select_load_id(ob->base_selection_color); + DRW_engines_cache_populate(ob); + } } + DEG_OBJECT_ITER_END } DRW_engines_cache_finish(); diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 3045b5c3db5..31fc1c0a5c0 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -306,6 +306,8 @@ typedef struct Object { struct IDProperty *base_collection_properties; /* used by depsgraph, flushed from base */ ListBase drawdata; /* runtime, for draw engine datas */ + int base_selection_color; /* flushed by depsgraph only */ + int pad3[3]; } Object; /* Warning, this is not used anymore because hooks are now modifiers */ |