improvement to handle recalculation, only do this on auto-handles when they are in...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 7 Jun 2012 07:28:55 +0000 (07:28 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 7 Jun 2012 07:28:55 +0000 (07:28 +0000)
source/blender/blenkernel/intern/mask.c
source/blender/makesdna/DNA_mask_types.h

index f7679d473b9177b530a4c54f36a0a80e9ee0cafc..0a6063a6b21fdd73a903adbbe1f5b6dbbe4b6f97 100644 (file)
@@ -1399,14 +1399,6 @@ void BKE_mask_calc_handles(Mask *mask)
        }
 }
 
-void BKE_mask_calc_handles_deform(Mask *mask)
-{
-       MaskLayer *masklay;
-       for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
-               BKE_mask_layer_calc_handles_deform(masklay);
-       }
-}
-
 void BKE_mask_update_deform(Mask *mask)
 {
        MaskLayer *masklay;
@@ -1516,9 +1508,10 @@ void BKE_mask_evaluate(Mask *mask, float ctime, const int do_newframe)
 
        for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
                MaskSpline *spline;
-               int i;
 
                for (spline = masklay->splines.first; spline; spline = spline->next) {
+                       int i;
+                       int has_auto = FALSE;
 
                        BKE_mask_spline_ensure_deform(spline);
 
@@ -1537,12 +1530,24 @@ void BKE_mask_evaluate(Mask *mask, float ctime, const int do_newframe)
                                        add_v2_v2(point_deform->bezt.vec[1], delta);
                                        add_v2_v2(point_deform->bezt.vec[2], delta);
                                }
+
+                               if (point->bezt.h1 == HD_AUTO) {
+                                       has_auto = TRUE;
+                               }
+                       }
+
+                       /* if the spline has auto handles, these need to be recalculated after deformation */
+                       if (has_auto) {
+                               for (i = 0; i < spline->tot_point; i++) {
+                                       MaskSplinePoint *point_deform = &spline->points_deform[i];
+                                       if (point_deform->bezt.h1 == HD_AUTO) {
+                                               BKE_mask_calc_handle_point(spline, point_deform);
+                                       }
+                               }
                        }
+                       /* end extra calc handles loop */
                }
        }
-
-       /* TODO, move into loop above and only run if there are auto-handles */
-       BKE_mask_calc_handles_deform(mask);
 }
 
 /* the purpose of this function is to ensure spline->points_deform is never out of date.
index c036369c692996b8c0e77a125e5e292a12136ba4..23f33729f69e9ca6ebf010fdf5db252e4cd68fc1 100644 (file)
@@ -43,9 +43,9 @@
 typedef struct Mask {
        ID id;
        struct AnimData *adt;
-       ListBase masklayers;   /* mask layers */
-       int masklay_act;     /* index of active mask layer (-1 == None) */
-       int masklay_tot;     /* total number of mask layers */
+       ListBase masklayers;  /* mask layers */
+       int masklay_act;      /* index of active mask layer (-1 == None) */
+       int masklay_tot;      /* total number of mask layers */
 } Mask;
 
 typedef struct MaskParent {
@@ -166,5 +166,4 @@ enum {
        MASK_BLENDFLAG_INVERT = (1 << 0)
 };
 
-
 #endif // __DNA_MASK_TYPES_H__