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