Blender  V3.3
deg_builder_relations.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2013 Blender Foundation. All rights reserved. */
3 
8 #pragma once
9 
10 #include <cstdio>
11 #include <cstring>
12 
13 #include "intern/depsgraph_type.h"
14 
15 #include "DNA_ID.h"
16 
17 #include "RNA_access.h"
18 #include "RNA_path.h"
19 #include "RNA_types.h"
20 
21 #include "BLI_string.h"
22 #include "BLI_utildefines.h"
23 
28 #include "intern/depsgraph.h"
29 #include "intern/node/deg_node.h"
33 
34 struct CacheFile;
35 struct Camera;
36 struct Collection;
37 struct EffectorWeights;
38 struct FCurve;
39 struct FreestyleLineSet;
40 struct FreestyleLineStyle;
41 struct ID;
42 struct IDProperty;
43 struct Image;
44 struct Key;
45 struct LayerCollection;
46 struct Light;
47 struct LightProbe;
48 struct ListBase;
49 struct Main;
50 struct Mask;
51 struct Material;
52 struct MovieClip;
53 struct Object;
54 struct ParticleSettings;
55 struct ParticleSystem;
56 struct Scene;
57 struct Simulation;
58 struct Speaker;
59 struct Tex;
60 struct VFont;
61 struct ViewLayer;
62 struct World;
63 struct bAction;
64 struct bArmature;
65 struct bConstraint;
66 struct bGPdata;
67 struct bNodeSocket;
68 struct bNodeTree;
69 struct bPoseChannel;
70 struct bSound;
71 
72 struct PropertyRNA;
73 
74 namespace blender::deg {
75 
76 struct ComponentNode;
77 struct DepsNodeHandle;
78 struct Depsgraph;
79 class DepsgraphBuilderCache;
80 struct IDNode;
81 struct Node;
82 struct OperationNode;
83 struct Relation;
84 struct RootPChanMap;
85 struct TimeSourceNode;
86 
87 struct TimeSourceKey {
88  TimeSourceKey();
89  TimeSourceKey(ID *id);
90 
91  string identifier() const;
92 
93  ID *id;
94 };
95 
96 struct ComponentKey {
97  ComponentKey();
98  ComponentKey(ID *id, NodeType type, const char *name = "");
99 
100  string identifier() const;
101 
102  ID *id;
104  const char *name;
105 };
106 
107 struct OperationKey {
108  OperationKey();
109  OperationKey(ID *id, NodeType component_type, const char *name, int name_tag = -1);
110  OperationKey(
111  ID *id, NodeType component_type, const char *component_name, const char *name, int name_tag);
112 
115 
116  OperationKey(
117  ID *id, NodeType component_type, OperationCode opcode, const char *name, int name_tag = -1);
118  OperationKey(ID *id,
120  const char *component_name,
122  const char *name,
123  int name_tag = -1);
124 
125  string identifier() const;
126 
127  ID *id;
129  const char *component_name;
131  const char *name;
132  int name_tag;
133 };
134 
135 struct RNAPathKey {
136  RNAPathKey(ID *id, const char *path, RNAPointerSource source);
138 
139  string identifier() const;
140 
141  ID *id;
145 };
146 
148  public:
150 
151  void begin_build();
152 
153  template<typename KeyFrom, typename KeyTo>
154  Relation *add_relation(const KeyFrom &key_from,
155  const KeyTo &key_to,
156  const char *description,
157  int flags = 0);
158 
159  template<typename KeyTo>
160  Relation *add_relation(const TimeSourceKey &key_from,
161  const KeyTo &key_to,
162  const char *description,
163  int flags = 0);
164 
165  template<typename KeyType>
166  Relation *add_node_handle_relation(const KeyType &key_from,
167  const DepsNodeHandle *handle,
168  const char *description,
169  int flags = 0);
170 
171  template<typename KeyTo>
173  const KeyTo &key_to,
174  const char *description,
175  int flags = 0);
176 
177  /* Adds relation from proper transformation operation to the modifier.
178  * Takes care of checking for possible physics solvers modifying position
179  * of this object. */
180  void add_modifier_to_transform_relation(const DepsNodeHandle *handle, const char *description);
181 
182  void add_customdata_mask(Object *object, const DEGCustomDataMeshMasks &customdata_masks);
183  void add_special_eval_flag(ID *id, uint32_t flag);
184 
185  virtual void build_id(ID *id);
186 
187  /* Build function for ID types that do not need their own build_xxx() function. */
188  virtual void build_generic_id(ID *id);
189 
190  virtual void build_idproperties(IDProperty *id_property);
191 
192  virtual void build_scene_camera(Scene *scene);
193  virtual void build_scene_render(Scene *scene, ViewLayer *view_layer);
194  virtual void build_scene_parameters(Scene *scene);
195  virtual void build_scene_compositor(Scene *scene);
196 
197  virtual void build_layer_collections(ListBase *lb);
198  virtual void build_view_layer(Scene *scene,
199  ViewLayer *view_layer,
200  eDepsNode_LinkedState_Type linked_state);
201  virtual void build_collection(LayerCollection *from_layer_collection,
202  Object *object,
203  Collection *collection);
204  virtual void build_object(Object *object);
205  virtual void build_object_from_view_layer_base(Object *object);
206  virtual void build_object_layer_component_relations(Object *object);
207  virtual void build_object_data(Object *object);
208  virtual void build_object_data_camera(Object *object);
209  virtual void build_object_data_geometry(Object *object);
210  virtual void build_object_data_geometry_datablock(ID *obdata);
211  virtual void build_object_data_light(Object *object);
212  virtual void build_object_data_lightprobe(Object *object);
213  virtual void build_object_data_speaker(Object *object);
214  virtual void build_object_parent(Object *object);
215  virtual void build_object_pointcache(Object *object);
216  virtual void build_constraints(ID *id,
217  NodeType component_type,
218  const char *component_subdata,
220  RootPChanMap *root_map);
221  virtual void build_animdata(ID *id);
222  virtual void build_animdata_curves(ID *id);
223  virtual void build_animdata_curves_targets(ID *id,
224  ComponentKey &adt_key,
225  OperationNode *operation_from,
226  ListBase *curves);
227  virtual void build_animdata_nlastrip_targets(ID *id,
228  ComponentKey &adt_key,
229  OperationNode *operation_from,
230  ListBase *strips);
231  virtual void build_animdata_drivers(ID *id);
232  virtual void build_animdata_force(ID *id);
233  virtual void build_animation_images(ID *id);
234  virtual void build_action(bAction *action);
235  virtual void build_driver(ID *id, FCurve *fcurve);
236  virtual void build_driver_data(ID *id, FCurve *fcurve);
237  virtual void build_driver_variables(ID *id, FCurve *fcurve);
238  virtual void build_driver_id_property(ID *id, const char *rna_path);
239  virtual void build_parameters(ID *id);
240  virtual void build_dimensions(Object *object);
241  virtual void build_world(World *world);
242  virtual void build_rigidbody(Scene *scene);
243  virtual void build_particle_systems(Object *object);
244  virtual void build_particle_settings(ParticleSettings *part);
246  ParticleSystem *psys,
247  Object *draw_object);
248  virtual void build_ik_pose(Object *object,
249  bPoseChannel *pchan,
250  bConstraint *con,
251  RootPChanMap *root_map);
252  virtual void build_splineik_pose(Object *object,
253  bPoseChannel *pchan,
254  bConstraint *con,
255  RootPChanMap *root_map);
256  virtual void build_inter_ik_chains(Object *object,
257  const OperationKey &solver_key,
258  const bPoseChannel *rootchan,
259  const RootPChanMap *root_map);
260  virtual void build_rig(Object *object);
261  virtual void build_shapekeys(Key *key);
262  virtual void build_armature(bArmature *armature);
263  virtual void build_armature_bones(ListBase *bones);
264  virtual void build_camera(Camera *camera);
265  virtual void build_light(Light *lamp);
266  virtual void build_nodetree(bNodeTree *ntree);
267  virtual void build_nodetree_socket(bNodeSocket *socket);
268  virtual void build_material(Material *ma);
269  virtual void build_materials(Material **materials, int num_materials);
270  virtual void build_freestyle_lineset(FreestyleLineSet *fls);
272  virtual void build_texture(Tex *tex);
273  virtual void build_image(Image *image);
274  virtual void build_cachefile(CacheFile *cache_file);
275  virtual void build_mask(Mask *mask);
276  virtual void build_movieclip(MovieClip *clip);
277  virtual void build_lightprobe(LightProbe *probe);
278  virtual void build_speaker(Speaker *speaker);
279  virtual void build_sound(bSound *sound);
280  virtual void build_simulation(Simulation *simulation);
281  virtual void build_scene_sequencer(Scene *scene);
282  virtual void build_scene_audio(Scene *scene);
283  virtual void build_scene_speakers(Scene *scene, ViewLayer *view_layer);
284  virtual void build_vfont(VFont *vfont);
285 
286  virtual void build_nested_datablock(ID *owner, ID *id, bool flush_cow_changes);
287  virtual void build_nested_nodetree(ID *owner, bNodeTree *ntree);
288  virtual void build_nested_shapekey(ID *owner, Key *key);
289 
291  Object *object,
292  Collection *collection,
293  const char *name);
295  Object *object,
296  ParticleSystem *psys,
297  EffectorWeights *eff,
298  bool add_absorption,
299  const char *name);
300 
301  virtual void build_copy_on_write_relations();
303  virtual void build_driver_relations();
304  virtual void build_driver_relations(IDNode *id_node);
305 
306  template<typename KeyType> OperationNode *find_operation_node(const KeyType &key);
307 
308  Depsgraph *getGraph();
309 
310  protected:
311  TimeSourceNode *get_node(const TimeSourceKey &key) const;
312  ComponentNode *get_node(const ComponentKey &key) const;
313  OperationNode *get_node(const OperationKey &key) const;
314  Node *get_node(const RNAPathKey &key);
315 
316  OperationNode *find_node(const OperationKey &key) const;
317  bool has_node(const OperationKey &key) const;
318 
320  Node *node_to,
321  const char *description,
322  int flags = 0);
323 
324  /* Add relation which ensures visibility of `id_from` when `id_to` is visible.
325  * For the more detailed explanation see comment for `NodeType::VISIBILITY`. */
326  void add_visibility_relation(ID *id_from, ID *id_to);
327 
329  OperationNode *node_to,
330  const char *description,
331  int flags = 0);
332 
333  template<typename KeyType>
334  DepsNodeHandle create_node_handle(const KeyType &key, const char *default_name = "");
335 
336  /* TODO(sergey): All those is_same* functions are to be generalized. */
337 
338  /* Check whether two keys corresponds to the same bone from same armature.
339  *
340  * This is used by drivers relations builder to avoid possible fake
341  * dependency cycle when one bone property drives another property of the
342  * same bone. */
343  template<typename KeyFrom, typename KeyTo>
344  bool is_same_bone_dependency(const KeyFrom &key_from, const KeyTo &key_to);
345 
346  /* Similar to above, but used to check whether driver is using node from
347  * the same node tree as a driver variable. */
348  template<typename KeyFrom, typename KeyTo>
349  bool is_same_nodetree_node_dependency(const KeyFrom &key_from, const KeyTo &key_to);
350 
351  private:
352  struct BuilderWalkUserData {
353  DepsgraphRelationBuilder *builder;
354  };
355 
356  static void modifier_walk(void *user_data,
357  struct Object *object,
358  struct ID **idpoin,
359  int cb_flag);
360 
361  static void constraint_walk(bConstraint *con, ID **idpoin, bool is_reference, void *user_data);
362 
363  /* State which demotes currently built entities. */
364  Scene *scene_;
365 
366  BuilderMap built_map_;
367  RNANodeQuery rna_node_query_;
368  BuilderStack stack_;
369 };
370 
374  const char *default_name = "")
376  {
377  BLI_assert(node != nullptr);
378  }
379 
382  const char *default_name;
383 };
384 
385 } // namespace blender::deg
386 
#define BLI_assert(a)
Definition: BLI_assert.h:46
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
ID and Library types, which are fundamental for sdna.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to curves
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint ** constraints
bool has_node(const OperationKey &key) const
void add_particle_collision_relations(const OperationKey &key, Object *object, Collection *collection, const char *name)
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_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_dimensions(Object *object)
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_action(bAction *action)
virtual void build_collection(LayerCollection *from_layer_collection, Object *object, Collection *collection)
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_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_animdata_curves_targets(ID *id, ComponentKey &adt_key, OperationNode *operation_from, ListBase *curves)
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)
virtual void build_driver_id_property(ID *id, const char *rna_path)
virtual void build_scene_sequencer(Scene *scene)
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)
void add_special_eval_flag(ID *id, uint32_t flag)
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)
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 void build_nested_shapekey(ID *owner, Key *key)
virtual void build_object_parent(Object *object)
virtual void build_simulation(Simulation *simulation)
virtual void build_inter_ik_chains(Object *object, const OperationKey &solver_key, const bPoseChannel *rootchan, const RootPChanMap *root_map)
virtual void build_materials(Material **materials, int num_materials)
virtual void build_object_data_speaker(Object *object)
virtual void build_freestyle_lineset(FreestyleLineSet *fls)
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_cachefile(CacheFile *cache_file)
DepsNodeHandle create_node_handle(const KeyType &key, const char *default_name="")
void add_modifier_to_transform_relation(const DepsNodeHandle *handle, const char *description)
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)
Depsgraph * graph
const IDNode * id_node
Scene scene
FreestyleLineStyle linestyle
World world
Simulation simulation
Light lamp
void * user_data
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img image(1, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D_ARRAY, "out_weight_img") .image(3
bNodeTree * ntree
smooth(Type::VEC4, "color_mul") .smooth(Type gpFillTexture gpSceneDepthTexture materials[GPENCIL_MATERIAL_BUFFER_LEN]
Definition: gpencil_info.hh:29
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
Definition: math_float4.h:513
eDepsNode_LinkedState_Type
Definition: deg_node_id.h:23
unsigned int uint32_t
Definition: stdint.h:80
Definition: DNA_ID.h:368
Definition: BKE_main.h:121
DepsgraphRelationBuilder * builder
DepsNodeHandle(DepsgraphRelationBuilder *builder, OperationNode *node, const char *default_name="")
RNAPathKey(ID *id, const char *path, RNAPointerSource source)