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 | |
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/
-rw-r--r-- | source/blender/blenkernel/BKE_tracking.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 65 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 12 |
3 files changed, 23 insertions, 55 deletions
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(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) 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 @@ -2957,18 +2957,6 @@ static int join_tracks_exec(bContext *C, wmOperator *op) 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; if(TRACK_VIEW_SELECTED(sc, track) && track!=act_track) { |