diff options
Diffstat (limited to 'source/blender/depsgraph/DEG_depsgraph_query.h')
-rw-r--r-- | source/blender/depsgraph/DEG_depsgraph_query.h | 80 |
1 files changed, 79 insertions, 1 deletions
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h index ccd204a2083..1020d4e606e 100644 --- a/source/blender/depsgraph/DEG_depsgraph_query.h +++ b/source/blender/depsgraph/DEG_depsgraph_query.h @@ -33,20 +33,98 @@ #ifndef __DEG_DEPSGRAPH_QUERY_H__ #define __DEG_DEPSGRAPH_QUERY_H__ +#include "DEG_depsgraph.h" + struct ID; +struct Base; +struct BLI_Iterator; struct Depsgraph; +struct DupliObject; +struct ListBase; +struct Scene; +struct SceneLayer; #ifdef __cplusplus extern "C" { #endif /* Check if given ID type was tagged for update. */ -bool DEG_id_type_tagged(struct Main *bmain, short idtype); +bool DEG_id_type_tagged(struct Main *bmain, short id_type); /* Get additional evaluation flags for the given ID. */ short DEG_get_eval_flags_for_id(struct Depsgraph *graph, struct ID *id); +/* Get scene the despgraph is created for. */ +struct Scene *DEG_get_evaluated_scene(struct Depsgraph *graph); + +/* Get scene layer the despgraph is created for. */ +struct SceneLayer *DEG_get_evaluated_scene_layer(struct Depsgraph *graph); + +/* Get evaluated version of object for given original one. */ +struct Object *DEG_get_evaluated_object(struct Depsgraph *depsgraph, struct Object *object); + +/* Get evaluated version of given ID datablock. */ +struct ID *DEG_get_evaluated_id(struct Depsgraph *depsgraph, struct ID *id); + +/* ************************ DAG iterators ********************* */ + +enum { + DEG_OBJECT_ITER_FLAG_SET = (1 << 0), + DEG_OBJECT_ITER_FLAG_DUPLI = (1 << 1), +}; + +#define DEG_OBJECT_ITER_FLAG_ALL (DEG_OBJECT_ITER_FLAG_SET | DEG_OBJECT_ITER_FLAG_DUPLI) + +typedef struct DEGObjectsIteratorData { + struct Depsgraph *graph; + struct Scene *scene; + struct EvaluationContext eval_ctx; + + /* TODO(sergey): Base should never be a thing coming FROM depsgraph. */ + struct Base *base; + int base_flag; + int flag; + + /* **** Iteration over dupli-list. *** */ + + /* Object which created the dupli-list. */ + struct Object *dupli_parent; + /* List of duplicated objects. */ + struct ListBase *dupli_list; + /* Next duplicated object to step into. */ + struct DupliObject *dupli_object_next; + /* Corresponds to current object: current iterator object is evaluated from + * this duplicated object. + */ + struct DupliObject *dupli_object_current; + /* Temporary storage to report fully populated DNA to the render engine or + * other users of the iterator. + */ + struct Object temp_dupli_object; +} DEGObjectsIteratorData; + +void DEG_objects_iterator_begin(struct BLI_Iterator *iter, DEGObjectsIteratorData *data); +void DEG_objects_iterator_next(struct BLI_Iterator *iter); +void DEG_objects_iterator_end(struct BLI_Iterator *iter); + +/* Temporary hacky solution waiting for cow depsgraph implementation. */ +#define DEG_OBJECT_ITER(graph_, instance_, flag_) \ + { \ + DEGObjectsIteratorData data_ = { \ + .graph = (graph_), \ + .flag = (flag_), \ + }; \ + \ + ITER_BEGIN(DEG_objects_iterator_begin, \ + DEG_objects_iterator_next, \ + DEG_objects_iterator_end, \ + &data_, Object *, instance_) + +#define DEG_OBJECT_ITER_END \ + ITER_END \ + } + #ifdef __cplusplus } /* extern "C" */ #endif |