Allow merging two tracks in cases when they've got overlapping tracked/keyframed

frame ranges using average position of both tracks as position/
This commit is contained in:
Sergey Sharybin
2012-03-16 14:06:43 +00:00
parent d6339e94fe
commit d110ae7791
3 changed files with 23 additions and 55 deletions

View File

@@ -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);

View File

@@ -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((dst_track->markersnr+src_track->markersnr)*sizeof(MovieTrackingMarker), "tmp tracking joined tracks");
markers= MEM_callocN(tot*sizeof(MovieTrackingMarker), "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)

View File

@@ -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;