doxygen: add newline after \file
[blender.git] / source / blender / depsgraph / intern / node / deg_node.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
24 #pragma once
25
26 #include "intern/depsgraph_type.h"
27
28 #include "BLI_utildefines.h"
29
30 struct GHash;
31 struct ID;
32 struct Scene;
33
34 namespace DEG {
35
36 struct Depsgraph;
37 struct OperationNode;
38 struct Relation;
39
40 /* Metatype of Nodes - The general "level" in the graph structure
41  * the node serves. */
42 enum class NodeClass {
43         /* Types generally unassociated with user-visible entities,
44          * but needed for graph functioning. */
45         GENERIC         = 0,
46         /* [Outer Node] An "aspect" of evaluating/updating an ID-Block, requiring
47          * certain types of evaluation behavior. */
48         COMPONENT       = 1,
49         /* [Inner Node] A glorified function-pointer/callback for scheduling up
50          * evaluation operations for components, subject to relationship
51          * requirements. */
52         OPERATION       = 2,
53 };
54 const char *nodeClassAsString(NodeClass node_class);
55
56 /* Types of Nodes */
57 enum class NodeType {
58         /* Fallback type for invalid return value */
59         UNDEFINED        = 0,
60         /* Inner Node (Operation) */
61         OPERATION,
62
63         /* **** Generic Types **** */
64
65         /* Time-Source */
66         TIMESOURCE,
67         /* ID-Block reference - used as landmarks/collection point for components,
68          * but not usually part of main graph. */
69         ID_REF,
70
71         /* **** Outer Types **** */
72
73         /* Parameters Component - Default when nothing else fits
74          * (i.e. just SDNA property setting). */
75         PARAMETERS,
76         /* Generic "Proxy-Inherit" Component. */
77         PROXY,
78         /* Animation Component */
79         ANIMATION,
80         /* Transform Component (Parenting/Constraints) */
81         TRANSFORM,
82         /* Geometry Component (Mesh/Displist) */
83         GEOMETRY,
84         /* Sequencer Component (Scene Only) */
85         SEQUENCER,
86         /* Component which contains all operations needed for layer collections
87          * evaluation. */
88         LAYER_COLLECTIONS,
89         /* Entry component of majority of ID nodes: prepares CoW pointers for
90          * execution. */
91         COPY_ON_WRITE,
92         /* Used by all operations which are updating object when something is
93          * changed in view layer. */
94         OBJECT_FROM_LAYER,
95         /* Un-interestying datablock, which is a part of dependency graph, but does
96          * not have very distinctive update procedure.  */
97         GENERIC_DATABLOCK,
98
99         /* **** Evaluation-Related Outer Types (with Subdata) **** */
100
101         /* Pose Component - Owner/Container of Bones Eval */
102         EVAL_POSE,
103         /* Bone Component - Child/Subcomponent of Pose */
104         BONE,
105         /* Particle Systems Component */
106         PARTICLE_SYSTEM,
107         PARTICLE_SETTINGS,
108         /* Material Shading Component */
109         SHADING,
110         SHADING_PARAMETERS,
111         /* Point cache Component */
112         POINT_CACHE,
113         /* Cache Component */
114         /* TODO(sergey); Verify that we really need this. */
115         CACHE,
116         /* Batch Cache Component.
117          * TODO (dfelinto/sergey): rename to make it more generic. */
118         BATCH_CACHE,
119         /* Duplication system. Used to force duplicated objects visible when
120          * when duplicator is visible. */
121         DUPLI,
122         /* Synchronization back to original datablock. */
123         SYNCHRONIZATION,
124
125         /* Total number of meaningful node types. */
126         NUM_TYPES,
127 };
128 const char *nodeTypeAsString(NodeType type);
129
130 /* All nodes in Depsgraph are descended from this. */
131 struct Node {
132         /* Helper class for static typeinfo in subclasses. */
133         struct TypeInfo {
134                 TypeInfo(NodeType type,
135                         const char *type_name,
136                         int id_recalc_tag = 0);
137                 NodeType type;
138                 const char *type_name;
139                 int id_recalc_tag;
140         };
141         struct Stats {
142                 Stats();
143                 /* Reset all the counters. Including all stats needed for average
144                  * evaluation time calculation. */
145                 void reset();
146                 /* Reset counters needed for the current graph evaluation, does not
147                  * touch averaging accumulators. */
148                 void reset_current();
149                 /* Time spend on this node during current graph evaluation. */
150                 double current_time;
151         };
152         /* Relationships between nodes
153          * The reason why all depsgraph nodes are descended from this type (apart
154          * from basic serialization benefits - from the typeinfo) is that we can
155          * have relationships between these nodes. */
156         typedef vector<Relation *> Relations;
157
158         const char *name;     /* Identifier - mainly for debugging purposes. */
159         NodeType type;  /* Structural type of node. */
160         Relations inlinks;    /* Nodes which this one depends on. */
161         Relations outlinks;   /* Nodes which depend on this one. */
162         Stats stats;  /* Evaluation statistics. */
163
164         /* Generic tags for traversal algorithms and such.
165          *
166          * Actual meaning of values depends on a specific area. Every area is to
167          * clean this before use. */
168         int custom_flags;
169
170         /* Methods. */
171         Node();
172         virtual ~Node();
173
174         virtual string identifier() const;
175
176         virtual void init(const ID * /*id*/, const char * /*subdata*/) {}
177
178         virtual void tag_update(Depsgraph * /*graph*/, eUpdateSource /*source*/) {}
179
180         virtual OperationNode *get_entry_operation() { return NULL; }
181         virtual OperationNode *get_exit_operation() { return NULL; }
182
183         virtual NodeClass get_class() const;
184 };
185
186 /* Macros for common static typeinfo. */
187 #define DEG_DEPSNODE_DECLARE \
188         static const Node::TypeInfo typeinfo
189 #define DEG_DEPSNODE_DEFINE(NodeType, type_, tname_) \
190         const Node::TypeInfo NodeType::typeinfo = Node::TypeInfo(type_, tname_)
191
192 void deg_register_base_depsnodes();
193
194 }  // namespace DEG