Merge branch 'master' into blender2.8
[blender.git] / source / blender / depsgraph / intern / 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): Sergey Sharybin
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/depsgraph/intern/depsgraph.h
28  *  \ingroup depsgraph
29  *
30  * Datatypes for internal use in the Depsgraph
31  *
32  * All of these datatypes are only really used within the "core" depsgraph.
33  * In particular, node types declared here form the structure of operations
34  * in the graph.
35  */
36
37 #pragma once
38
39 #include "BLI_threads.h"  /* for SpinLock */
40
41 #include "DEG_depsgraph.h"
42
43 #include "intern/depsgraph_types.h"
44
45 struct ID;
46 struct GHash;
47 struct Main;
48 struct GSet;
49 struct PointerRNA;
50 struct PropertyRNA;
51 struct Scene;
52 struct ViewLayer;
53
54 namespace DEG {
55
56 struct DepsNode;
57 struct TimeSourceDepsNode;
58 struct IDDepsNode;
59 struct ComponentDepsNode;
60 struct OperationDepsNode;
61
62 /* *************************** */
63 /* Relationships Between Nodes */
64
65 /* Settings/Tags on Relationship */
66 typedef enum eDepsRelation_Flag {
67         /* "cyclic" link - when detecting cycles, this relationship was the one
68          * which triggers a cyclic relationship to exist in the graph.
69          */
70         DEPSREL_FLAG_CYCLIC     = (1 << 0),
71         /* Update flush will not go through this relation. */
72         DEPSREL_FLAG_NO_FLUSH   = (1 << 1),
73 } eDepsRelation_Flag;
74
75 /* B depends on A (A -> B) */
76 struct DepsRelation {
77         /* the nodes in the relationship (since this is shared between the nodes) */
78         DepsNode *from;               /* A */
79         DepsNode *to;                 /* B */
80
81         /* relationship attributes */
82         const char *name;             /* label for debugging */
83
84         int flag;                     /* (eDepsRelation_Flag) */
85
86         DepsRelation(DepsNode *from,
87                      DepsNode *to,
88                      const char *description);
89
90         ~DepsRelation();
91
92         void unlink();
93 };
94
95 /* ********* */
96 /* Depsgraph */
97
98 /* Dependency Graph object */
99 struct Depsgraph {
100         // TODO(sergey): Go away from C++ container and use some native BLI.
101         typedef vector<OperationDepsNode *> OperationNodes;
102         typedef vector<IDDepsNode *> IDDepsNodes;
103
104         Depsgraph(Scene *scene,
105                   ViewLayer *view_layer,
106                   eEvaluationMode mode);
107         ~Depsgraph();
108
109         /**
110          * Convenience wrapper to find node given just pointer + property.
111          *
112          * \param ptr: pointer to the data that node will represent
113          * \param prop: optional property affected - providing this effectively
114          *              results in inner nodes being returned
115          *
116          * \return A node matching the required characteristics if it exists
117          * or NULL if no such node exists in the graph
118          */
119         DepsNode *find_node_from_pointer(const PointerRNA *ptr, const PropertyRNA *prop) const;
120
121         TimeSourceDepsNode *add_time_source();
122         TimeSourceDepsNode *find_time_source() const;
123
124         IDDepsNode *find_id_node(const ID *id) const;
125         IDDepsNode *add_id_node(ID *id, ID *id_cow_hint = NULL);
126         void clear_id_nodes();
127
128         /* Add new relationship between two nodes. */
129         DepsRelation *add_new_relation(OperationDepsNode *from,
130                                        OperationDepsNode *to,
131                                        const char *description,
132                                        bool check_unique = false);
133
134         DepsRelation *add_new_relation(DepsNode *from,
135                                        DepsNode *to,
136                                        const char *description,
137                                        bool check_unique = false);
138
139         /* Check whether two nodes are connected by relation with given
140          * description. Description might be NULL to check ANY relation between
141          * given nodes.
142          */
143         DepsRelation *check_nodes_connected(const DepsNode *from,
144                                             const DepsNode *to,
145                                             const char *description);
146
147         /* Tag a specific node as needing updates. */
148         void add_entry_tag(OperationDepsNode *node);
149
150         /* Clear storage used by all nodes. */
151         void clear_all_nodes();
152
153         /* Copy-on-Write Functionality ........ */
154
155         /* For given original ID get ID which is created by CoW system. */
156         ID *get_cow_id(const ID *id_orig) const;
157
158         /* Core Graph Functionality ........... */
159
160         /* <ID : IDDepsNode> mapping from ID blocks to nodes representing these
161          * blocks, used for quick lookups.
162          */
163         GHash *id_hash;
164
165         /* Ordered list of ID nodes, order matches ID allocation order.
166          * Used for faster iteration, especially for areas which are critical to
167          * keep exact order of iteration.
168          */
169         IDDepsNodes id_nodes;
170
171         /* Top-level time source node. */
172         TimeSourceDepsNode *time_source;
173
174         /* Indicates whether relations needs to be updated. */
175         bool need_update;
176
177         /* Quick-Access Temp Data ............. */
178
179         /* Nodes which have been tagged as "directly modified". */
180         GSet *entry_tags;
181
182         /* Convenience Data ................... */
183
184         /* XXX: should be collected after building (if actually needed?) */
185         /* All operation nodes, sorted in order of single-thread traversal order. */
186         OperationNodes operations;
187
188         /* Spin lock for threading-critical operations.
189          * Mainly used by graph evaluation.
190          */
191         SpinLock lock;
192
193         /* Scene, layer, mode this dependency graph is built for. */
194         Scene *scene;
195         ViewLayer *view_layer;
196         eEvaluationMode mode;
197
198         /* Time at which dependency graph is being or was last evaluated. */
199         float ctime;
200 };
201
202 }  // namespace DEG