diff options
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_nodes.h')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes.h | 80 |
1 files changed, 75 insertions, 5 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 2fa9ba01cc7..cc8ad08ea3b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -32,6 +32,8 @@ #include "intern/depsgraph_types.h" +#include "DEG_depsgraph.h" /* used for DEG_depsgraph_use_copy_on_write() */ + struct Base; struct CacheFile; struct bGPdata; @@ -42,6 +44,7 @@ struct Image; struct FCurve; struct Group; struct Key; +struct LayerCollection; struct Main; struct Material; struct Mask; @@ -49,6 +52,8 @@ struct MTex; struct MovieClip; struct bNodeTree; struct Object; +struct ParticleSettings; +struct Probe; struct bPoseChannel; struct bConstraint; struct Scene; @@ -70,9 +75,45 @@ struct DepsgraphNodeBuilder { DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph); ~DepsgraphNodeBuilder(); + /* For given original ID get ID which is created by CoW system. */ + ID *get_cow_id(const ID *id_orig) const; + /* Similar to above, but for the cases when there is no ID node we create + * one. + */ + ID *ensure_cow_id(ID *id_orig); + + /* Helper wrapper function which wraps get_cow_id with a needed type cast. */ + template<typename T> + T *get_cow_datablock(const T *orig) const { + return (T *)get_cow_id(&orig->id); + } + + /* Get fully expanded (ready for use) copy-on-write datablock for the given + * original datablock. + */ + ID *expand_cow_id(IDDepsNode *id_node); + ID *expand_cow_id(ID *id_orig); + template<typename T> + T *expand_cow_datablock(T *orig) { + return (T *)expand_cow_id(&orig->id); + } + + /* For a given COW datablock get corresponding original one. */ + template<typename T> + T *get_orig_datablock(const T *cow) const { + if (DEG_depsgraph_use_copy_on_write()) { + return (T *)cow->id.orig_id; + } + else { + return (T *)cow; + } + } + void begin_build(); + void end_build(); - IDDepsNode *add_id_node(ID *id); + IDDepsNode *add_id_node(ID *id, bool do_tag = true); + IDDepsNode *find_id_node(ID *id); TimeSourceDepsNode *add_time_source(); ComponentDepsNode *add_component_node(ID *id, @@ -118,15 +159,23 @@ struct DepsgraphNodeBuilder { const char *name = "", int name_tag = -1); - void build_scene(Scene *scene); - void build_group(Base *base, Group *group); - void build_object(Base *base, Object *object); + void build_view_layer(Scene *scene, + ViewLayer *view_layer, + eDepsNode_LinkedState_Type linked_state); + void build_group(Group *group); + void build_object(Base *base, + Object *object, + eDepsNode_LinkedState_Type linked_state); + void build_object_flags(Base *base, + Object *object, + eDepsNode_LinkedState_Type linked_state); void build_object_data(Object *object); void build_object_transform(Object *object); void build_object_constraints(Object *object); void build_pose_constraints(Object *object, bPoseChannel *pchan); void build_rigidbody(Scene *scene); void build_particles(Object *object); + void build_particle_settings(ParticleSettings *part); void build_cloth(Object *object); void build_animdata(ID *id); OperationDepsNode *build_driver(ID *id, FCurve *fcurve); @@ -153,14 +202,35 @@ struct DepsgraphNodeBuilder { void build_cachefile(CacheFile *cache_file); void build_mask(Mask *mask); void build_movieclip(MovieClip *clip); - + void build_lightprobe(Object *object); + + struct LayerCollectionState { + int index; + LayerCollection *parent; + }; + void build_layer_collection(ID *owner_id, + LayerCollection *layer_collection, + LayerCollectionState *state); + void build_layer_collections(ID *owner_id, + ListBase *layer_collections, + LayerCollectionState *state); + void build_view_layer_collections(ID *owner_id, ViewLayer *view_layer); protected: + struct SavedEntryTag { + ID *id; + eDepsNode_Type component_type; + eDepsOperation_Code opcode; + }; + vector<SavedEntryTag> saved_entry_tags_; + /* State which never changes, same for the whole builder time. */ Main *bmain_; Depsgraph *graph_; /* State which demotes currently built entities. */ Scene *scene_; + + GHash *cow_id_hash_; }; } // namespace DEG |