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