Merge branch 'master' into blender2.8
[blender.git] / source / blender / depsgraph / DEG_depsgraph.h
index 9349b189e7b330a273f4aea7e1263153978ed293..6bcbff4950b66017f04b88c9db4cbf5ceac42df4 100644 (file)
@@ -65,14 +65,49 @@ struct Main;
 
 struct PointerRNA;
 struct PropertyRNA;
+struct RenderEngineType;
+struct Scene;
+struct ViewLayer;
+
+typedef enum eEvaluationMode {
+       DAG_EVAL_VIEWPORT       = 0,    /* evaluate for OpenGL viewport */
+       DAG_EVAL_PREVIEW        = 1,    /* evaluate for render with preview settings */
+       DAG_EVAL_RENDER         = 2,    /* evaluate for render purposes */
+} eEvaluationMode;
+
+/* Dependency graph evaluation context
+ *
+ * This structure stores all the local dependency graph data,
+ * which is needed for it's evaluation,
+ */
+typedef struct EvaluationContext {
+       eEvaluationMode mode;
+       float ctime;
+
+       struct Depsgraph *depsgraph;
+       struct ViewLayer *view_layer;
+       struct RenderEngineType *engine_type;
+} EvaluationContext;
+
+/* DagNode->eval_flags */
+enum {
+       /* Regardless to curve->path animation flag path is to be evaluated anyway,
+        * to meet dependencies with such a things as curve modifier and other guys
+        * who're using curve deform, where_on_path and so.
+        */
+       DAG_EVAL_NEED_CURVE_PATH = 1,
+       /* Scene evaluation would need to have object's data on CPU,
+        * meaning no GPU shortcuts is allowed.
+        */
+       DAG_EVAL_NEED_CPU        = 2,
+};
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-bool DEG_depsgraph_use_legacy(void);
-void DEG_depsgraph_switch_to_legacy(void);
-void DEG_depsgraph_switch_to_new(void);
+bool DEG_depsgraph_use_copy_on_write(void);
+void DEG_depsgraph_enable_copy_on_write(void);
 
 /* ************************************************ */
 /* Depsgraph API */
@@ -98,49 +133,71 @@ void DEG_free_node_types(void);
 
 /* Update Tagging -------------------------------- */
 
-/* Tag node(s) associated with states such as time and visibility */
-void DEG_scene_update_flags(Depsgraph *graph, const bool do_time);
-
 /* Update dependency graph when visible scenes/layers changes. */
-void DEG_graph_on_visible_update(struct Main *bmain, struct Scene *scene);
+void DEG_graph_on_visible_update(struct Main *bmain, Depsgraph *depsgraph);
 
 /* Update all dependency graphs when visible scenes/layers changes. */
 void DEG_on_visible_update(struct Main *bmain, const bool do_time);
 
-/* Tag node(s) associated with changed data for later updates */
-void DEG_graph_id_tag_update(struct Main *bmain,
-                             Depsgraph *graph,
-                             struct ID *id);
-void DEG_graph_data_tag_update(Depsgraph *graph, const struct PointerRNA *ptr);
-void DEG_graph_property_tag_update(Depsgraph *graph, const struct PointerRNA *ptr, const struct PropertyRNA *prop);
-
 /* Tag given ID for an update in all the dependency graphs. */
-void DEG_id_tag_update(struct ID *id, short flag);
-void DEG_id_tag_update_ex(struct Main *bmain,
-                          struct ID *id,
-                          short flag);
+enum {
+       /* Object transformation changed, corresponds to OB_RECALC_OB. */
+       DEG_TAG_TRANSFORM   = (1 << 0),
+
+       /* Object geoemtry changed, corresponds to OB_RECALC_DATA. */
+       DEG_TAG_GEOMETRY    = (1 << 1),
+
+       /* Time changed and animation is to be re-evaluated, OB_RECALC_TIME. */
+       DEG_TAG_TIME        = (1 << 2),
+
+       /* Particle system changed. */
+       DEG_TAG_PSYSC_REDO  = (1 << 3),
+       DEG_TAG_PSYS_RESET  = (1 << 4),
+       DEG_TAG_PSYS_TYPE   = (1 << 5),
+       DEG_TAG_PSYS_CHILD  = (1 << 6),
+       DEG_TAG_PSYS_PHYS   = (1 << 7),
+       DEG_TAG_PSYS        = ((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)),
+
+       /* Update copy on write component without flushing down the road. */
+       DEG_TAG_COPY_ON_WRITE = (1 << 8),
+
+       /* Tag shading components for update.
+        * Only parameters of material changed).
+        */
+       DEG_TAG_SHADING_UPDATE  = (1 << 9),
+       DEG_TAG_SELECT_UPDATE   = (1 << 10),
+       DEG_TAG_BASE_FLAGS_UPDATE = (1 << 11),
+
+       /* Only inform editors about the change. Don't modify datablock itself. */
+       DEG_TAG_EDITORS_UPDATE = (1 << 12),
+};
+void DEG_id_tag_update(struct ID *id, int flag);
+void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag);
+
+void DEG_graph_id_tag_update(struct Main *bmain,
+                             struct Depsgraph *depsgraph,
+                             struct ID *id,
+                             int flag);
 
 /* Mark a particular datablock type as having changing. This does
  * not cause any updates but is used by external render engines to detect if for
  * example a datablock was removed.
  */
-void DEG_id_type_tag(struct Main *bmain, short idtype);
+void DEG_id_type_tag(struct Main *bmain, short id_type);
 
 void DEG_ids_clear_recalc(struct Main *bmain);
 
 /* Update Flushing ------------------------------- */
 
-/* Flush updates for all IDs */
-void DEG_ids_flush_tagged(struct Main *bmain);
-
 /* Flush updates for IDs in a single scene. */
-void DEG_scene_flush_update(struct Main *bmain, struct Scene *scene);
+void DEG_graph_flush_update(struct Main *bmain, Depsgraph *depsgraph);
 
 /* Check if something was changed in the database and inform
  * editors about this.
  */
 void DEG_ids_check_recalc(struct Main *bmain,
                           struct Scene *scene,
+                          struct ViewLayer *view_layer,
                           bool time);
 
 /* ************************************************ */
@@ -149,13 +206,19 @@ void DEG_ids_check_recalc(struct Main *bmain,
 /* Evaluation Context ---------------------------- */
 
 /* Create new evaluation context. */
-struct EvaluationContext *DEG_evaluation_context_new(int mode);
+struct EvaluationContext *DEG_evaluation_context_new(eEvaluationMode mode);
 
 /* Initialize evaluation context.
  * Used by the areas which currently overrides the context or doesn't have
  * access to a proper one.
  */
-void DEG_evaluation_context_init(struct EvaluationContext *eval_ctx, int mode);
+void DEG_evaluation_context_init(struct EvaluationContext *eval_ctx,
+                                 eEvaluationMode mode);
+void DEG_evaluation_context_init_from_scene(struct EvaluationContext *eval_ctx,
+                                            struct Scene *scene,
+                                            struct ViewLayer *view_layer,
+                                            struct RenderEngineType *engine_type,
+                                            eEvaluationMode mode);
 
 /* Free evaluation context. */
 void DEG_evaluation_context_free(struct EvaluationContext *eval_ctx);
@@ -169,23 +232,13 @@ void DEG_evaluation_context_free(struct EvaluationContext *eval_ctx);
 void DEG_evaluate_on_framechange(struct EvaluationContext *eval_ctx,
                                  struct Main *bmain,
                                  Depsgraph *graph,
-                                 float ctime,
-                                 const unsigned int layer);
-
-/* Data changed recalculation entry point.
- * < context_type: context to perform evaluation for
- * < layers: visible layers bitmask to update the graph for
- */
-void DEG_evaluate_on_refresh_ex(struct EvaluationContext *eval_ctx,
-                                Depsgraph *graph,
-                                const unsigned int layers);
+                                 float ctime);
 
 /* Data changed recalculation entry point.
  * < context_type: context to perform evaluation for
  */
 void DEG_evaluate_on_refresh(struct EvaluationContext *eval_ctx,
-                             Depsgraph *graph,
-                             struct Scene *scene);
+                             Depsgraph *graph);
 
 bool DEG_needs_eval(Depsgraph *graph);
 
@@ -195,20 +248,21 @@ bool DEG_needs_eval(Depsgraph *graph);
  * to do their own updates based on changes.
  */
 
-typedef void (*DEG_EditorUpdateIDCb)(struct Main *bmain, struct ID *id);
-typedef void (*DEG_EditorUpdateSceneCb)(struct Main *bmain,
-                                        struct Scene *scene,
-                                        int updated);
-typedef void (*DEG_EditorUpdateScenePreCb)(struct Main *bmain,
-                                           struct Scene *scene,
-                                           bool time);
+typedef struct DEGEditorUpdateContext {
+       struct Main *bmain;
+       struct Scene *scene;
+       struct ViewLayer *view_layer;
+} DEGEditorUpdateContext;
+
+typedef void (*DEG_EditorUpdateIDCb)(
+        const DEGEditorUpdateContext *update_ctx,
+        struct ID *id);
+typedef void (*DEG_EditorUpdateSceneCb)(
+        const DEGEditorUpdateContext *update_ctx, int updated);
 
 /* Set callbacks which are being called when depsgraph changes. */
 void DEG_editors_set_update_cb(DEG_EditorUpdateIDCb id_func,
-                               DEG_EditorUpdateSceneCb scene_func,
-                               DEG_EditorUpdateScenePreCb scene_pre_func);
-
-void DEG_editors_update_pre(struct Main *bmain, struct Scene *scene, bool time);
+                               DEG_EditorUpdateSceneCb scene_func);
 
 #ifdef __cplusplus
 } /* extern "C" */