Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / depsgraph / intern / node / deg_node_operation.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/node/deg_node.h"
26
27 #include "intern/depsgraph_type.h"
28
29 struct ID;
30 struct Depsgraph;
31
32 namespace DEG {
33
34 struct ComponentNode;
35
36 /* Evaluation Operation for atomic operation */
37 // XXX: move this to another header that can be exposed?
38 typedef function<void(struct ::Depsgraph *)> DepsEvalOperationCb;
39
40 /* Identifiers for common operations (as an enum). */
41 enum class OperationCode {
42         /* Generic Operations. -------------------------------------------------- */
43
44         /* Placeholder for operations which don't need special mention */
45         OPERATION = 0,
46
47         /* Generic parameters evaluation. */
48         ID_PROPERTY,
49         PARAMETERS_EVAL,
50
51         /* Animation, Drivers, etc. --------------------------------------------- */
52         /* NLA + Action */
53         ANIMATION,
54         /* Driver */
55         DRIVER,
56
57         /* Scene related. ------------------------------------------------------- */
58         SCENE_EVAL,
59
60         /* Object related. ------------------------------------------------------ */
61         OBJECT_BASE_FLAGS,
62
63         /* Transform. ----------------------------------------------------------- */
64         /* Transform entry point - local transforms only */
65         TRANSFORM_LOCAL,
66         /* Parenting */
67         TRANSFORM_PARENT,
68         /* Constraints */
69         TRANSFORM_CONSTRAINTS,
70         /* Transform exit point */
71         TRANSFORM_FINAL,
72         /* Handle object-level updates, mainly proxies hacks and recalc flags.  */
73         TRANSFORM_OBJECT_UBEREVAL,
74
75         /* Rigid body. ---------------------------------------------------------- */
76         /* Perform Simulation */
77         RIGIDBODY_REBUILD,
78         RIGIDBODY_SIM,
79         /* Copy results to object */
80         RIGIDBODY_TRANSFORM_COPY,
81
82         /* Geometry. ------------------------------------------------------------ */
83
84         /* Initialize evaluation of the geometry. Is an entry operation of geometry
85          * component. */
86         GEOMETRY_EVAL_INIT,
87         /* Evaluate the whole geometry, including modifiers. */
88         GEOMETRY_EVAL,
89         /* Evaluation of geometry is completely done.. */
90         GEOMETRY_EVAL_DONE,
91         /* Evaluation of a shape key.
92          * NOTE: Currently only for object data datablocks. */
93         GEOMETRY_SHAPEKEY,
94
95         /* Object data. --------------------------------------------------------- */
96         LIGHT_PROBE_EVAL,
97         SPEAKER_EVAL,
98         ARMATURE_EVAL,
99
100         /* Pose. ---------------------------------------------------------------- */
101         /* Init pose, clear flags, etc. */
102         POSE_INIT,
103         /* Initialize IK solver related pose stuff. */
104         POSE_INIT_IK,
105         /* Pose is evaluated, and runtime data can be freed. */
106         POSE_CLEANUP,
107         /* Pose has been fully evaluated and ready to be used by others. */
108         POSE_DONE,
109         /* IK/Spline Solvers */
110         POSE_IK_SOLVER,
111         POSE_SPLINE_IK_SOLVER,
112
113         /* Bone. ---------------------------------------------------------------- */
114         /* Bone local transforms - entry point */
115         BONE_LOCAL,
116         /* Pose-space conversion (includes parent + restpose, */
117         BONE_POSE_PARENT,
118         /* Constraints */
119         BONE_CONSTRAINTS,
120         /* Bone transforms are ready
121          *
122          * - "READY"  This (internal, noop is used to signal that all pre-IK
123          *            operations are done. Its role is to help mediate situations
124          *            where cyclic relations may otherwise form (i.e. one bone in
125          *            chain targeting another in same chain,
126          *
127          * - "DONE"   This noop is used to signal that the bone's final pose
128          *            transform can be read by others. */
129         // TODO: deform mats could get calculated in the final_transform ops...
130         BONE_READY,
131         BONE_DONE,
132         /* B-Bone segment shape computation (after DONE) */
133         BONE_SEGMENTS,
134
135         /* Particle System. ----------------------------------------------------- */
136         PARTICLE_SYSTEM_INIT,
137         PARTICLE_SYSTEM_EVAL,
138         PARTICLE_SYSTEM_DONE,
139
140         /* Particle Settings. --------------------------------------------------- */
141         PARTICLE_SETTINGS_INIT,
142         PARTICLE_SETTINGS_EVAL,
143         PARTICLE_SETTINGS_RESET,
144
145         /* Point Cache. --------------------------------------------------------- */
146         POINT_CACHE_RESET,
147
148         /* File cache. ---------------------------------------------------------- */
149         FILE_CACHE_UPDATE,
150
151         /* Collections. --------------------------------------------------------- */
152         VIEW_LAYER_EVAL,
153
154         /* Copy on Write. ------------------------------------------------------- */
155         COPY_ON_WRITE,
156
157         /* Shading. ------------------------------------------------------------- */
158         SHADING,
159         MATERIAL_UPDATE,
160         WORLD_UPDATE,
161
162         /* Batch caches. -------------------------------------------------------- */
163         GEOMETRY_SELECT_UPDATE,
164
165         /* Masks. --------------------------------------------------------------- */
166         MASK_ANIMATION,
167         MASK_EVAL,
168
169         /* Movie clips. --------------------------------------------------------- */
170         MOVIECLIP_EVAL,
171         MOVIECLIP_SELECT_UPDATE,
172
173         /* Synchronization clips. ----------------------------------------------- */
174         SYNCHRONIZE_TO_ORIGINAL,
175
176         /* Generic datablock ---------------------------------------------------- */
177         GENERIC_DATABLOCK_UPDATE,
178
179         /* Duplication/instancing system. --------------------------------------- */
180         DUPLI,
181 };
182 const char *operationCodeAsString(OperationCode opcode);
183
184 /* Flags for Depsgraph Nodes.
185  * NOTE: IS a bit shifts to allow usage as an accumulated. bitmask.
186  */
187 enum OperationFlag {
188         /* Node needs to be updated. */
189         DEPSOP_FLAG_NEEDS_UPDATE       = (1 << 0),
190         /* Node was directly modified, causing need for update. */
191         DEPSOP_FLAG_DIRECTLY_MODIFIED  = (1 << 1),
192         /* Node was updated due to user input. */
193         DEPSOP_FLAG_USER_MODIFIED      = (1 << 2),
194
195         /* Set of flags which gets flushed along the relations. */
196         DEPSOP_FLAG_FLUSH = (DEPSOP_FLAG_USER_MODIFIED),
197 };
198
199 /* Atomic Operation - Base type for all operations */
200 struct OperationNode : public Node {
201         OperationNode();
202         ~OperationNode();
203
204         virtual string identifier() const override;
205         string full_identifier() const;
206
207         virtual void tag_update(Depsgraph *graph, eUpdateSource source) override;
208
209         bool is_noop() const { return (bool)evaluate == false; }
210
211         virtual OperationNode *get_entry_operation() override {
212                 return this;
213         }
214         virtual OperationNode *get_exit_operation() override {
215                 return this;
216         }
217
218         /* Set this operation as component's entry/exit operation. */
219         void set_as_entry();
220         void set_as_exit();
221
222         /* Component that contains the operation. */
223         ComponentNode *owner;
224
225         /* Callback for operation. */
226         DepsEvalOperationCb evaluate;
227
228         /* How many inlinks are we still waiting on before we can be evaluated. */
229         uint32_t num_links_pending;
230         bool scheduled;
231
232         /* Identifier for the operation being performed. */
233         OperationCode opcode;
234         int name_tag;
235
236         /* (OperationFlag) extra settings affecting evaluation. */
237         int flag;
238
239         DEG_DEPSNODE_DECLARE;
240 };
241
242 void deg_register_operation_depsnodes();
243
244 }  // namespace DEG