diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-16 18:06:43 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-16 18:06:43 +0400 |
commit | d110ae77913610a2c8d676f7c5a99fdcb40ea7d4 (patch) | |
tree | c9cf98bc43e8f135bd76772b40d1576aa0a09f87 /source/blender/blenkernel/intern/tracking.c | |
parent | d6339e94fe6826610d7afd9ca3dc2a2199ec7af7 (diff) |
Allow merging two tracks in cases when they've got overlapping tracked/keyframed
frame ranges using average position of both tracks as position/
Diffstat (limited to 'source/blender/blenkernel/intern/tracking.c')
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 65 |
1 files changed, 23 insertions, 42 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 9cc45d49e9f..0aa3920166c 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -476,49 +476,14 @@ void BKE_tracking_clear_path(MovieTrackingTrack *track, int ref_frame, int actio } } -int BKE_tracking_test_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack *src_track) -{ - int a= 0, b= 0; - int count= 0; - - while(a<src_track->markersnr || b<dst_track->markersnr) { - if(b>=dst_track->markersnr) { - a++; - count++; - } - else if(a>=src_track->markersnr) { - b++; - count++; - } - else if(src_track->markers[a].framenr<dst_track->markers[b].framenr) { - a++; - count++; - } else if(src_track->markers[a].framenr>dst_track->markers[b].framenr) { - b++; - count++; - } else { - if((src_track->markers[a].flag&MARKER_DISABLED)==0 && (dst_track->markers[b].flag&MARKER_DISABLED)==0) - return 0; - - a++; - b++; - count++; - } - } - - return count; -} - void BKE_tracking_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack *src_track) { - int i, a= 0, b= 0, tot; + int i= 0, a= 0, b= 0; MovieTrackingMarker *markers; - tot= BKE_tracking_test_join_tracks(dst_track, src_track); - - markers= MEM_callocN(tot*sizeof(MovieTrackingMarker), "tracking joined tracks"); + markers= MEM_callocN((dst_track->markersnr+src_track->markersnr)*sizeof(MovieTrackingMarker), "tmp tracking joined tracks"); - for(i= 0; i<tot; i++) { + while (a < src_track->markersnr || b < dst_track->markersnr) { if(b>=dst_track->markersnr) { markers[i]= src_track->markers[a++]; } @@ -530,18 +495,34 @@ void BKE_tracking_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack } else if(src_track->markers[a].framenr>dst_track->markers[b].framenr) { markers[i]= dst_track->markers[b++]; } else { - if((src_track->markers[a].flag&MARKER_DISABLED)) markers[i]= dst_track->markers[b]; - else markers[i]= src_track->markers[a++]; + if((src_track->markers[a].flag&MARKER_DISABLED)==0) { + if((dst_track->markers[b].flag&MARKER_DISABLED)==0) { + /* both tracks are enabled on this frame, use their average position + * can be improved further if tracks will be storing tracking score */ + + markers[i]= dst_track->markers[b]; + add_v2_v2(markers[i].pos, src_track->markers[a].pos); + mul_v2_fl(markers[i].pos, 0.5f); + } + else markers[i]= src_track->markers[a]; + } + else markers[i]= dst_track->markers[b]; a++; b++; } + + i++; } MEM_freeN(dst_track->markers); - dst_track->markers= markers; - dst_track->markersnr= tot; + dst_track->markers= MEM_callocN(i*sizeof(MovieTrackingMarker), "tracking joined tracks"); + memcpy(dst_track->markers, markers, i*sizeof(MovieTrackingMarker)); + + dst_track->markersnr= i; + + MEM_freeN(markers); } static void tracking_tracks_free(ListBase *tracks) |