diff options
Diffstat (limited to 'source/blender/depsgraph/intern/depsgraph_query.cc')
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_query.cc | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index 7f2f6a65f5e..eff1a44be01 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -34,12 +34,17 @@ extern "C" { #include "BKE_idcode.h" +#include "BKE_layer.h" #include "BKE_main.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + #include "DEG_depsgraph_query.h" } /* extern "C" */ #include "intern/depsgraph_intern.h" +#include "util/deg_util_foreach.h" bool DEG_id_type_tagged(Main *bmain, short idtype) { @@ -68,3 +73,100 @@ short DEG_get_eval_flags_for_id(Depsgraph *graph, ID *id) return id_node->eval_flags; } + +Scene *DAG_get_scene(Depsgraph *graph) +{ + DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph); + return deg_graph->scene; +} + +SceneLayer *DAG_get_scene_layer(Depsgraph *graph) +{ + Scene *scene = DAG_get_scene(graph); + if (scene) { + return BKE_scene_layer_context_active(scene); + } + return NULL; +} + +Object *DAG_get_object(Depsgraph * /*depsgraph*/, Object *ob) +{ + /* XXX TODO */ + return ob; +} + +/* ************************ DAG ITERATORS ********************* */ + +typedef struct DAGObjectsIteratorData { + Depsgraph *graph; + Scene *scene; + SceneLayer *scene_layer; + Base *base; + int flag; +} DAGObjectsIteratorData; + +void DAG_objects_iterator_begin(Iterator *iter, void *data_in) +{ + SceneLayer *scene_layer; + Depsgraph *graph = (Depsgraph *) data_in; + DAGObjectsIteratorData *data = (DAGObjectsIteratorData *) + MEM_callocN(sizeof(DAGObjectsIteratorData), __func__); + iter->data = data; + iter->valid = true; + + data->graph = graph; + data->scene = DAG_get_scene(graph); + scene_layer = DAG_get_scene_layer(graph); + data->flag = ~(BASE_FROM_SET); + + Base base = {(Base *)scene_layer->object_bases.first, NULL}; + data->base = &base; + DAG_objects_iterator_next(iter); +} + +void DAG_objects_iterator_next(Iterator *iter) +{ + DAGObjectsIteratorData *data = (DAGObjectsIteratorData *)iter->data; + Base *base = data->base->next; + + while (base) { + if ((base->flag & BASE_VISIBLED) != 0) { + Object *ob = DAG_get_object(data->graph, base->object); + iter->current = ob; + + /* 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; + } + base = base->next; + } + + /* Look for an object in the next set. */ + if (data->scene->set) { + SceneLayer *scene_layer; + data->scene = data->scene->set; + data->flag = ~(BASE_SELECTED | BASE_SELECTABLED); + + /* For the sets we use the layer used for rendering. */ + scene_layer = BKE_scene_layer_render_active(data->scene); + + Base base = {(Base *)scene_layer->object_bases.first, NULL}; + data->base = &base; + DAG_objects_iterator_next(iter); + return; + } + + iter->current = NULL; + iter->valid = false; +} + +void DAG_objects_iterator_end(Iterator *iter) +{ + DAGObjectsIteratorData *data = (DAGObjectsIteratorData *)iter->data; + if (data) { + MEM_freeN(data); + } +} |