Object Mode: Add to EvaluationContext & DRWContextState
[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 RenderEngineType;
69 struct Scene;
70 struct ViewLayer;
71
72 typedef enum eEvaluationMode {
73         DAG_EVAL_VIEWPORT       = 0,    /* evaluate for OpenGL viewport */
74         DAG_EVAL_PREVIEW        = 1,    /* evaluate for render with preview settings */
75         DAG_EVAL_RENDER         = 2,    /* evaluate for render purposes */
76 } eEvaluationMode;
77
78 /* Dependency graph evaluation context
79  *
80  * This structure stores all the local dependency graph data,
81  * which is needed for it's evaluation,
82  */
83 typedef struct EvaluationContext {
84         eEvaluationMode mode;
85         float ctime;
86         short object_mode;
87
88         struct Depsgraph *depsgraph;
89         struct ViewLayer *view_layer;
90         struct RenderEngineType *engine_type;
91 } EvaluationContext;
92
93 /* DagNode->eval_flags */
94 enum {
95         /* Regardless to curve->path animation flag path is to be evaluated anyway,
96          * to meet dependencies with such a things as curve modifier and other guys
97          * who're using curve deform, where_on_path and so.
98          */
99         DAG_EVAL_NEED_CURVE_PATH = 1,
100         /* Scene evaluation would need to have object's data on CPU,
101          * meaning no GPU shortcuts is allowed.
102          */
103         DAG_EVAL_NEED_CPU        = 2,
104 };
105
106 #ifdef __cplusplus
107 extern "C" {
108 #endif
109
110 bool DEG_depsgraph_use_copy_on_write(void);
111 void DEG_depsgraph_enable_copy_on_write(void);
112
113 /* ************************************************ */
114 /* Depsgraph API */
115
116 /* CRUD ------------------------------------------- */
117
118 // Get main depsgraph instance from context!
119
120 /* Create new Depsgraph instance */
121 // TODO: what args are needed here? What's the building-graph entry point?
122 Depsgraph *DEG_graph_new(void);
123
124 /* Free Depsgraph itself and all its data */
125 void DEG_graph_free(Depsgraph *graph);
126
127 /* Node Types Registry ---------------------------- */
128
129 /* Register all node types */
130 void DEG_register_node_types(void);
131
132 /* Free node type registry on exit */
133 void DEG_free_node_types(void);
134
135 /* Update Tagging -------------------------------- */
136
137 /* Update dependency graph when visible scenes/layers changes. */
138 void DEG_graph_on_visible_update(struct Main *bmain, Depsgraph *depsgraph);
139
140 /* Update all dependency graphs when visible scenes/layers changes. */
141 void DEG_on_visible_update(struct Main *bmain, const bool do_time);
142
143 /* Tag given ID for an update in all the dependency graphs. */
144 typedef enum eDepsgraph_Tag {
145         /* Object transformation changed, corresponds to OB_RECALC_OB. */
146         DEG_TAG_TRANSFORM   = (1 << 0),
147         /* Object geometry changed, corresponds to OB_RECALC_DATA. */
148         DEG_TAG_GEOMETRY    = (1 << 1),
149         /* Time changed and animation is to be re-evaluated, OB_RECALC_TIME. */
150         DEG_TAG_TIME        = (1 << 2),
151         /* Particle system changed. */
152         DEG_TAG_PSYS_REDO   = (1 << 3),
153         DEG_TAG_PSYS_RESET  = (1 << 4),
154         DEG_TAG_PSYS_TYPE   = (1 << 5),
155         DEG_TAG_PSYS_CHILD  = (1 << 6),
156         DEG_TAG_PSYS_PHYS   = (1 << 7),
157         DEG_TAG_PSYS_ALL    = (DEG_TAG_PSYS_REDO |
158                                DEG_TAG_PSYS_RESET |
159                                DEG_TAG_PSYS_TYPE |
160                                DEG_TAG_PSYS_CHILD |
161                                DEG_TAG_PSYS_PHYS),
162         /* Update copy on write component without flushing down the road. */
163         DEG_TAG_COPY_ON_WRITE = (1 << 8),
164         /* Tag shading components for update.
165          * Only parameters of material changed).
166          */
167         DEG_TAG_SHADING_UPDATE  = (1 << 9),
168         DEG_TAG_SELECT_UPDATE   = (1 << 10),
169         DEG_TAG_BASE_FLAGS_UPDATE = (1 << 11),
170         /* Only inform editors about the change. Don't modify datablock itself. */
171         DEG_TAG_EDITORS_UPDATE = (1 << 12),
172 } eDepsgraph_Tag;
173 void DEG_id_tag_update(struct ID *id, int flag);
174 void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag);
175
176 void DEG_graph_id_tag_update(struct Main *bmain,
177                              struct Depsgraph *depsgraph,
178                              struct ID *id,
179                              int flag);
180
181 /* Mark a particular datablock type as having changing. This does
182  * not cause any updates but is used by external render engines to detect if for
183  * example a datablock was removed.
184  */
185 void DEG_id_type_tag(struct Main *bmain, short id_type);
186
187 void DEG_ids_clear_recalc(struct Main *bmain);
188
189 /* Update Flushing ------------------------------- */
190
191 /* Flush updates for IDs in a single scene. */
192 void DEG_graph_flush_update(struct Main *bmain, Depsgraph *depsgraph);
193
194 /* Check if something was changed in the database and inform
195  * editors about this.
196  */
197 void DEG_ids_check_recalc(struct Main *bmain,
198                           struct Depsgraph *depsgraph,
199                           struct Scene *scene,
200                           struct ViewLayer *view_layer,
201                           bool time);
202
203 /* ************************************************ */
204 /* Evaluation Engine API */
205
206 /* Evaluation Context ---------------------------- */
207
208 /* Create new evaluation context. */
209 struct EvaluationContext *DEG_evaluation_context_new(eEvaluationMode mode);
210
211 /* Initialize evaluation context.
212  * Used by the areas which currently overrides the context or doesn't have
213  * access to a proper one.
214  */
215 void DEG_evaluation_context_init(struct EvaluationContext *eval_ctx,
216                                  eEvaluationMode mode);
217 void DEG_evaluation_context_init_from_scene(
218         struct EvaluationContext *eval_ctx,
219         struct Scene *scene,
220         struct ViewLayer *view_layer,
221         struct RenderEngineType *engine_type,
222         const short object_mode,
223         eEvaluationMode mode);
224
225 /* Free evaluation context. */
226 void DEG_evaluation_context_free(struct EvaluationContext *eval_ctx);
227
228 /* Graph Evaluation  ----------------------------- */
229
230 /* Frame changed recalculation entry point
231  * < context_type: context to perform evaluation for
232  * < ctime: (frame) new frame to evaluate values on
233  */
234 void DEG_evaluate_on_framechange(struct EvaluationContext *eval_ctx,
235                                  struct Main *bmain,
236                                  Depsgraph *graph,
237                                  float ctime);
238
239 /* Data changed recalculation entry point.
240  * < context_type: context to perform evaluation for
241  */
242 void DEG_evaluate_on_refresh(struct EvaluationContext *eval_ctx,
243                              Depsgraph *graph);
244
245 bool DEG_needs_eval(Depsgraph *graph);
246
247 /* Editors Integration  -------------------------- */
248
249 /* Mechanism to allow editors to be informed of depsgraph updates,
250  * to do their own updates based on changes.
251  */
252
253 typedef struct DEGEditorUpdateContext {
254         struct Main *bmain;
255         struct Depsgraph *depsgraph;
256         struct Scene *scene;
257         struct ViewLayer *view_layer;
258 } DEGEditorUpdateContext;
259
260 typedef void (*DEG_EditorUpdateIDCb)(
261         const DEGEditorUpdateContext *update_ctx,
262         struct ID *id);
263 typedef void (*DEG_EditorUpdateSceneCb)(
264         const DEGEditorUpdateContext *update_ctx, int updated);
265
266 /* Set callbacks which are being called when depsgraph changes. */
267 void DEG_editors_set_update_cb(DEG_EditorUpdateIDCb id_func,
268                                DEG_EditorUpdateSceneCb scene_func);
269
270 #ifdef __cplusplus
271 } /* extern "C" */
272 #endif
273
274 #endif  /* __DEG_DEPSGRAPH_H__ */