Depsgraph: New dependency graph integration commit
[blender.git] / source / blender / depsgraph / intern / depsnode.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 #ifndef __DEPSNODE_H__
28 #define __DEPSNODE_H__
29
30 #include "depsgraph_types.h"
31
32 #include "depsgraph_util_hash.h"
33 #include "depsgraph_util_map.h"
34 #include "depsgraph_util_set.h"
35
36 struct ID;
37 struct Scene;
38
39 struct Depsgraph;
40 struct DepsRelation;
41 struct DepsgraphCopyContext;
42 struct OperationDepsNode;
43
44 /* *********************************** */
45 /* Base-Defines for Nodes in Depsgraph */
46
47 /* All nodes in Depsgraph are descended from this. */
48 struct DepsNode {
49         /* Helper class for static typeinfo in subclasses. */
50         struct TypeInfo {
51                 TypeInfo(eDepsNode_Type type, const char *tname);
52
53                 eDepsNode_Type type;
54                 eDepsNode_Class tclass;
55                 const char *tname;
56         };
57
58         /* Identifier - mainly for debugging purposes. */
59         string name;
60
61         /* Structural type of node. */
62         eDepsNode_Type type;
63
64         /* Type of data/behaviour represented by node... */
65         eDepsNode_Class tclass;
66
67         /* Relationships between nodes
68          * The reason why all depsgraph nodes are descended from this type (apart
69          * from basic serialization benefits - from the typeinfo) is that we can have
70          * relationships between these nodes!
71          */
72         typedef unordered_set<DepsRelation *> Relations;
73
74         /* Nodes which this one depends on. */
75         Relations inlinks;
76
77         /* Nodes which depend on this one. */
78         Relations outlinks;
79
80         /* Generic tag for traversal algorithms */
81         int done;
82
83         /* Methods. */
84
85         DepsNode();
86         virtual ~DepsNode();
87
88         virtual string identifier() const;
89         string full_identifier() const;
90
91         virtual void init(const ID * /*id*/,
92                           const string &/*subdata*/) {}
93         virtual void copy(DepsgraphCopyContext * /*dcc*/,
94                           const DepsNode * /*src*/) {}
95
96         virtual void tag_update(Depsgraph * /*graph*/) {}
97
98         virtual OperationDepsNode *get_entry_operation() { return NULL; }
99         virtual OperationDepsNode *get_exit_operation() { return NULL; }
100 };
101
102 /* Macros for common static typeinfo. */
103 #define DEG_DEPSNODE_DECLARE \
104         static const DepsNode::TypeInfo typeinfo
105 #define DEG_DEPSNODE_DEFINE(NodeType, type_, tname_) \
106         const DepsNode::TypeInfo NodeType::typeinfo = DepsNode::TypeInfo(type_, tname_)
107
108 /* Generic Nodes ======================= */
109
110 struct ComponentDepsNode;
111 struct IDDepsNode;
112
113 /* Time Source Node. */
114 struct TimeSourceDepsNode : public DepsNode {
115         /* New "current time". */
116         float cfra;
117
118         /* time-offset relative to the "official" time source that this one has. */
119         float offset;
120
121         // TODO: evaluate() operation needed
122
123         void tag_update(Depsgraph *graph);
124
125         DEG_DEPSNODE_DECLARE;
126 };
127
128 /* Root Node. */
129 struct RootDepsNode : public DepsNode {
130         ~RootDepsNode();
131
132         TimeSourceDepsNode *add_time_source(const string &name = "");
133
134         /* scene that this corresponds to */
135         Scene *scene;
136
137         /* Entrypoint node for time-changed. */
138         TimeSourceDepsNode *time_source;
139
140         DEG_DEPSNODE_DECLARE;
141 };
142
143 /* ID-Block Reference */
144 struct IDDepsNode : public DepsNode {
145         struct ComponentIDKey {
146                 ComponentIDKey(eDepsNode_Type type, const string &name = "")
147                     : type(type), name(name) {}
148
149                 bool operator== (const ComponentIDKey &other) const
150                 {
151                         return type == other.type && name == other.name;
152                 }
153
154                 eDepsNode_Type type;
155                 string name;
156         };
157
158         /* XXX can't specialize std::hash for this purpose, because ComponentIDKey is
159          * a nested type ...
160          *
161          *   http://stackoverflow.com/a/951245
162          */
163         struct component_key_hash {
164                 bool operator() (const ComponentIDKey &key) const
165                 {
166                         return hash_combine(hash<int>()(key.type), hash<string>()(key.name));
167                 }
168         };
169
170         typedef unordered_map<ComponentIDKey,
171                               ComponentDepsNode*,
172                               component_key_hash> ComponentMap;
173
174         void init(const ID *id, const string &subdata);
175         void copy(DepsgraphCopyContext *dcc, const IDDepsNode *src);
176         ~IDDepsNode();
177
178         ComponentDepsNode *find_component(eDepsNode_Type type,
179                                           const string &name = "") const;
180         ComponentDepsNode *add_component(eDepsNode_Type type,
181                                          const string &name = "");
182         void remove_component(eDepsNode_Type type, const string &name = "");
183         void clear_components();
184
185         void tag_update(Depsgraph *graph);
186
187         /* ID Block referenced. */
188         ID *id;
189
190         /* Hash to make it faster to look up components. */
191         ComponentMap components;
192
193         /* Layers of this node with accumulated layers of it's output relations. */
194         int layers;
195
196         /* Additional flags needed for scene evaluation.
197          * TODO(sergey): Only needed for until really granual updates
198          * of all the entities.
199          */
200         int eval_flags;
201
202         DEG_DEPSNODE_DECLARE;
203 };
204
205 /* Subgraph Reference. */
206 struct SubgraphDepsNode : public DepsNode {
207         void init(const ID *id, const string &subdata);
208         void copy(DepsgraphCopyContext *dcc, const SubgraphDepsNode *src);
209         ~SubgraphDepsNode();
210
211         /* Instanced graph. */
212         Depsgraph *graph;
213
214         /* ID-block at root of subgraph (if applicable). */
215         ID *root_id;
216
217         /* Number of nodes which use/reference this subgraph - if just 1, it may be
218          * possible to merge into main,
219          */
220         size_t num_users;
221
222         /* (eSubgraphRef_Flag) assorted settings for subgraph node. */
223         int flag;
224
225         DEG_DEPSNODE_DECLARE;
226 };
227
228 /* Flags for subgraph node */
229 typedef enum eSubgraphRef_Flag {
230         /* Subgraph referenced is shared with another reference, so shouldn't
231          * free on exit.
232          */
233         SUBGRAPH_FLAG_SHARED      = (1 << 0),
234
235         /* Node is first reference to subgraph, so it can be freed when we are
236          * removed.
237          */
238         SUBGRAPH_FLAG_FIRSTREF    = (1 << 1),
239 } eSubgraphRef_Flag;
240
241 void DEG_register_base_depsnodes();
242
243 #endif  /* __DEPSNODE_H__ */