diff options
Diffstat (limited to 'source/blender/blenkernel/intern/mask.c')
-rw-r--r-- | source/blender/blenkernel/intern/mask.c | 115 |
1 files changed, 81 insertions, 34 deletions
diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index e3f30bad5cf..a7bfb15c99d 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -817,6 +817,19 @@ void BKE_mask_spline_free(MaskSpline *spline) MEM_freeN(spline); } +void BKE_mask_spline_free_list(ListBase *splines) +{ + MaskSpline *spline = splines->first; + while (spline) { + MaskSpline *next_spline = spline->next; + + BLI_remlink(splines, spline); + BKE_mask_spline_free(spline); + + spline = next_spline; + } +} + static MaskSplinePoint *mask_spline_points_copy(MaskSplinePoint *points, int tot_point) { MaskSplinePoint *npoints; @@ -891,20 +904,30 @@ void BKE_mask_layer_free_shapes(MaskLayer *masklay) } } -void BKE_mask_layer_free(MaskLayer *masklay) +void BKE_mask_layer_free_deform(MaskLayer *mask_layer) { - MaskSpline *spline; - - /* free splines */ - spline = masklay->splines.first; - while (spline) { - MaskSpline *next_spline = spline->next; + MaskSpline *mask_spline; - BLI_remlink(&masklay->splines, spline); - BKE_mask_spline_free(spline); - - spline = next_spline; + for (mask_spline = mask_layer->splines.first; + mask_spline; + mask_spline = mask_spline->next) + { + if (mask_spline->points_deform) { + int i; + MaskSplinePoint *points_deform = mask_spline->points_deform; + for (i = 0; i < mask_spline->tot_point; i++) { + BKE_mask_point_free(&points_deform[i]); + } + MEM_freeN(points_deform); + mask_spline->points_deform = NULL; + } } +} + +void BKE_mask_layer_free(MaskLayer *masklay) +{ + /* free splines */ + BKE_mask_spline_free_list(&masklay->splines); /* free animation data */ BKE_mask_layer_free_shapes(masklay); @@ -1072,7 +1095,7 @@ void BKE_mask_coord_to_image(Image *image, ImageUser *iuser, float r_co[2], cons BKE_mask_coord_to_frame(r_co, co, frame_size); } -static int BKE_mask_evaluate_parent(MaskParent *parent, float ctime, float r_co[2]) +static int mask_evaluate_parent(MaskParent *parent, float ctime, float orig_co[2], float r_co[2]) { if (!parent) return FALSE; @@ -1084,18 +1107,38 @@ static int BKE_mask_evaluate_parent(MaskParent *parent, float ctime, float r_co[ MovieTrackingObject *ob = BKE_tracking_object_get_named(tracking, parent->parent); if (ob) { - MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, ob, parent->sub_parent); + MovieClipUser user = {0}; float clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, ctime); + BKE_movieclip_user_set_frame(&user, ctime); - MovieClipUser user = {0}; - user.framenr = ctime; + if (parent->type == MASK_PARENT_POINT_TRACK) { + MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, ob, parent->sub_parent); - if (track) { - float marker_pos_ofs[2]; - BKE_tracking_marker_get_subframe_position(track, clip_framenr, marker_pos_ofs); - BKE_mask_coord_from_movieclip(clip, &user, r_co, marker_pos_ofs); + if (track) { + float marker_pos_ofs[2]; + BKE_tracking_marker_get_subframe_position(track, clip_framenr, marker_pos_ofs); + BKE_mask_coord_from_movieclip(clip, &user, r_co, marker_pos_ofs); - return TRUE; + return TRUE; + } + } + else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ { + MovieTrackingPlaneTrack *plane_track = BKE_tracking_plane_track_get_named(tracking, ob, parent->sub_parent); + + if (plane_track) { + MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr); + float H[3][3], vec[3], warped[3]; + + BKE_tracking_homography_between_two_quads(parent->parent_corners_orig, plane_marker->corners, H); + + BKE_mask_coord_to_movieclip(clip, &user, vec, orig_co); + vec[2] = 1.0f; + mul_v3_m3v3(warped, H, vec); + warped[0] /= warped[2]; + warped[1] /= warped[2]; + + BKE_mask_coord_from_movieclip(clip, &user, r_co, warped); + } } } } @@ -1104,17 +1147,26 @@ static int BKE_mask_evaluate_parent(MaskParent *parent, float ctime, float r_co[ return FALSE; } -/* could make external but for now its only used internally */ -static int mask_evaluate_parent_delta(MaskParent *parent, float ctime, float r_delta[2]) +static void mask_evaluate_apply_point_parent(MaskSplinePoint *point, float ctime) { - float parent_co[2]; + MaskParent *parent = &point->parent; + + if (parent->type == MASK_PARENT_POINT_TRACK) { + float parent_co[2]; - if (BKE_mask_evaluate_parent(parent, ctime, parent_co)) { - sub_v2_v2v2(r_delta, parent_co, parent->parent_orig); - return TRUE; + if (mask_evaluate_parent(parent, ctime, NULL, parent_co)) { + float delta[2]; + sub_v2_v2v2(delta, parent_co, parent->parent_orig); + + add_v2_v2(point->bezt.vec[0], delta); + add_v2_v2(point->bezt.vec[1], delta); + add_v2_v2(point->bezt.vec[2], delta); + } } - else { - return FALSE; + else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ { + mask_evaluate_parent(parent, ctime, point->bezt.vec[0], point->bezt.vec[0]); + mask_evaluate_parent(parent, ctime, point->bezt.vec[1], point->bezt.vec[1]); + mask_evaluate_parent(parent, ctime, point->bezt.vec[2], point->bezt.vec[2]); } } @@ -1438,18 +1490,13 @@ void BKE_mask_layer_evaluate(MaskLayer *masklay, const float ctime, const int do for (i = 0; i < spline->tot_point; i++) { MaskSplinePoint *point = &spline->points[i]; MaskSplinePoint *point_deform = &spline->points_deform[i]; - float delta[2]; BKE_mask_point_free(point_deform); *point_deform = *point; point_deform->uw = point->uw ? MEM_dupallocN(point->uw) : NULL; - if (mask_evaluate_parent_delta(&point->parent, ctime, delta)) { - add_v2_v2(point_deform->bezt.vec[0], delta); - add_v2_v2(point_deform->bezt.vec[1], delta); - add_v2_v2(point_deform->bezt.vec[2], delta); - } + mask_evaluate_apply_point_parent(point_deform, ctime); if (ELEM(point->bezt.h1, HD_AUTO, HD_VECT)) { need_handle_recalc = TRUE; |