Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-03-16 18:06:43 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-03-16 18:06:43 +0400
commitd110ae77913610a2c8d676f7c5a99fdcb40ea7d4 (patch)
treec9cf98bc43e8f135bd76772b40d1576aa0a09f87 /source
parentd6339e94fe6826610d7afd9ca3dc2a2199ec7af7 (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')
-rw-r--r--source/blender/blenkernel/BKE_tracking.h1
-rw-r--r--source/blender/blenkernel/intern/tracking.c65
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c12
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) {