Depsgraph: Be consistent about id type variable name
[blender.git] / source / blender / depsgraph / DEG_depsgraph.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2013 Blender Foundation.
19  * All rights reserved.
20  *
21  * Original Author: Joshua Leung
22  * Contributor(s): None Yet
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/depsgraph/DEG_depsgraph.h
28  *  \ingroup depsgraph
29  *
30  * Public API for Depsgraph
31  *
32  * Dependency Graph
33  * ================
34  *
35  * The dependency graph tracks relations between various pieces of data in
36  * a Blender file, but mainly just those which make up scene data. It is used
37  * to determine the set of operations need to ensure that all data has been
38  * correctly evaluated in response to changes, based on dependencies and visibility
39  * of affected data.
40  *
41  *
42  * Evaluation Engine
43  * =================
44  *
45  * The evaluation takes the operation-nodes the Depsgraph has tagged for updating, 
46  * and schedules them up for being evaluated/executed such that the all dependency
47  * relationship constraints are satisfied. 
48  */
49
50 /* ************************************************* */
51 /* Forward-defined typedefs for core types
52  * - These are used in all depsgraph code and by all callers of Depsgraph API...
53  */
54
55 #ifndef __DEG_DEPSGRAPH_H__
56 #define __DEG_DEPSGRAPH_H__
57
58 /* Dependency Graph */
59 typedef struct Depsgraph Depsgraph;
60
61 /* ------------------------------------------------ */
62
63 struct EvaluationContext;
64 struct Main;
65
66 struct PointerRNA;
67 struct PropertyRNA;
68 struct SceneLayer;
69
70 /* Dependency graph evaluation context
71  *
72  * This structure stores all the local dependency graph data,
73  * which is needed for it's evaluation,
74  */
75 typedef struct EvaluationContext {
76         int mode;
77         float ctime;
78
79         struct SceneLayer *scene_layer;
80 } EvaluationContext;
81
82 typedef enum eEvaluationMode {
83         DAG_EVAL_VIEWPORT       = 0,    /* evaluate for OpenGL viewport */
84         DAG_EVAL_PREVIEW        = 1,    /* evaluate for render with preview settings */
85         DAG_EVAL_RENDER         = 2,    /* evaluate for render purposes */
86 } eEvaluationMode;
87
88 /* DagNode->eval_flags */
89 enum {
90         /* Regardless to curve->path animation flag path is to be evaluated anyway,
91          * to meet dependencies with such a things as curve modifier and other guys
92          * who're using curve deform, where_on_path and so.
93          */
94         DAG_EVAL_NEED_CURVE_PATH = 1,
95         /* Scene evaluation would need to have object's data on CPU,
96          * meaning no GPU shortcuts is allowed.
97          */
98         DAG_EVAL_NEED_CPU        = 2,
99 };
100
101 #ifdef __cplusplus
102 extern "C" {
103 #endif
104
105 bool DEG_depsgraph_use_legacy(void);
106 void DEG_depsgraph_switch_to_legacy(void);
107 void DEG_depsgraph_switch_to_new(void);
108
109 /* ************************************************ */
110 /* Depsgraph API */
111
112 /* CRUD ------------------------------------------- */
113
114 // Get main depsgraph instance from context!
115
116 /* Create new Depsgraph instance */
117 // TODO: what args are needed here? What's the building-graph entry point?
118 Depsgraph *DEG_graph_new(void);
119
120 /* Free Depsgraph itself and all its data */
121 void DEG_graph_free(Depsgraph *graph);
122
123 /* Node Types Registry ---------------------------- */
124
125 /* Register all node types */
126 void DEG_register_node_types(void);
127
128 /* Free node type registry on exit */
129 void DEG_free_node_types(void);
130
131 /* Update Tagging -------------------------------- */
132
133 /* Tag node(s) associated with states such as time and visibility */
134 void DEG_scene_update_flags(Depsgraph *graph, const bool do_time);
135
136 /* Update dependency graph when visible scenes/layers changes. */
137 void DEG_graph_on_visible_update(struct Main *bmain, struct Scene *scene);
138
139 /* Update all dependency graphs when visible scenes/layers changes. */
140 void DEG_on_visible_update(struct Main *bmain, const bool do_time);
141
142 /* Tag given ID for an update in all the dependency graphs. */
143 enum {
144         /* Object transformation changed, corresponds to OB_RECALC_OB. */
145         DEG_TAG_TRANSFORM   = (1 << 0),
146
147         /* Object geoemtry changed, corresponds to OB_RECALC_DATA. */
148         DEG_TAG_GEOMETRY    = (1 << 1),
149
150         /* Time changed and animation is to be re-evaluated, OB_RECALC_TIME. */
151         DEG_TAG_TIME        = (1 << 2),
152
153         /* Particle system changed. */
154         DEG_TAG_PSYSC_REDO  =  (1 << 3),
155         DEG_TAG_PSYS_RESET  =  (1 << 4),
156         DEG_TAG_PSYS_TYPE   =  (1 << 5),
157         DEG_TAG_PSYS_CHILD  = (1 << 6),
158         DEG_TAG_PSYS_PHYS   = (1 << 7),
159         DEG_TAG_PSYS        = ((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)),
160
161         /* Update copy on write component without flushing down the road. */
162         DEG_TAG_COPY_ON_WRITE = (1 << 8),
163
164         /* Tag shading components for update.
165          * Only parameters of material changed).
166          */
167         DEG_TAG_SHADING_UPDATE  = (1 << 9),
168 };
169 void DEG_id_tag_update(struct ID *id, int flag);
170 void DEG_id_tag_update_ex(struct Main *bmain,
171                           struct ID *id,
172                           int flag);
173
174 /* Tag given ID type for update.
175  *
176  * Used by all sort of render engines to quickly check if
177  * IDs of a given type need to be checked for update.
178  */
179 void DEG_id_type_tag(struct Main *bmain, short id_type);
180
181 void DEG_ids_clear_recalc(struct Main *bmain);
182
183 /* Update Flushing ------------------------------- */
184
185 /* Flush updates for all IDs */
186 void DEG_ids_flush_tagged(struct Main *bmain, struct Scene *scene);
187
188 /* Check if something was changed in the database and inform
189  * editors about this.
190  */
191 void DEG_ids_check_recalc(struct Main *bmain,
192                           struct Scene *scene,
193                           bool time);
194
195 /* ************************************************ */
196 /* Evaluation Engine API */
197
198 /* Evaluation Context ---------------------------- */
199
200 /* Create new evaluation context. */
201 struct EvaluationContext *DEG_evaluation_context_new(int mode);
202
203 /* Initialize evaluation context.
204  * Used by the areas which currently overrides the context or doesn't have
205  * access to a proper one.
206  */
207 void DEG_evaluation_context_init(struct EvaluationContext *eval_ctx, int mode);
208
209 /* Free evaluation context. */
210 void DEG_evaluation_context_free(struct EvaluationContext *eval_ctx);
211
212 /* Graph Evaluation  ----------------------------- */
213
214 /* Frame changed recalculation entry point
215  * < context_type: context to perform evaluation for
216  * < ctime: (frame) new frame to evaluate values on
217  */
218 void DEG_evaluate_on_framechange(struct EvaluationContext *eval_ctx,
219                                  struct Main *bmain,
220                                  Depsgraph *graph,
221                                  float ctime);
222
223 /* Data changed recalculation entry point.
224  * < context_type: context to perform evaluation for
225  */
226 void DEG_evaluate_on_refresh_ex(struct EvaluationContext *eval_ctx,
227                                 Depsgraph *graph);
228
229 /* Data changed recalculation entry point.
230  * < context_type: context to perform evaluation for
231  */
232 void DEG_evaluate_on_refresh(struct EvaluationContext *eval_ctx,
233                              Depsgraph *graph,
234                              struct Scene *scene);
235
236 bool DEG_needs_eval(Depsgraph *graph);
237
238 /* Editors Integration  -------------------------- */
239
240 /* Mechanism to allow editors to be informed of depsgraph updates,
241  * to do their own updates based on changes.
242  */
243
244 typedef void (*DEG_EditorUpdateIDCb)(struct Main *bmain, struct ID *id);
245 typedef void (*DEG_EditorUpdateSceneCb)(struct Main *bmain,
246                                         struct Scene *scene,
247                                         int updated);
248 typedef void (*DEG_EditorUpdateScenePreCb)(struct Main *bmain,
249                                            struct Scene *scene,
250                                            bool time);
251
252 /* Set callbacks which are being called when depsgraph changes. */
253 void DEG_editors_set_update_cb(DEG_EditorUpdateIDCb id_func,
254                                DEG_EditorUpdateSceneCb scene_func,
255                                DEG_EditorUpdateScenePreCb scene_pre_func);
256
257 void DEG_editors_update_pre(struct Main *bmain, struct Scene *scene, bool time);
258
259 #ifdef __cplusplus
260 } /* extern "C" */
261 #endif
262
263 #endif  /* __DEG_DEPSGRAPH_H__ */