Fix building without translations enabled
[blender.git] / source / blender / depsgraph / DEG_depsgraph.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 Depsgraph
24  *
25  * Dependency Graph
26  * ================
27  *
28  * The dependency graph tracks relations between various pieces of data in
29  * a Blender file, but mainly just those which make up scene data. It is used
30  * to determine the set of operations need to ensure that all data has been
31  * correctly evaluated in response to changes, based on dependencies and visibility
32  * of affected data.
33  * Evaluation Engine
34  * =================
35  *
36  * The evaluation takes the operation-nodes the Depsgraph has tagged for updating,
37  * and schedules them up for being evaluated/executed such that the all dependency
38  * relationship constraints are satisfied.
39  */
40
41 /* ************************************************* */
42 /* Forward-defined typedefs for core types
43  * - These are used in all depsgraph code and by all callers of Depsgraph API...
44  */
45
46 #ifndef __DEG_DEPSGRAPH_H__
47 #define __DEG_DEPSGRAPH_H__
48
49 #include "DNA_ID.h"
50
51 /* Dependency Graph */
52 typedef struct Depsgraph Depsgraph;
53
54 /* ------------------------------------------------ */
55
56 struct Main;
57
58 struct Scene;
59 struct ViewLayer;
60
61 typedef enum eEvaluationMode {
62   DAG_EVAL_VIEWPORT = 0, /* evaluate for OpenGL viewport */
63   DAG_EVAL_RENDER = 1,   /* evaluate for render purposes */
64 } eEvaluationMode;
65
66 /* DagNode->eval_flags */
67 enum {
68   /* Regardless to curve->path animation flag path is to be evaluated anyway,
69    * to meet dependencies with such a things as curve modifier and other guys
70    * who're using curve deform, where_on_path and so. */
71   DAG_EVAL_NEED_CURVE_PATH = (1 << 0),
72   /* A shrinkwrap modifier or constraint targeting this mesh needs information
73    * about non-manifold boundary edges for the Target Normal Project mode. */
74   DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY = (1 << 1),
75 };
76
77 #ifdef __cplusplus
78 extern "C" {
79 #endif
80
81 /* ************************************************ */
82 /* Depsgraph API */
83
84 /* CRUD ------------------------------------------- */
85
86 // Get main depsgraph instance from context!
87
88 /* Create new Depsgraph instance */
89 // TODO: what args are needed here? What's the building-graph entry point?
90 Depsgraph *DEG_graph_new(struct Main *bmain,
91                          struct Scene *scene,
92                          struct ViewLayer *view_layer,
93                          eEvaluationMode mode);
94
95 void DEG_graph_replace_owners(struct Depsgraph *depsgraph,
96                               struct Main *bmain,
97                               struct Scene *scene,
98                               struct ViewLayer *view_layer);
99
100 /* Free Depsgraph itself and all its data */
101 void DEG_graph_free(Depsgraph *graph);
102
103 /* Node Types Registry ---------------------------- */
104
105 /* Register all node types */
106 void DEG_register_node_types(void);
107
108 /* Free node type registry on exit */
109 void DEG_free_node_types(void);
110
111 /* Update Tagging -------------------------------- */
112
113 /* Update dependency graph when visible scenes/layers changes. */
114 void DEG_graph_on_visible_update(struct Main *bmain, Depsgraph *depsgraph, const bool do_time);
115
116 /* Update all dependency graphs when visible scenes/layers changes. */
117 void DEG_on_visible_update(struct Main *bmain, const bool do_time);
118
119 /* NOTE: Will return NULL if the flag is not known, allowing to gracefully handle situations
120  * when recalc flag has been removed. */
121 const char *DEG_update_tag_as_string(IDRecalcFlag flag);
122
123 void DEG_id_tag_update(struct ID *id, int flag);
124 void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag);
125
126 void DEG_graph_id_tag_update(struct Main *bmain,
127                              struct Depsgraph *depsgraph,
128                              struct ID *id,
129                              int flag);
130
131 /* Mark a particular datablock type as having changing. This does
132  * not cause any updates but is used by external render engines to detect if for
133  * example a datablock was removed. */
134 void DEG_graph_id_type_tag(struct Depsgraph *depsgraph, short id_type);
135 void DEG_id_type_tag(struct Main *bmain, short id_type);
136
137 void DEG_ids_clear_recalc(struct Main *bmain, Depsgraph *depsgraph);
138
139 /* Check if something was changed in the database and inform
140  * editors about this.
141  */
142 void DEG_ids_check_recalc(struct Main *bmain,
143                           struct Depsgraph *depsgraph,
144                           struct Scene *scene,
145                           struct ViewLayer *view_layer,
146                           bool time);
147
148 /* ************************************************ */
149 /* Evaluation Engine API */
150
151 /* Graph Evaluation  ----------------------------- */
152
153 /* Frame changed recalculation entry point
154  * < context_type: context to perform evaluation for
155  * < ctime: (frame) new frame to evaluate values on
156  */
157 void DEG_evaluate_on_framechange(struct Main *bmain, Depsgraph *graph, float ctime);
158
159 /* Data changed recalculation entry point.
160  * < context_type: context to perform evaluation for
161  */
162 void DEG_evaluate_on_refresh(struct Main *bmain, Depsgraph *graph);
163
164 bool DEG_needs_eval(Depsgraph *graph);
165
166 /* Editors Integration  -------------------------- */
167
168 /* Mechanism to allow editors to be informed of depsgraph updates,
169  * to do their own updates based on changes.
170  */
171
172 typedef struct DEGEditorUpdateContext {
173   struct Main *bmain;
174   struct Depsgraph *depsgraph;
175   struct Scene *scene;
176   struct ViewLayer *view_layer;
177 } DEGEditorUpdateContext;
178
179 typedef void (*DEG_EditorUpdateIDCb)(const DEGEditorUpdateContext *update_ctx, struct ID *id);
180 typedef void (*DEG_EditorUpdateSceneCb)(const DEGEditorUpdateContext *update_ctx, int updated);
181
182 /* Set callbacks which are being called when depsgraph changes. */
183 void DEG_editors_set_update_cb(DEG_EditorUpdateIDCb id_func, DEG_EditorUpdateSceneCb scene_func);
184
185 /* Evaluation  ----------------------------------- */
186
187 bool DEG_is_evaluating(struct Depsgraph *depsgraph);
188
189 bool DEG_is_active(const struct Depsgraph *depsgraph);
190 void DEG_make_active(struct Depsgraph *depsgraph);
191 void DEG_make_inactive(struct Depsgraph *depsgraph);
192
193 /* Evaluation Debug ------------------------------ */
194
195 void DEG_debug_print_begin(struct Depsgraph *depsgraph);
196
197 void DEG_debug_print_eval(struct Depsgraph *depsgraph,
198                           const char *function_name,
199                           const char *object_name,
200                           const void *object_address);
201
202 void DEG_debug_print_eval_subdata(struct Depsgraph *depsgraph,
203                                   const char *function_name,
204                                   const char *object_name,
205                                   const void *object_address,
206                                   const char *subdata_comment,
207                                   const char *subdata_name,
208                                   const void *subdata_address);
209
210 void DEG_debug_print_eval_subdata_index(struct Depsgraph *depsgraph,
211                                         const char *function_name,
212                                         const char *object_name,
213                                         const void *object_address,
214                                         const char *subdata_comment,
215                                         const char *subdata_name,
216                                         const void *subdata_address,
217                                         const int subdata_index);
218
219 void DEG_debug_print_eval_parent_typed(struct Depsgraph *depsgraph,
220                                        const char *function_name,
221                                        const char *object_name,
222                                        const void *object_address,
223                                        const char *parent_comment,
224                                        const char *parent_name,
225                                        const void *parent_address);
226
227 void DEG_debug_print_eval_time(struct Depsgraph *depsgraph,
228                                const char *function_name,
229                                const char *object_name,
230                                const void *object_address,
231                                float time);
232
233 #ifdef __cplusplus
234 } /* extern "C" */
235 #endif
236
237 #endif /* __DEG_DEPSGRAPH_H__ */