Blender V5.0
deg_builder_relations.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 <cstring>
12
14
15#include "DNA_ID.h"
16
17#include "BLI_span.hh"
18
19#include "BKE_lib_query.hh" /* For LibraryForeachIDCallbackFlag enum. */
20
26#include "intern/depsgraph.hh"
31
32struct CacheFile;
33struct Camera;
34struct Collection;
35struct EffectorWeights;
36struct FCurve;
37struct FreestyleLineSet;
39struct ID;
40struct IDProperty;
41struct Image;
42struct Key;
43struct LayerCollection;
44struct Light;
45struct LightProbe;
46struct ListBase;
47struct Main;
48struct Mask;
49struct Material;
50struct MovieClip;
51struct Object;
52struct ParticleSettings;
53struct ParticleSystem;
54struct Scene;
55struct Speaker;
56struct Tex;
57struct VFont;
58struct ViewLayer;
59struct World;
60struct bAction;
61struct bArmature;
62struct bConstraint;
63struct bNodeSocket;
64struct bNodeTree;
65struct bPoseChannel;
66struct bSound;
67
68namespace blender::deg {
69
70struct ComponentNode;
71struct DepsNodeHandle;
72struct Depsgraph;
74struct IDNode;
75struct Node;
76struct OperationNode;
77struct Relation;
78struct RootPChanMap;
79struct TimeSourceNode;
80
82 public:
84
85 void begin_build();
86
87 template<typename KeyFrom, typename KeyTo>
88 Relation *add_relation(const KeyFrom &key_from,
89 const KeyTo &key_to,
90 const char *description,
91 int flags = 0);
92
93 template<typename KeyTo>
94 Relation *add_relation(const TimeSourceKey &key_from,
95 const KeyTo &key_to,
96 const char *description,
97 int flags = 0);
98
99 template<typename KeyType>
100 Relation *add_node_handle_relation(const KeyType &key_from,
101 const DepsNodeHandle *handle,
102 const char *description,
103 int flags = 0);
104
105 template<typename KeyTo>
107 const KeyTo &key_to,
108 const char *description,
109 int flags = 0);
110
111 /* Adds relation from proper transformation operation to the modifier.
112 * Takes care of checking for possible physics solvers modifying position
113 * of this object. */
114 void add_depends_on_transform_relation(const DepsNodeHandle *handle, const char *description);
115
116 void add_customdata_mask(Object *object, const DEGCustomDataMeshMasks &customdata_masks);
117 void add_special_eval_flag(ID *id, uint32_t flag);
118
119 virtual void build_id(ID *id);
120
121 /* Build function for ID types that do not need their own build_xxx() function. */
122 virtual void build_generic_id(ID *id);
123
124 virtual void build_idproperties(IDProperty *id_property);
125
126 virtual void build_scene_camera(Scene *scene);
127 virtual void build_scene_render(Scene *scene, ViewLayer *view_layer);
128 virtual void build_scene_parameters(Scene *scene);
129 virtual void build_scene_compositor(Scene *scene);
130
131 virtual bool build_layer_collection(LayerCollection *layer_collection);
132 virtual void build_view_layer_collections(ViewLayer *view_layer);
133
134 virtual void build_view_layer(Scene *scene,
135 ViewLayer *view_layer,
136 eDepsNode_LinkedState_Type linked_state);
137 virtual void build_collection(LayerCollection *from_layer_collection, Collection *collection);
138 virtual void build_object(Object *object);
139 virtual void build_object_from_view_layer_base(Object *object);
141 virtual void build_object_modifiers(Object *object);
142 virtual void build_object_data(Object *object);
143 virtual void build_object_data_camera(Object *object);
144 virtual void build_object_data_geometry(Object *object);
145 virtual void build_object_data_geometry_datablock(ID *obdata);
146 virtual void build_object_data_light(Object *object);
147 virtual void build_object_data_lightprobe(Object *object);
148 virtual void build_object_data_speaker(Object *object);
149 virtual void build_object_parent(Object *object);
150 virtual void build_object_pointcache(Object *object);
151 virtual void build_object_instance_collection(Object *object);
152
153 virtual void build_object_shading(Object *object);
154
155 virtual void build_object_light_linking(Object *emitter);
156 virtual void build_light_linking_collection(Object *emitter, Collection *collection);
157
158 virtual void build_constraints(ID *id,
159 NodeType component_type,
160 const char *component_subdata,
162 RootPChanMap *root_map);
163 virtual void build_animdata(ID *id);
164 virtual void build_animdata_curves(ID *id);
165 virtual void build_animdata_fcurve_target(ID *id,
166 PointerRNA id_ptr,
167 ComponentKey &adt_key,
168 OperationNode *operation_from,
169 FCurve *fcu);
170 virtual void build_animdata_curves_targets(ID *id,
171 ComponentKey &adt_key,
172 OperationNode *operation_from,
173 ListBase *curves);
174 virtual void build_animdata_action_targets(ID *id,
175 int32_t slot_handle,
176 ComponentKey &adt_key,
177 OperationNode *operation_from,
178 bAction *action);
179 virtual void build_animdata_nlastrip_targets(ID *id,
180 ComponentKey &adt_key,
181 OperationNode *operation_from,
182 ListBase *strips);
183 virtual void build_animdata_drivers(ID *id);
184 virtual void build_animdata_force(ID *id);
185 virtual void build_animation_images(ID *id);
186 virtual void build_action(bAction *action);
187 virtual void build_driver(ID *id, FCurve *fcurve);
188 virtual void build_driver_data(ID *id, FCurve *fcurve);
189 virtual void build_driver_variables(ID *id, FCurve *fcurve);
190
191 virtual void build_driver_scene_camera_variable(const OperationKey &driver_key,
192 const RNAPathKey &self_key,
193 Scene *scene,
194 const char *rna_path);
195 virtual void build_driver_rna_path_variable(const OperationKey &driver_key,
196 const RNAPathKey &self_key,
197 ID *target_id,
198 const PointerRNA &target_prop,
199 const char *rna_path);
200
201 /* Build operations of a property value from which is read by a driver target.
202 *
203 * The driver target points to a data-block (or a sub-data-block like View Layer).
204 * This data-block is presented in the interface as a "Prop" and its resolved RNA pointer is
205 * passed here as `target_prop`.
206 *
207 * The tricky part (and a bit confusing naming) is that the driver target accesses a property of
208 * the `target_prop` to get its value. The property which is read to give an actual target value
209 * is denoted by its RNA path relative to the `target_prop`. In the interface it is called "Path"
210 * and here it is called `rna_path_from_target_prop`. */
211 virtual void build_driver_id_property(const PointerRNA &target_prop,
212 const char *rna_path_from_target_prop);
213
214 virtual void build_parameters(ID *id);
215 virtual void build_dimensions(Object *object);
216 virtual void build_world(World *world);
217 virtual void build_rigidbody(Scene *scene);
218 virtual void build_particle_systems(Object *object);
219 virtual void build_particle_settings(ParticleSettings *part);
221 ParticleSystem *psys,
222 Object *draw_object);
223 virtual void build_ik_pose(Object *object,
224 bPoseChannel *pchan,
225 bConstraint *con,
226 RootPChanMap *root_map);
227 virtual void build_splineik_pose(Object *object,
228 bPoseChannel *pchan,
229 bConstraint *con,
230 RootPChanMap *root_map);
231 virtual void build_inter_ik_chains(Object *object,
232 const OperationKey &solver_key,
233 const bPoseChannel *rootchan,
234 const RootPChanMap *root_map);
235 virtual void build_rig(Object *object);
236 virtual void build_shapekeys(Key *key);
237 virtual void build_armature(bArmature *armature);
238 virtual void build_armature_bones(ListBase *bones);
240 virtual void build_camera(Camera *camera);
241 virtual void build_light(Light *lamp);
242 virtual void build_nodetree(bNodeTree *ntree);
243 virtual void build_nodetree_socket(bNodeSocket *socket);
244 virtual void build_material(Material *ma, ID *owner = nullptr);
245 virtual void build_materials(ID *owner, Material **materials, int num_materials);
246 virtual void build_freestyle_lineset(FreestyleLineSet *fls);
247 virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle);
248 virtual void build_texture(Tex *tex);
249 virtual void build_image(Image *image);
250 virtual void build_cachefile(CacheFile *cache_file);
251 virtual void build_mask(Mask *mask);
252 virtual void build_movieclip(MovieClip *clip);
253 virtual void build_lightprobe(LightProbe *probe);
254 virtual void build_speaker(Speaker *speaker);
255 virtual void build_sound(bSound *sound);
256 virtual void build_scene_sequencer(Scene *scene);
257 virtual void build_scene_audio(Scene *scene);
258 virtual void build_scene_speakers(Scene *scene, ViewLayer *view_layer);
259 virtual void build_vfont(VFont *vfont);
260
261 virtual void build_nested_datablock(ID *owner, ID *id, bool flush_cow_changes);
262 virtual void build_nested_nodetree(ID *owner, bNodeTree *ntree);
263 virtual void build_nested_shapekey(ID *owner, Key *key);
264
266 Object *object,
267 Collection *collection,
268 const char *name);
270 Object *object,
271 ParticleSystem *psys,
272 EffectorWeights *eff,
273 bool add_absorption,
274 const char *name);
275
276 virtual void build_copy_on_write_relations();
277 virtual void build_copy_on_write_relations(IDNode *id_node);
278 virtual void build_driver_relations();
279 virtual void build_driver_relations(IDNode *id_node);
280
281 template<typename KeyType> OperationNode *find_operation_node(const KeyType &key);
282
284
285 protected:
286 TimeSourceNode *get_node(const TimeSourceKey &key) const;
287 ComponentNode *get_node(const ComponentKey &key) const;
288 OperationNode *get_node(const OperationKey &key) const;
289 Node *get_node(const RNAPathKey &key);
290
291 OperationNode *find_node(const OperationKey &key) const;
292 ComponentNode *find_node(const ComponentKey &key) const;
293 bool has_node(const ComponentKey &key) const;
294 bool has_node(const OperationKey &key) const;
295
297 Node *node_to,
298 const char *description,
299 int flags = 0);
300
301 /* Add relation which ensures visibility of `id_from` when `id_to` is visible.
302 * For the more detailed explanation see comment for `NodeType::VISIBILITY`. */
303 void add_visibility_relation(ID *id_from, ID *id_to);
304
306 OperationNode *node_to,
307 const char *description,
308 int flags = 0);
309
310 template<typename KeyType>
311 DepsNodeHandle create_node_handle(const KeyType &key, const char *default_name = "");
312
313 /* TODO(sergey): All those is_same* functions are to be generalized. */
314
315 /* Check whether two keys corresponds to the same bone from same armature.
316 *
317 * This is used by drivers relations builder to avoid possible fake
318 * dependency cycle when one bone property drives another property of the
319 * same bone. */
320 template<typename KeyFrom, typename KeyTo>
321 bool is_same_bone_dependency(const KeyFrom &key_from, const KeyTo &key_to);
322
323 /* Similar to above, but used to check whether driver is using node from
324 * the same node tree as a driver variable. */
325 template<typename KeyFrom, typename KeyTo>
326 bool is_same_nodetree_node_dependency(const KeyFrom &key_from, const KeyTo &key_to);
327
328 private:
329 struct BuilderWalkUserData {
331 };
332
333 static void modifier_walk(void *user_data,
334 struct Object *object,
335 struct ID **idpoin,
337
338 static void constraint_walk(bConstraint *con, ID **idpoin, bool is_reference, void *user_data);
339
340 /* State which demotes currently built entities. */
341 Scene *scene_;
342
343 BuilderMap built_map_;
344 RNANodeQuery rna_node_query_;
345 BuilderStack stack_;
346};
347
361
362} // namespace blender::deg
363
364#include "intern/builder/deg_builder_relations_impl.h" // IWYU pragma: export
LibraryForeachIDCallbackFlag
#define BLI_assert(a)
Definition BLI_assert.h:46
ID and Library types, which are fundamental for SDNA.
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint ** constraints
DepsgraphBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache)
virtual void build_driver_rna_path_variable(const OperationKey &driver_key, const RNAPathKey &self_key, ID *target_id, const PointerRNA &target_prop, const char *rna_path)
void add_particle_collision_relations(const OperationKey &key, Object *object, Collection *collection, const char *name)
virtual void build_animdata_action_targets(ID *id, int32_t slot_handle, ComponentKey &adt_key, OperationNode *operation_from, bAction *action)
Relation * add_depends_on_transform_relation(ID *id, const KeyTo &key_to, const char *description, int flags=0)
virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle)
virtual void build_ik_pose(Object *object, bPoseChannel *pchan, bConstraint *con, RootPChanMap *root_map)
virtual void build_collection(LayerCollection *from_layer_collection, Collection *collection)
virtual void build_driver_id_property(const PointerRNA &target_prop, const char *rna_path_from_target_prop)
virtual void build_object_layer_component_relations(Object *object)
virtual void build_object_from_view_layer_base(Object *object)
virtual void build_driver(ID *id, FCurve *fcurve)
virtual void build_driver_data(ID *id, FCurve *fcurve)
virtual void build_nested_nodetree(ID *owner, bNodeTree *ntree)
virtual void build_nodetree_socket(bNodeSocket *socket)
virtual void build_material(Material *ma, ID *owner=nullptr)
virtual void build_speaker(Speaker *speaker)
TimeSourceNode * get_node(const TimeSourceKey &key) const
bool is_same_nodetree_node_dependency(const KeyFrom &key_from, const KeyTo &key_to)
virtual void build_scene_speakers(Scene *scene, ViewLayer *view_layer)
OperationNode * find_node(const OperationKey &key) const
virtual void build_armature(bArmature *armature)
virtual void build_armature_bone_collections(blender::Span< BoneCollection * > collections)
virtual void build_view_layer(Scene *scene, ViewLayer *view_layer, eDepsNode_LinkedState_Type linked_state)
virtual void build_armature_bones(ListBase *bones)
virtual void build_object_pointcache(Object *object)
virtual void build_constraints(ID *id, NodeType component_type, const char *component_subdata, ListBase *constraints, RootPChanMap *root_map)
virtual void build_object_modifiers(Object *object)
virtual void build_animdata_curves_targets(ID *id, ComponentKey &adt_key, OperationNode *operation_from, ListBase *curves)
virtual void build_view_layer_collections(ViewLayer *view_layer)
virtual void build_object_data_light(Object *object)
void add_customdata_mask(Object *object, const DEGCustomDataMeshMasks &customdata_masks)
bool is_same_bone_dependency(const KeyFrom &key_from, const KeyTo &key_to)
Relation * add_node_handle_relation(const KeyType &key_from, const DepsNodeHandle *handle, const char *description, int flags=0)
virtual void build_object_data_camera(Object *object)
virtual void build_scene_render(Scene *scene, ViewLayer *view_layer)
virtual void build_object_data_geometry(Object *object)
DepsgraphRelationBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache)
virtual void build_object_data_lightprobe(Object *object)
virtual void build_particle_settings(ParticleSettings *part)
virtual void build_object_light_linking(Object *emitter)
void add_special_eval_flag(ID *id, uint32_t flag)
virtual void build_driver_scene_camera_variable(const OperationKey &driver_key, const RNAPathKey &self_key, Scene *scene, const char *rna_path)
virtual void build_movieclip(MovieClip *clip)
virtual void build_nodetree(bNodeTree *ntree)
Relation * add_relation(const KeyFrom &key_from, const KeyTo &key_to, const char *description, int flags=0)
virtual void build_object_data_geometry_datablock(ID *obdata)
virtual void build_animdata_fcurve_target(ID *id, PointerRNA id_ptr, ComponentKey &adt_key, OperationNode *operation_from, FCurve *fcu)
void add_particle_forcefield_relations(const OperationKey &key, Object *object, ParticleSystem *psys, EffectorWeights *eff, bool add_absorption, const char *name)
virtual void build_nested_datablock(ID *owner, ID *id, bool flush_cow_changes)
virtual void build_particle_system_visualization_object(Object *object, ParticleSystem *psys, Object *draw_object)
virtual void build_lightprobe(LightProbe *probe)
void add_visibility_relation(ID *id_from, ID *id_to)
virtual void build_splineik_pose(Object *object, bPoseChannel *pchan, bConstraint *con, RootPChanMap *root_map)
virtual void build_driver_variables(ID *id, FCurve *fcurve)
virtual bool build_layer_collection(LayerCollection *layer_collection)
virtual void build_object_instance_collection(Object *object)
virtual void build_nested_shapekey(ID *owner, Key *key)
virtual void build_object_parent(Object *object)
bool has_node(const ComponentKey &key) const
virtual void build_inter_ik_chains(Object *object, const OperationKey &solver_key, const bPoseChannel *rootchan, const RootPChanMap *root_map)
virtual void build_object_data_speaker(Object *object)
virtual void build_freestyle_lineset(FreestyleLineSet *fls)
virtual void build_light_linking_collection(Object *emitter, Collection *collection)
Relation * add_operation_relation(OperationNode *node_from, OperationNode *node_to, const char *description, int flags=0)
OperationNode * find_operation_node(const KeyType &key)
virtual void build_object_data(Object *object)
virtual void build_idproperties(IDProperty *id_property)
virtual void build_materials(ID *owner, Material **materials, int num_materials)
virtual void build_cachefile(CacheFile *cache_file)
virtual void build_object_shading(Object *object)
DepsNodeHandle create_node_handle(const KeyType &key, const char *default_name="")
virtual void build_animdata_nlastrip_targets(ID *id, ComponentKey &adt_key, OperationNode *operation_from, ListBase *strips)
Relation * add_time_relation(TimeSourceNode *timesrc, Node *node_to, const char *description, int flags=0)
virtual void build_particle_systems(Object *object)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
const char * name
Definition DNA_ID.h:414
DepsgraphRelationBuilder * builder
DepsNodeHandle(DepsgraphRelationBuilder *builder, OperationNode *node, const char *default_name="")
uint8_t flag
Definition wm_window.cc:145