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