Merge branch 'blender2.7'
[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 PointerRNA;
59 struct PropertyRNA;
60 struct RenderEngineType;
61 struct Scene;
62 struct ViewLayer;
63
64 typedef enum eEvaluationMode {
65         DAG_EVAL_VIEWPORT       = 0,    /* evaluate for OpenGL viewport */
66         DAG_EVAL_RENDER         = 1,    /* evaluate for render purposes */
67 } eEvaluationMode;
68
69 /* DagNode->eval_flags */
70 enum {
71         /* Regardless to curve->path animation flag path is to be evaluated anyway,
72          * to meet dependencies with such a things as curve modifier and other guys
73          * who're using curve deform, where_on_path and so. */
74         DAG_EVAL_NEED_CURVE_PATH = (1 << 0),
75         /* A shrinkwrap modifier or constraint targeting this mesh needs information
76          * about non-manifold boundary edges for the Target Normal Project mode. */
77         DAG_EVAL_NEED_SHRINKWRAP_BOUNDARY = (1 << 1),
78 };
79
80 #ifdef __cplusplus
81 extern "C" {
82 #endif
83
84 /* ************************************************ */
85 /* Depsgraph API */
86
87 /* CRUD ------------------------------------------- */
88
89 // Get main depsgraph instance from context!
90
91 /* Create new Depsgraph instance */
92 // TODO: what args are needed here? What's the building-graph entry point?
93 Depsgraph *DEG_graph_new(struct Scene *scene,
94                          struct ViewLayer *view_layer,
95                          eEvaluationMode mode);
96
97 /* Free Depsgraph itself and all its data */
98 void DEG_graph_free(Depsgraph *graph);
99
100 /* Node Types Registry ---------------------------- */
101
102 /* Register all node types */
103 void DEG_register_node_types(void);
104
105 /* Free node type registry on exit */
106 void DEG_free_node_types(void);
107
108 /* Update Tagging -------------------------------- */
109
110 /* Update dependency graph when visible scenes/layers changes. */
111 void DEG_graph_on_visible_update(struct Main *bmain, Depsgraph *depsgraph);
112
113 /* Update all dependency graphs when visible scenes/layers changes. */
114 void DEG_on_visible_update(struct Main *bmain, const bool do_time);
115
116 const char *DEG_update_tag_as_string(IDRecalcFlag flag);
117
118 void DEG_id_tag_update(struct ID *id, int flag);
119 void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag);
120
121 void DEG_graph_id_tag_update(struct Main *bmain,
122                              struct Depsgraph *depsgraph,
123                              struct ID *id,
124                              int flag);
125
126 /* Mark a particular datablock type as having changing. This does
127  * not cause any updates but is used by external render engines to detect if for
128  * example a datablock was removed. */
129 void DEG_graph_id_type_tag(struct Depsgraph *depsgraph, short id_type);
130 void DEG_id_type_tag(struct Main *bmain, short id_type);
131
132 void DEG_ids_clear_recalc(struct Main *bmain, Depsgraph *depsgraph);
133
134 /* Update Flushing ------------------------------- */
135
136 /* Flush updates for IDs in a single scene. */
137 void DEG_graph_flush_update(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,
158                                  Depsgraph *graph,
159                                  float ctime);
160
161 /* Data changed recalculation entry point.
162  * < context_type: context to perform evaluation for
163  */
164 void DEG_evaluate_on_refresh(Depsgraph *graph);
165
166 bool DEG_needs_eval(Depsgraph *graph);
167
168 /* Editors Integration  -------------------------- */
169
170 /* Mechanism to allow editors to be informed of depsgraph updates,
171  * to do their own updates based on changes.
172  */
173
174 typedef struct DEGEditorUpdateContext {
175         struct Main *bmain;
176         struct Depsgraph *depsgraph;
177         struct Scene *scene;
178         struct ViewLayer *view_layer;
179 } DEGEditorUpdateContext;
180
181 typedef void (*DEG_EditorUpdateIDCb)(
182         const DEGEditorUpdateContext *update_ctx,
183         struct ID *id);
184 typedef void (*DEG_EditorUpdateSceneCb)(
185         const DEGEditorUpdateContext *update_ctx, int updated);
186
187 /* Set callbacks which are being called when depsgraph changes. */
188 void DEG_editors_set_update_cb(DEG_EditorUpdateIDCb id_func,
189                                DEG_EditorUpdateSceneCb scene_func);
190
191 /* Evaluation  ----------------------------------- */
192
193 bool DEG_is_active(const struct Depsgraph *depsgraph);
194 void DEG_make_active(struct Depsgraph *depsgraph);
195 void DEG_make_inactive(struct Depsgraph *depsgraph);
196
197 /* Evaluation Debug ------------------------------ */
198
199 bool DEG_debug_is_evaluating(struct Depsgraph *depsgraph);
200
201 void DEG_debug_print_begin(struct Depsgraph *depsgraph);
202
203 void DEG_debug_print_eval(struct Depsgraph *depsgraph,
204                           const char *function_name,
205                           const char *object_name,
206                           const void *object_address);
207
208 void DEG_debug_print_eval_subdata(struct Depsgraph *depsgraph,
209                                   const char *function_name,
210                                   const char *object_name,
211                                   const void *object_address,
212                                   const char *subdata_comment,
213                                   const char *subdata_name,
214                                   const void *subdata_address);
215
216 void DEG_debug_print_eval_subdata_index(struct Depsgraph *depsgraph,
217                                         const char *function_name,
218                                         const char *object_name,
219                                         const void *object_address,
220                                         const char *subdata_comment,
221                                         const char *subdata_name,
222                                         const void *subdata_address,
223                                         const int subdata_index);
224
225 void DEG_debug_print_eval_parent_typed(struct Depsgraph *depsgraph,
226                                        const char *function_name,
227                                        const char *object_name,
228                                        const void *object_address,
229                                        const char *parent_comment,
230                                        const char *parent_name,
231                                        const void *parent_address);
232
233 void DEG_debug_print_eval_time(struct Depsgraph *depsgraph,
234                                const char *function_name,
235                                const char *object_name,
236                                const void *object_address,
237                                float time);
238
239 #ifdef __cplusplus
240 } /* extern "C" */
241 #endif
242
243 #endif  /* __DEG_DEPSGRAPH_H__ */