Merge branch 'master' into blender2.8
[blender.git] / source / blender / depsgraph / intern / builder / deg_builder_nodes.h
index ec9fe6a40a20df8eff90834fb63ec052e8d3d3c1..40d6a56e789181ae2266ee4f2bcbbf0b100aef4b 100644 (file)
@@ -32,7 +32,8 @@
 
 #include "intern/depsgraph_types.h"
 
-struct Base;
+#include "DEG_depsgraph.h"  /* used for DEG_depsgraph_use_copy_on_write() */
+
 struct CacheFile;
 struct bGPdata;
 struct ListBase;
@@ -42,6 +43,7 @@ struct Image;
 struct FCurve;
 struct Group;
 struct Key;
+struct LayerCollection;
 struct Main;
 struct Material;
 struct Mask;
@@ -49,6 +51,8 @@ struct MTex;
 struct MovieClip;
 struct bNodeTree;
 struct Object;
+struct ParticleSettings;
+struct Probe;
 struct bPoseChannel;
 struct bConstraint;
 struct Scene;
@@ -70,9 +74,44 @@ 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.newid;
+               }
+               else {
+                       return (T *)cow;
+               }
+       }
+
        void begin_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,14 +157,17 @@ 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 *ob);
+       void build_scene(Scene *scene,
+                        eDepsNode_LinkedState_Type linked_state);
+       void build_group(Group *group);
+       void build_object(Object *ob,
+                         eDepsNode_LinkedState_Type linked_state);
        void build_object_transform(Object *ob);
        void build_object_constraints(Object *ob);
        void build_pose_constraints(Object *ob, bPoseChannel *pchan);
        void build_rigidbody(Scene *scene);
        void build_particles(Object *ob);
+       void build_particle_settings(ParticleSettings *part);
        void build_cloth(Object *object);
        void build_animdata(ID *id);
        OperationDepsNode *build_driver(ID *id, FCurve *fcurve);
@@ -152,7 +194,19 @@ 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(Scene *scene,
+                                   LayerCollection *layer_collection,
+                                   LayerCollectionState *state);
+       void build_layer_collections(Scene *scene,
+                                    ListBase *layer_collections,
+                                    LayerCollectionState *state);
+       void build_scene_layer_collections(Scene *scene);
 protected:
        /* State which never changes, same for the whole builder time. */
        Main *bmain_;
@@ -160,6 +214,8 @@ protected:
 
        /* State which demotes currently built entities. */
        Scene *scene_;
+
+       GHash *cow_id_hash_;
 };
 
 }  // namespace DEG