From d110ae77913610a2c8d676f7c5a99fdcb40ea7d4 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 16 Mar 2012 14:06:43 +0000 Subject: Allow merging two tracks in cases when they've got overlapping tracked/keyframed frame ranges using average position of both tracks as position/ --- source/blender/blenkernel/BKE_tracking.h | 1 - source/blender/blenkernel/intern/tracking.c | 65 +++++++++--------------- source/blender/editors/space_clip/tracking_ops.c | 12 ----- 3 files changed, 23 insertions(+), 55 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index f1daa5d63b3..b853a5b4af9 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -67,7 +67,6 @@ void BKE_tracking_free_track(struct MovieTrackingTrack *track); void BKE_tracking_clear_path(struct MovieTrackingTrack *track, int ref_frame, int action); -int BKE_tracking_test_join_tracks(struct MovieTrackingTrack *dst_track, struct MovieTrackingTrack *src_track); void BKE_tracking_join_tracks(struct MovieTrackingTrack *dst_track, struct MovieTrackingTrack *src_track); void BKE_tracking_free(struct MovieTracking *tracking); 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(amarkersnr || bmarkersnr) { - if(b>=dst_track->markersnr) { - a++; - count++; - } - else if(a>=src_track->markersnr) { - b++; - count++; - } - else if(src_track->markers[a].framenrmarkers[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; imarkersnr || 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) diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index b4990180b19..616fa7d742c 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -2955,18 +2955,6 @@ static int join_tracks_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - track= tracksbase->first; - while(track) { - if(TRACK_VIEW_SELECTED(sc, track) && track!=act_track) { - if(!BKE_tracking_test_join_tracks(act_track, track)) { - BKE_report(op->reports, RPT_ERROR, "Some selected tracks have got keyframed markers to the same frame"); - return OPERATOR_CANCELLED; - } - } - - track= track->next; - } - track= tracksbase->first; while(track) { next= track->next; -- cgit v1.2.3