Fix T52749: New Depsgraph - Render View Mask is not initialized correctly
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 14 Sep 2017 11:12:01 +0000 (16:12 +0500)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 14 Sep 2017 11:12:01 +0000 (16:12 +0500)
source/blender/blenkernel/BKE_mask.h
source/blender/blenkernel/intern/mask_evaluate.c
source/blender/blenkernel/intern/scene.c
source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
source/blender/depsgraph/intern/builder/deg_builder_relations.cc
source/blender/depsgraph/intern/depsgraph_type_defines.cc
source/blender/depsgraph/intern/depsgraph_types.h

index 127d194423311f59258887138d2de681380f1ff3..5598f0dc4731cfaee998aa3e943b030516a3a108 100644 (file)
@@ -32,6 +32,7 @@
  *  \ingroup bke
  */
 
+struct EvaluationContext;
 struct ImageUser;
 struct Image;
 struct ListBase;
@@ -236,6 +237,9 @@ float *BKE_mask_point_segment_feather_diff(struct MaskSpline *spline, struct Mas
 void BKE_mask_layer_evaluate_animation(struct MaskLayer *masklay, const float ctime);
 void BKE_mask_layer_evaluate_deform(struct MaskLayer *masklay, const float ctime);
 
+void BKE_mask_eval_animation(struct EvaluationContext *eval_ctx, struct Mask *mask);
+void BKE_mask_eval_update(struct EvaluationContext *eval_ctx, struct Mask *mask);
+
 /* mask_rasterize.c */
 struct MaskRasterHandle;
 typedef struct MaskRasterHandle MaskRasterHandle;
index 594896c86b4399f9028f513e49e437f3cc6478b1..0d71cc548c77f3da770367a0fd59853b7ea25582 100644 (file)
@@ -42,6 +42,8 @@
 #include "DNA_mask_types.h"
 
 #include "BKE_curve.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
 #include "BKE_mask.h"
 
 
@@ -811,7 +813,6 @@ float *BKE_mask_point_segment_diff(MaskSpline *spline, MaskSplinePoint *point,
        return diff_points;
 }
 
-
 static void mask_evaluate_apply_point_parent(MaskSplinePoint *point, float ctime)
 {
        float parent_matrix[3][3];
@@ -828,7 +829,7 @@ void BKE_mask_layer_evaluate_animation(MaskLayer *masklay, const float ctime)
        MaskLayerShape *masklay_shape_b;
        int found;
        if ((found = BKE_mask_layer_shape_find_frame_range(
-                  masklay, ctime, &masklay_shape_a, &masklay_shape_b)))
+               masklay, ctime, &masklay_shape_a, &masklay_shape_b)))
        {
                if (found == 1) {
 #if 0
@@ -895,3 +896,27 @@ void BKE_mask_layer_evaluate_deform(MaskLayer *masklay, const float ctime)
                /* end extra calc handles loop */
        }
 }
+
+#define DEBUG_PRINT if (G.debug & G_DEBUG_DEPSGRAPH) printf
+
+void BKE_mask_eval_animation(struct EvaluationContext *eval_ctx, Mask *mask)
+{
+       DEBUG_PRINT("%s on %s (%p)\n", __func__, mask->id.name, mask);
+       for (MaskLayer *mask_layer = mask->masklayers.first;
+            mask_layer != NULL;
+            mask_layer = mask_layer->next)
+       {
+               BKE_mask_layer_evaluate_animation(mask_layer, eval_ctx->ctime);
+       }
+}
+
+void BKE_mask_eval_update(struct EvaluationContext *eval_ctx, Mask *mask)
+{
+       DEBUG_PRINT("%s on %s (%p)\n", __func__, mask->id.name, mask);
+       for (MaskLayer *mask_layer = mask->masklayers.first;
+            mask_layer != NULL;
+            mask_layer = mask_layer->next)
+       {
+               BKE_mask_layer_evaluate_deform(mask_layer, eval_ctx->ctime);
+       }
+}
index b8ad54dc533558f58dce58d83d50e1767a8f204d..e8613d9ab9c62ab29998b4f2b77a8e6fad27141c 100644 (file)
@@ -1940,8 +1940,6 @@ void BKE_scene_update_tagged(EvaluationContext *eval_ctx, Main *bmain, Scene *sc
 #endif
        {
                DEG_evaluate_on_refresh(eval_ctx, scene->depsgraph, scene);
-               /* TODO(sergey): This is to beocme a node in new depsgraph. */
-               BKE_mask_update_scene(bmain, scene);
        }
 
        /* update sound system animation (TODO, move to depsgraph) */
@@ -2058,11 +2056,10 @@ void BKE_scene_update_for_newframe_ex(EvaluationContext *eval_ctx, Main *bmain,
                /* Following 2 functions are recursive
                 * so don't call within 'scene_update_tagged_recursive' */
                DAG_scene_update_flags(bmain, sce, lay, true, do_invisible_flush);   // only stuff that moves or needs display still
+               BKE_mask_evaluate_all_masks(bmain, ctime, true);
        }
 #endif
 
-       BKE_mask_evaluate_all_masks(bmain, ctime, true);
-
        /* Update animated cache files for modifiers. */
        BKE_cachefile_update_frame(bmain, sce, ctime, (((double)sce->r.frs_sec) / (double)sce->r.frs_sec_base));
 
index d70d8116178600eb184f1213b0e73c44c3e35b74..17f0c030bd0b1cc16f65e0ab667a4903063a62aa 100644 (file)
@@ -81,6 +81,7 @@ extern "C" {
 #include "BKE_lattice.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
+#include "BKE_mask.h"
 #include "BKE_material.h"
 #include "BKE_mesh.h"
 #include "BKE_mball.h"
@@ -1097,7 +1098,18 @@ void DepsgraphNodeBuilder::build_mask(Mask *mask)
 {
        ID *mask_id = &mask->id;
        add_id_node(mask_id);
+       /* F-Curve based animation/ */
        build_animdata(mask_id);
+       /* Animation based on mask's shapes. */
+       add_operation_node(mask_id,
+                          DEG_NODE_TYPE_ANIMATION,
+                          function_bind(BKE_mask_eval_animation, _1, mask),
+                          DEG_OPCODE_MASK_ANIMATION);
+       /* Final mask evaluation. */
+       add_operation_node(mask_id,
+                          DEG_NODE_TYPE_PARAMETERS,
+                          function_bind(BKE_mask_eval_update, _1, mask),
+                          DEG_OPCODE_MASK_EVAL);
 }
 
 void DepsgraphNodeBuilder::build_movieclip(MovieClip *clip) {
index e9d7b33de6bfcd371ff81b3b03c222c40caaafca..d42c404769111294ad735700d572f529ea68f71c 100644 (file)
@@ -1835,8 +1835,18 @@ void DepsgraphRelationBuilder::build_cachefile(CacheFile *cache_file) {
 
 void DepsgraphRelationBuilder::build_mask(Mask *mask)
 {
-       /* Animation. */
-       build_animdata(&mask->id);
+       ID *mask_id = &mask->id;
+       /* F-Curve animation. */
+       build_animdata(mask_id);
+       /* Own mask animation. */
+       OperationKey mask_animation_key(mask_id,
+                                       DEG_NODE_TYPE_ANIMATION,
+                                       DEG_OPCODE_MASK_ANIMATION);
+       TimeSourceKey time_src_key;
+       add_relation(time_src_key, mask_animation_key, "TimeSrc -> Mask Animation");
+       /* Final mask evaluation. */
+       ComponentKey parameters_key(mask_id, DEG_NODE_TYPE_PARAMETERS);
+       add_relation(mask_animation_key, parameters_key, "Mask Animation -> Mask Eval");
 }
 
 void DepsgraphRelationBuilder::build_movieclip(MovieClip *clip)
index 05a144900f979225d1da2fd8444797912ea3059c..f4f071cd611b70c58f35a79abe61b19ef9583713 100644 (file)
@@ -119,6 +119,8 @@ static const char *stringify_opcode(eDepsOperation_Code opcode)
                STRINGIFY_OPCODE(BONE_DONE);
                STRINGIFY_OPCODE(PSYS_EVAL);
                STRINGIFY_OPCODE(PSYS_EVAL_INIT);
+               STRINGIFY_OPCODE(MASK_ANIMATION);
+               STRINGIFY_OPCODE(MASK_EVAL);
 
                case DEG_NUM_OPCODES: return "SpecialCase";
 #undef STRINGIFY_OPCODE
index 6c0e3839b3916d2066c7420ab5a437f0a792a0ff..1c461423e035b4af4f3ec1fb79cd60ed419f3a62 100644 (file)
@@ -219,6 +219,10 @@ typedef enum eDepsOperation_Code {
        DEG_OPCODE_PSYS_EVAL_INIT,
        DEG_OPCODE_PSYS_EVAL,
 
+       /* Masks ------------------------------------------- */
+       DEG_OPCODE_MASK_ANIMATION,
+       DEG_OPCODE_MASK_EVAL,
+
        DEG_NUM_OPCODES,
 } eDepsOperation_Code;