Pose brush: Smooth Iterations Brush Property
[blender.git] / source / blender / depsgraph / DEG_depsgraph_query.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2013 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup depsgraph
22  *
23  * Public API for Querying Depsgraph.
24  */
25
26 #ifndef __DEG_DEPSGRAPH_QUERY_H__
27 #define __DEG_DEPSGRAPH_QUERY_H__
28
29 #include "DEG_depsgraph.h"
30 #include "DEG_depsgraph_build.h"
31
32 /* Needed for the instance iterator. */
33 #include "DNA_object_types.h"
34
35 struct BLI_Iterator;
36 struct CustomData_MeshMasks;
37 struct Depsgraph;
38 struct DupliObject;
39 struct ID;
40 struct ListBase;
41 struct PointerRNA;
42 struct Scene;
43 struct ViewLayer;
44
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48
49 /* *********************** DEG input data ********************* */
50
51 /* Get scene that depsgraph was built for. */
52 struct Scene *DEG_get_input_scene(const Depsgraph *graph);
53
54 /* Get view layer that depsgraph was built for. */
55 struct ViewLayer *DEG_get_input_view_layer(const Depsgraph *graph);
56
57 /* Get evaluation mode that depsgraph was built for. */
58 eEvaluationMode DEG_get_mode(const Depsgraph *graph);
59
60 /* Get time that depsgraph is being evaluated or was last evaluated at. */
61 float DEG_get_ctime(const Depsgraph *graph);
62
63 /* ********************* DEG evaluated data ******************* */
64
65 /* Check if given ID type was tagged for update. */
66 bool DEG_id_type_updated(const struct Depsgraph *depsgraph, short id_type);
67 bool DEG_id_type_any_updated(const struct Depsgraph *depsgraph);
68
69 /* Check if given ID type is present in the depsgraph */
70 bool DEG_id_type_any_exists(const struct Depsgraph *depsgraph, short id_type);
71
72 /* Get additional evaluation flags for the given ID. */
73 uint32_t DEG_get_eval_flags_for_id(const struct Depsgraph *graph, struct ID *id);
74
75 /* Get additional mesh CustomData_MeshMasks flags for the given object. */
76 void DEG_get_customdata_mask_for_object(const struct Depsgraph *graph,
77                                         struct Object *object,
78                                         struct CustomData_MeshMasks *r_mask);
79
80 /* Get scene at its evaluated state.
81  *
82  * Technically, this is a copied-on-written and fully evaluated version of the input scene.
83  * This function will check that the data-block has been expanded (and copied) from the original
84  * one. Assert will happen if it's not. */
85 struct Scene *DEG_get_evaluated_scene(const struct Depsgraph *graph);
86
87 /* Get view layer at its evaluated state.
88  * This is a shortcut for accessing active view layer from evaluated scene. */
89 struct ViewLayer *DEG_get_evaluated_view_layer(const struct Depsgraph *graph);
90
91 /* Get evaluated version of object for given original one. */
92 struct Object *DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object);
93
94 /* Get evaluated version of given ID datablock. */
95 struct ID *DEG_get_evaluated_id(const struct Depsgraph *depsgraph, struct ID *id);
96
97 /* Get evaluated version of data pointed to by RNA pointer */
98 void DEG_get_evaluated_rna_pointer(const struct Depsgraph *depsgraph,
99                                    struct PointerRNA *ptr,
100                                    struct PointerRNA *r_ptr_eval);
101
102 /* Get original version of object for given evaluated one. */
103 struct Object *DEG_get_original_object(struct Object *object);
104
105 /* Get original version of given evaluated ID datablock. */
106 struct ID *DEG_get_original_id(struct ID *id);
107
108 /* Check whether given ID is an original,
109  *
110  * Original IDs are considered all the IDs which are not covered by copy-on-write system and are
111  * not out-of-main localized data-blocks. */
112 bool DEG_is_original_id(struct ID *id);
113 bool DEG_is_original_object(struct Object *object);
114
115 /* Opposite of the above.
116  *
117  * If the data-block is not original it must be evaluated, and vice versa. */
118 bool DEG_is_evaluated_id(struct ID *id);
119 bool DEG_is_evaluated_object(struct Object *object);
120
121 /* Check whether depsgraph os fully evaluated. This includes the following checks:
122  * - Relations are up-to-date.
123  * - Nothing is tagged for update. */
124 bool DEG_is_fully_evaluated(const struct Depsgraph *depsgraph);
125
126 /* ************************ DEG object iterators ********************* */
127
128 enum {
129   DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY = (1 << 0),
130   DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY = (1 << 1),
131   DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET = (1 << 2),
132   DEG_ITER_OBJECT_FLAG_VISIBLE = (1 << 3),
133   DEG_ITER_OBJECT_FLAG_DUPLI = (1 << 4),
134 };
135
136 typedef struct DEGObjectIterData {
137   struct Depsgraph *graph;
138   int flag;
139
140   struct Scene *scene;
141
142   eEvaluationMode eval_mode;
143
144   /* **** Iteration over dupli-list. *** */
145
146   /* Object which created the dupli-list. */
147   struct Object *dupli_parent;
148   /* List of duplicated objects. */
149   struct ListBase *dupli_list;
150   /* Next duplicated object to step into. */
151   struct DupliObject *dupli_object_next;
152   /* Corresponds to current object: current iterator object is evaluated from
153    * this duplicated object. */
154   struct DupliObject *dupli_object_current;
155   /* Temporary storage to report fully populated DNA to the render engine or
156    * other users of the iterator. */
157   struct Object temp_dupli_object;
158
159   /* **** Iteration over ID nodes **** */
160   size_t id_node_index;
161   size_t num_id_nodes;
162 } DEGObjectIterData;
163
164 void DEG_iterator_objects_begin(struct BLI_Iterator *iter, DEGObjectIterData *data);
165 void DEG_iterator_objects_next(struct BLI_Iterator *iter);
166 void DEG_iterator_objects_end(struct BLI_Iterator *iter);
167
168 /**
169  * Note: Be careful with DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY objects.
170  * Although they are available they have no overrides (collection_properties)
171  * and will crash if you try to access it.
172  */
173 #define DEG_OBJECT_ITER_BEGIN(graph_, instance_, flag_) \
174   { \
175     DEGObjectIterData data_ = { \
176         graph_, \
177         flag_, \
178     }; \
179 \
180     ITER_BEGIN (DEG_iterator_objects_begin, \
181                 DEG_iterator_objects_next, \
182                 DEG_iterator_objects_end, \
183                 &data_, \
184                 Object *, \
185                 instance_)
186
187 #define DEG_OBJECT_ITER_END \
188   ITER_END; \
189   } \
190   ((void)0)
191
192 /**
193  * Depsgraph objects iterator for draw manager and final render
194  */
195 #define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(graph_, instance_) \
196   DEG_OBJECT_ITER_BEGIN (graph_, \
197                          instance_, \
198                          DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | \
199                              DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET | DEG_ITER_OBJECT_FLAG_VISIBLE | \
200                              DEG_ITER_OBJECT_FLAG_DUPLI)
201
202 #define DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END DEG_OBJECT_ITER_END
203
204 /* ************************ DEG ID iterators ********************* */
205
206 typedef struct DEGIDIterData {
207   struct Depsgraph *graph;
208   bool only_updated;
209
210   size_t id_node_index;
211   size_t num_id_nodes;
212 } DEGIDIterData;
213
214 void DEG_iterator_ids_begin(struct BLI_Iterator *iter, DEGIDIterData *data);
215 void DEG_iterator_ids_next(struct BLI_Iterator *iter);
216 void DEG_iterator_ids_end(struct BLI_Iterator *iter);
217
218 /* ************************ DEG traversal ********************* */
219
220 typedef void (*DEGForeachIDCallback)(ID *id, void *user_data);
221 typedef void (*DEGForeachIDComponentCallback)(ID *id,
222                                               eDepsObjectComponentType component,
223                                               void *user_data);
224
225 /* NOTE: Modifies runtime flags in depsgraph nodes, so can not be used in
226  * parallel. Keep an eye on that!
227  */
228 void DEG_foreach_ancestor_ID(const Depsgraph *depsgraph,
229                              const ID *id,
230                              DEGForeachIDCallback callback,
231                              void *user_data);
232 void DEG_foreach_dependent_ID(const Depsgraph *depsgraph,
233                               const ID *id,
234                               DEGForeachIDCallback callback,
235                               void *user_data);
236
237 /* Starts traversal from given component of the given ID, invokes callback for every other
238  * component  which is directly on indirectly dependent on the source one. */
239 enum {
240   /* Ignore transform solvers which depends on multiple inputs and affects final transform.
241    * Is used for cases like snapping objects which are part of a rigid body simulation:
242    * without this there will be "false-positive" dependencies between transform components of
243    * objects:
244    *
245    *     object 1 transform before solver ---> solver ------> object 1 final transform
246    *     object 2 transform before solver -----^     \------> object 2 final transform
247    */
248   DEG_FOREACH_COMPONENT_IGNORE_TRANSFORM_SOLVERS,
249 };
250 void DEG_foreach_dependent_ID_component(const Depsgraph *depsgraph,
251                                         const ID *id,
252                                         eDepsObjectComponentType source_component_type,
253                                         int flags,
254                                         DEGForeachIDComponentCallback callback,
255                                         void *user_data);
256
257 void DEG_foreach_ID(const Depsgraph *depsgraph, DEGForeachIDCallback callback, void *user_data);
258
259 #ifdef __cplusplus
260 } /* extern "C" */
261 #endif
262
263 #endif /* __DEG_DEPSGRAPH_QUERY_H__ */