Blender V5.0
deg_builder_nodes.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2013 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BKE_lib_query.hh" /* For LibraryForeachIDCallbackFlag enum. */
12
13#include "DNA_armature_types.h"
20
21#include "DEG_depsgraph.hh"
22
23struct BoneCollection;
24struct CacheFile;
25struct Camera;
26struct Collection;
27struct FCurve;
28struct FreestyleLineSet;
30struct ID;
31struct IDProperty;
32struct Image;
33struct Key;
34struct LayerCollection;
35struct Light;
36struct LightProbe;
37struct ListBase;
38struct Main;
39struct Mask;
40struct Material;
41struct MovieClip;
42struct Object;
43struct ParticleSettings;
44struct Scene;
45struct Speaker;
46struct Tex;
47struct VFont;
48struct World;
49struct bAction;
50struct bArmature;
51struct bConstraint;
52struct bNodeSocket;
53struct bNodeTree;
54struct bPoseChannel;
55struct bSound;
56struct PointerRNA;
57
58namespace blender::deg {
59
60struct ComponentNode;
61struct Depsgraph;
63struct IDNode;
64struct OperationKey;
65struct OperationNode;
66struct TimeSourceNode;
67
69 public:
72
73 /* For given original ID get ID which is created by copy-on-evaluation system. */
74 ID *get_cow_id(const ID *id_orig) const;
75 /* Similar to above, but for the cases when there is no ID node we create
76 * one. */
77 ID *ensure_cow_id(ID *id_orig);
78
79 /* Helper wrapper function which wraps get_cow_id with a needed type cast. */
80 template<typename T> T *get_cow_datablock(const T *orig) const
81 {
82 return (T *)get_cow_id(&orig->id);
83 }
84
85 /* For a given evaluated datablock get corresponding original one. */
86 template<typename T> T *get_orig_datablock(const T *cow) const
87 {
88 return (T *)cow->id.orig_id;
89 }
90
91 virtual void begin_build();
92 virtual void end_build();
93
98 int foreach_id_cow_detect_need_for_update_callback(ID *id_cow_self, ID *id_pointer);
99
100 IDNode *add_id_node(ID *id);
101 IDNode *find_id_node(const ID *id);
103
104 ComponentNode *add_component_node(ID *id, NodeType comp_type, const char *comp_name = "");
105 ComponentNode *find_component_node(const ID *id, NodeType comp_type, const char *comp_name = "");
106
108 OperationCode opcode,
109 const DepsEvalOperationCb &op = nullptr,
110 const char *name = "",
111 int name_tag = -1);
113 NodeType comp_type,
114 const char *comp_name,
115 OperationCode opcode,
116 const DepsEvalOperationCb &op = nullptr,
117 const char *name = "",
118 int name_tag = -1);
120 NodeType comp_type,
121 OperationCode opcode,
122 const DepsEvalOperationCb &op = nullptr,
123 const char *name = "",
124 int name_tag = -1);
125
127 NodeType comp_type,
128 const char *comp_name,
129 OperationCode opcode,
130 const DepsEvalOperationCb &op = nullptr,
131 const char *name = "",
132 int name_tag = -1);
134 NodeType comp_type,
135 OperationCode opcode,
136 const DepsEvalOperationCb &op = nullptr,
137 const char *name = "",
138 int name_tag = -1);
139
140 bool has_operation_node(ID *id,
141 NodeType comp_type,
142 const char *comp_name,
143 OperationCode opcode,
144 const char *name = "",
145 int name_tag = -1);
146 bool has_operation_node(ID *id, NodeType comp_type, OperationCode opcode);
147
149 NodeType comp_type,
150 const char *comp_name,
151 OperationCode opcode,
152 const char *name = "",
153 int name_tag = -1);
154
156 NodeType comp_type,
157 OperationCode opcode,
158 const char *name = "",
159 int name_tag = -1);
160
162
163 virtual void build_id(ID *id, bool force_be_visible = false);
164
165 /* Build function for ID types that do not need their own build_xxx() function. */
166 virtual void build_generic_id(ID *id);
167
168 virtual void build_idproperties(IDProperty *id_property);
169
170 virtual void build_scene_render(Scene *scene, ViewLayer *view_layer);
171 virtual void build_scene_camera(Scene *scene);
172 virtual void build_scene_parameters(Scene *scene);
173 virtual void build_scene_compositor(Scene *scene);
174
175 virtual void build_layer_collections(ListBase *lb);
176 virtual void build_view_layer(Scene *scene,
177 ViewLayer *view_layer,
178 eDepsNode_LinkedState_Type linked_state);
179 virtual void build_collection(LayerCollection *from_layer_collection, Collection *collection);
180 virtual void build_object(int base_index,
181 Object *object,
182 eDepsNode_LinkedState_Type linked_state,
183 bool is_visible);
184 virtual void build_object_instance_collection(Object *object, bool is_object_visible);
185 virtual void build_object_from_layer(int base_index,
186 Object *object,
187 eDepsNode_LinkedState_Type linked_state);
188 virtual void build_object_flags(int base_index,
189 Object *object,
190 eDepsNode_LinkedState_Type linked_state);
191 virtual void build_object_modifiers(Object *object);
192 virtual void build_object_data(Object *object);
193 virtual void build_object_data_camera(Object *object);
194 virtual void build_object_data_geometry(Object *object);
195 virtual void build_object_data_geometry_datablock(ID *obdata);
196 virtual void build_object_data_light(Object *object);
197 virtual void build_object_data_lightprobe(Object *object);
198 virtual void build_object_data_speaker(Object *object);
199 virtual void build_object_data_grease_pencil(Object *object);
200 virtual void build_object_transform(Object *object);
201 virtual void build_object_constraints(Object *object);
202 virtual void build_object_pointcache(Object *object);
203 virtual void build_object_shading(Object *object);
204
205 virtual void build_object_light_linking(Object *object);
206 virtual void build_light_linking_collection(Collection *collection);
207
208 virtual void build_pose_constraints(Object *object, bPoseChannel *pchan, int pchan_index);
209 virtual void build_rigidbody(Scene *scene);
210 virtual void build_particle_systems(Object *object, bool is_object_visible);
211 virtual void build_particle_settings(ParticleSettings *part);
216 virtual void build_animdata(ID *id);
217 virtual void build_animdata_nlastrip_targets(ListBase *strips);
221 virtual void build_animation_images(ID *id);
222 virtual void build_action(bAction *action);
223
224 virtual void build_animdata_drivers(ID *id, AnimData *adt);
231 virtual void build_driver(ID *id, FCurve *fcurve, int driver_index);
232
233 virtual void build_driver_variables(ID *id, FCurve *fcurve);
234 virtual void build_driver_scene_camera_variable(Scene *scene, const char *camera_path);
235
236 /* Build operations of a property value from which is read by a driver target.
237 *
238 * The driver target points to a data-block (or a sub-data-block like View Layer).
239 * This data-block is presented in the interface as a "Prop" and its resolved RNA pointer is
240 * passed here as `target_prop`.
241 *
242 * The tricky part (and a bit confusing naming) is that the driver target accesses a property of
243 * the `target_prop` to get its value. The property which is read to give an actual target value
244 * is denoted by its RNA path relative to the `target_prop`. In the interface it is called "Path"
245 * and here it is called `rna_path_from_target_prop`. */
246 virtual void build_driver_id_property(const PointerRNA &target_prop,
247 const char *rna_path_from_target_prop);
248
249 virtual void build_parameters(ID *id);
250 virtual void build_dimensions(Object *object);
252 virtual void build_ik_pose(Object *object, bPoseChannel *pchan, bConstraint *con);
254 virtual void build_splineik_pose(Object *object, bPoseChannel *pchan, bConstraint *con);
256 virtual void build_rig(Object *object);
257 virtual void build_armature(bArmature *armature);
258 virtual void build_armature_bones(ListBase *bones);
261 virtual void build_shapekeys(Key *key);
262 virtual void build_camera(Camera *camera);
263 virtual void build_light(Light *lamp);
264 virtual void build_nodetree(bNodeTree *ntree);
265 virtual void build_nodetree_socket(bNodeSocket *socket);
267 virtual void build_material(Material *ma);
268 virtual void build_materials(Material **materials, int num_materials);
269 virtual void build_freestyle_lineset(FreestyleLineSet *fls);
270 virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle);
272 virtual void build_texture(Tex *tex);
273 virtual void build_image(Image *image);
275 virtual void build_world(World *world);
276 virtual void build_cachefile(CacheFile *cache_file);
277 virtual void build_mask(Mask *mask);
278 virtual void build_movieclip(MovieClip *clip);
279 virtual void build_lightprobe(LightProbe *probe);
280 virtual void build_speaker(Speaker *speaker);
281 virtual void build_sound(bSound *sound);
282 virtual void build_scene_sequencer(Scene *scene);
283 virtual void build_scene_audio(Scene *scene);
284 virtual void build_scene_speakers(Scene *scene, ViewLayer *view_layer);
285 virtual void build_vfont(VFont *vfont);
286
287 /* Per-ID information about what was already in the dependency graph.
288 * Allows to re-use certain values, to speed up following evaluation. */
289 struct IDInfo {
290 /* Copy-on-written pointer of the corresponding ID. */
291 ID *id_cow = nullptr;
292 /* Mask of visible components from previous state of the
293 * dependency graph. */
295 /* Special evaluation flag mask from the previous depsgraph. */
297 /* Mesh CustomData mask from the previous depsgraph. */
299 };
300
301 protected:
302 /* Entry tags and non-updated operations from the previous state of the dependency graph.
303 * The entry tags are operations which were directly tagged, the matching operations from the
304 * new dependency graph will be tagged. The needs-update operations are possibly indirectly
305 * modified operations, whose complementary part from the new dependency graph will only be
306 * marked as needs-update.
307 * Stored before the graph is re-created so that they can be transferred over. */
310
314 static void modifier_walk(void *user_data,
315 struct Object *object,
316 struct ID **idpoin,
318 static void constraint_walk(bConstraint *constraint,
319 ID **idpoin,
320 bool is_reference,
321 void *user_data);
322
329
330 /* State which demotes currently built entities. */
334 /* NOTE: Collection are possibly built recursively, so be careful when
335 * setting the current state. */
336 /* Accumulated flag over the hierarchy of currently building collections.
337 * Denotes whether all the hierarchy from parent of `collection_` to the
338 * very root is visible (aka not restricted.). */
340
341 /* Indexed by original ID.session_uid, values are IDInfo. */
343
344 /* Set of IDs which were already build. Makes it easier to keep track of
345 * what was already built and what was not. */
347};
348
349} // namespace blender::deg
LibraryForeachIDCallbackFlag
DepsgraphBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache)
ComponentNode * find_component_node(const ID *id, NodeType comp_type, const char *comp_name="")
virtual void build_scene_parameters(Scene *scene)
virtual void build_scene_sequencer(Scene *scene)
virtual void build_object_data_camera(Object *object)
virtual void build_object_data_geometry(Object *object)
virtual void build_pose_constraints(Object *object, bPoseChannel *pchan, int pchan_index)
virtual void build_object_pointcache(Object *object)
virtual void build_world(World *world)
virtual void build_object(int base_index, Object *object, eDepsNode_LinkedState_Type linked_state, bool is_visible)
OperationNode * ensure_operation_node(ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const DepsEvalOperationCb &op=nullptr, const char *name="", int name_tag=-1)
virtual void build_id(ID *id, bool force_be_visible=false)
virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle)
virtual void build_scene_speakers(Scene *scene, ViewLayer *view_layer)
virtual void build_cachefile(CacheFile *cache_file)
virtual void build_object_instance_collection(Object *object, bool is_object_visible)
virtual void build_object_data_speaker(Object *object)
OperationNode * add_operation_node(ComponentNode *comp_node, OperationCode opcode, const DepsEvalOperationCb &op=nullptr, const char *name="", int name_tag=-1)
virtual void build_vfont(VFont *vfont)
OperationNode * find_operation_node(const ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const char *name="", int name_tag=-1)
virtual void build_object_data(Object *object)
virtual void build_particle_settings(ParticleSettings *part)
static void constraint_walk(bConstraint *constraint, ID **idpoin, bool is_reference, void *user_data)
virtual void build_scene_camera(Scene *scene)
virtual void build_driver_id_property(const PointerRNA &target_prop, const char *rna_path_from_target_prop)
virtual void build_particle_systems(Object *object, bool is_object_visible)
virtual void build_dimensions(Object *object)
virtual void build_armature(bArmature *armature)
virtual void build_scene_audio(Scene *scene)
ComponentNode * add_component_node(ID *id, NodeType comp_type, const char *comp_name="")
virtual void build_driver_variables(ID *id, FCurve *fcurve)
T * get_orig_datablock(const T *cow) const
virtual void build_action(bAction *action)
virtual void build_driver_scene_camera_variable(Scene *scene, const char *camera_path)
virtual void build_animdata_nlastrip_targets(ListBase *strips)
virtual void build_material(Material *ma)
virtual void build_materials(Material **materials, int num_materials)
virtual void build_collection(LayerCollection *from_layer_collection, Collection *collection)
virtual void build_rigidbody(Scene *scene)
virtual void build_object_transform(Object *object)
virtual void build_light_linking_collection(Collection *collection)
static void modifier_walk(void *user_data, struct Object *object, struct ID **idpoin, LibraryForeachIDCallbackFlag cb_flag)
virtual void build_freestyle_lineset(FreestyleLineSet *fls)
virtual void build_movieclip(MovieClip *clip)
T * get_cow_datablock(const T *orig) const
virtual void build_object_data_light(Object *object)
virtual void build_ik_pose(Object *object, bPoseChannel *pchan, bConstraint *con)
virtual void build_scene_render(Scene *scene, ViewLayer *view_layer)
virtual void build_image(Image *image)
virtual void build_speaker(Speaker *speaker)
virtual void build_sound(bSound *sound)
Vector< PersistentOperationKey > needs_update_operations_
virtual void build_object_data_geometry_datablock(ID *obdata)
DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache)
Vector< PersistentOperationKey > saved_entry_tags_
virtual void build_object_flags(int base_index, Object *object, eDepsNode_LinkedState_Type linked_state)
ID * get_cow_id(const ID *id_orig) const
virtual void build_rig(Object *object)
virtual void build_lightprobe(LightProbe *probe)
int foreach_id_cow_detect_need_for_update_callback(ID *id_cow_self, ID *id_pointer)
virtual void build_nodetree(bNodeTree *ntree)
virtual void build_splineik_pose(Object *object, bPoseChannel *pchan, bConstraint *con)
virtual void build_idproperties(IDProperty *id_property)
virtual void build_camera(Camera *camera)
virtual void build_light(Light *lamp)
virtual void build_armature_bones(ListBase *bones)
virtual void build_driver(ID *id, FCurve *fcurve, int driver_index)
virtual void build_object_light_linking(Object *object)
bool has_operation_node(ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const char *name="", int name_tag=-1)
virtual void build_view_layer(Scene *scene, ViewLayer *view_layer, eDepsNode_LinkedState_Type linked_state)
virtual void build_nodetree_socket(bNodeSocket *socket)
virtual void build_armature_bone_collections(blender::Span< BoneCollection * > collections)
virtual void build_scene_compositor(Scene *scene)
virtual void build_object_data_lightprobe(Object *object)
virtual void build_animdata_drivers(ID *id, AnimData *adt)
virtual void build_object_data_grease_pencil(Object *object)
virtual void build_object_constraints(Object *object)
virtual void build_object_shading(Object *object)
virtual void build_object_modifiers(Object *object)
virtual void build_object_from_layer(int base_index, Object *object, eDepsNode_LinkedState_Type linked_state)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
#define T
uint64_t IDComponentsMask
std::function< void(::Depsgraph *)> DepsEvalOperationCb
const char * name
Definition DNA_ID.h:414