Depsgraph: Use operation code for geometry evaluation done
[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         /* Initialize evaluation of the geometry. Is an entry operation of geometry
88          * component. */
89         GEOMETRY_EVAL_INIT,
90         /* Evaluate the whole geometry, including modifiers. */
91         GEOMETRY_EVAL,
92         /* Evaluation of geometry is completely done.. */
93         GEOMETRY_EVAL_DONE,
94         /* Evaluation of a shape key.
95          * NOTE: Currently only for object data datablocks. */
96         GEOMETRY_SHAPEKEY,
97
98         /* Object data. --------------------------------------------------------- */
99         LIGHT_PROBE_EVAL,
100         SPEAKER_EVAL,
101
102         /* Pose. ---------------------------------------------------------------- */
103         /* Init pose, clear flags, etc. */
104         POSE_INIT,
105         /* Initialize IK solver related pose stuff. */
106         POSE_INIT_IK,
107         /* Pose is evaluated, and runtime data can be freed. */
108         POSE_CLEANUP,
109         /* Pose has been fully evaluated and ready to be used by others. */
110         POSE_DONE,
111         /* IK/Spline Solvers */
112         POSE_IK_SOLVER,
113         POSE_SPLINE_IK_SOLVER,
114
115         /* Bone. ---------------------------------------------------------------- */
116         /* Bone local transforms - entry point */
117         BONE_LOCAL,
118         /* Pose-space conversion (includes parent + restpose, */
119         BONE_POSE_PARENT,
120         /* Constraints */
121         BONE_CONSTRAINTS,
122         /* Bone transforms are ready
123          *
124          * - "READY"  This (internal, noop is used to signal that all pre-IK
125          *            operations are done. Its role is to help mediate situations
126          *            where cyclic relations may otherwise form (i.e. one bone in
127          *            chain targeting another in same chain,
128          *
129          * - "DONE"   This noop is used to signal that the bone's final pose
130          *            transform can be read by others. */
131         // TODO: deform mats could get calculated in the final_transform ops...
132         BONE_READY,
133         BONE_DONE,
134         /* B-Bone segment shape computation (after DONE) */
135         BONE_SEGMENTS,
136
137         /* Particle System. ----------------------------------------------------- */
138         PARTICLE_SYSTEM_INIT,
139         PARTICLE_SYSTEM_EVAL,
140         PARTICLE_SYSTEM_DONE,
141
142         /* Particle Settings. --------------------------------------------------- */
143         PARTICLE_SETTINGS_INIT,
144         PARTICLE_SETTINGS_EVAL,
145         PARTICLE_SETTINGS_RESET,
146
147         /* Point Cache. --------------------------------------------------------- */
148         POINT_CACHE_RESET,
149
150         /* Collections. --------------------------------------------------------- */
151         VIEW_LAYER_EVAL,
152
153         /* Copy on Write. ------------------------------------------------------- */
154         COPY_ON_WRITE,
155
156         /* Shading. ------------------------------------------------------------- */
157         SHADING,
158         MATERIAL_UPDATE,
159         WORLD_UPDATE,
160
161         /* Batch caches. -------------------------------------------------------- */
162         GEOMETRY_SELECT_UPDATE,
163
164         /* Masks. --------------------------------------------------------------- */
165         MASK_ANIMATION,
166         MASK_EVAL,
167
168         /* Movie clips. --------------------------------------------------------- */
169         MOVIECLIP_EVAL,
170         MOVIECLIP_SELECT_UPDATE,
171
172         /* Synchronization clips. ----------------------------------------------- */
173         SYNCHRONIZE_TO_ORIGINAL,
174
175         /* Generic datablock ---------------------------------------------------- */
176         GENERIC_DATABLOCK_UPDATE,
177 };
178 const char *operationCodeAsString(OperationCode opcode);
179
180 /* Flags for Depsgraph Nodes.
181  * NOTE: IS a bit shifts to allow usage as an accumulated. bitmask.
182  */
183 enum OperationFlag {
184         /* Node needs to be updated. */
185         DEPSOP_FLAG_NEEDS_UPDATE       = (1 << 0),
186         /* Node was directly modified, causing need for update. */
187         DEPSOP_FLAG_DIRECTLY_MODIFIED  = (1 << 1),
188         /* Node was updated due to user input. */
189         DEPSOP_FLAG_USER_MODIFIED      = (1 << 2),
190
191         /* Set of flags which gets flushed along the relations. */
192         DEPSOP_FLAG_FLUSH = (DEPSOP_FLAG_USER_MODIFIED),
193 };
194
195 /* Atomic Operation - Base type for all operations */
196 struct OperationNode : public Node {
197         OperationNode();
198         ~OperationNode();
199
200         virtual string identifier() const override;
201         string full_identifier() const;
202
203         virtual void tag_update(Depsgraph *graph, eUpdateSource source) override;
204
205         bool is_noop() const { return (bool)evaluate == false; }
206
207         virtual OperationNode *get_entry_operation() override {
208                 return this;
209         }
210         virtual OperationNode *get_exit_operation() override {
211                 return this;
212         }
213
214         /* Set this operation as component's entry/exit operation. */
215         void set_as_entry();
216         void set_as_exit();
217
218         /* Component that contains the operation. */
219         ComponentNode *owner;
220
221         /* Callback for operation. */
222         DepsEvalOperationCb evaluate;
223
224         /* How many inlinks are we still waiting on before we can be evaluated. */
225         uint32_t num_links_pending;
226         bool scheduled;
227
228         /* Identifier for the operation being performed. */
229         OperationCode opcode;
230         int name_tag;
231
232         /* (OperationFlag) extra settings affecting evaluation. */
233         int flag;
234
235         DEG_DEPSNODE_DECLARE;
236 };
237
238 void deg_register_operation_depsnodes();
239
240 }  // namespace DEG