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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user