diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2017-04-21 12:42:59 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2017-04-21 14:00:40 +0300 |
commit | 4b77fb30759d1b62224033fc92c55eef7f3e414a (patch) | |
tree | e861012341093bb46f19ee1d9952f4db76b4dad8 /source/blender/depsgraph/intern | |
parent | 3540b507801461d30d6a856daa26efda15011f79 (diff) |
Move DEG_OBJECT_ITER inside depsgraph
Diffstat (limited to 'source/blender/depsgraph/intern')
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_query.cc | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index 0fe2d2be396..2fe10766bba 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -37,6 +37,7 @@ extern "C" { #include "BKE_layer.h" #include "BKE_main.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DEG_depsgraph_query.h" @@ -99,3 +100,78 @@ 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 & data->flag) != BASE_VISIBLED) { + 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; + 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); + } +} |