diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-01-20 15:59:35 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-01-20 16:07:48 +0300 |
commit | 6a8f4bfc60800f63ab2571fc534ffff253e953bd (patch) | |
tree | f9257126e7f81a256a727fdef9b9ac5831638c91 /source/blender/blenkernel/intern/tracking.c | |
parent | b01c86568704d1916b4f496bccf055cfd59da7a4 (diff) |
Tracking: Fix missing average of track offset
Diffstat (limited to 'source/blender/blenkernel/intern/tracking.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 5353d0b9628..d124922acd1 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1033,9 +1033,11 @@ static void multiply_marker(MovieTrackingMarker *marker, const float multiplier) mul_v2_fl(marker->search_max, multiplier); } -void BKE_tracking_tracks_average(MovieTrackingTrack *dst_track, - /*const*/ MovieTrackingTrack **src_tracks, - const int num_src_tracks) +/* Helper function for BKE_tracking_tracks_average which takes care of averaging fields of + * markers (position, patterns, ...). */ +static void tracking_average_markers(MovieTrackingTrack *dst_track, + /*const*/ MovieTrackingTrack **src_tracks, + const int num_src_tracks) { /* Get global range of frames within which averaging would happen. */ int first_frame, last_frame; @@ -1088,6 +1090,32 @@ void BKE_tracking_tracks_average(MovieTrackingTrack *dst_track, MEM_freeN(counters); } +/* Helper function for BKE_tracking_tracks_average which takes care of averaging fields of + * tracks (track for example, offset). */ +static void tracking_average_tracks(MovieTrackingTrack *dst_track, + /*const*/ MovieTrackingTrack **src_tracks, + const int num_src_tracks) +{ + /* TODO(sergey): Consider averaging weight, stabilization weight, maybe even bundle position. */ + zero_v2(dst_track->offset); + for (int track_index = 0; track_index < num_src_tracks; track_index++) { + add_v2_v2(dst_track->offset, src_tracks[track_index]->offset); + } + mul_v2_fl(dst_track->offset, 1.0f / num_src_tracks); +} + +void BKE_tracking_tracks_average(MovieTrackingTrack *dst_track, + /*const*/ MovieTrackingTrack **src_tracks, + const int num_src_tracks) +{ + if (num_src_tracks == 0) { + return; + } + + tracking_average_markers(dst_track, src_tracks, num_src_tracks); + tracking_average_tracks(dst_track, src_tracks, num_src_tracks); +} + MovieTrackingTrack *BKE_tracking_track_get_named(MovieTracking *tracking, MovieTrackingObject *object, const char *name) |