Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/depsgraph/intern/depsgraph_query.cc')
-rw-r--r--source/blender/depsgraph/intern/depsgraph_query.cc102
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);
+ }
+}