[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44922] trunk/blender/source/blender: Allow merging two tracks in cases when they've got overlapping tracked/ keyframed

Sergey Sharybin sergey.vfx at gmail.com
Fri Mar 16 15:06:51 CET 2012


Revision: 44922
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44922
Author:   nazgul
Date:     2012-03-16 14:06:43 +0000 (Fri, 16 Mar 2012)
Log Message:
-----------
Allow merging two tracks in cases when they've got overlapping tracked/keyframed
frame ranges using average position of both tracks as position/

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_tracking.h
    trunk/blender/source/blender/blenkernel/intern/tracking.c
    trunk/blender/source/blender/editors/space_clip/tracking_ops.c

Modified: trunk/blender/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_tracking.h	2012-03-16 11:46:08 UTC (rev 44921)
+++ trunk/blender/source/blender/blenkernel/BKE_tracking.h	2012-03-16 14:06:43 UTC (rev 44922)
@@ -67,7 +67,6 @@
 
 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);
 

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-03-16 11:46:08 UTC (rev 44921)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-03-16 14:06:43 UTC (rev 44922)
@@ -476,49 +476,14 @@
 	}
 }
 
-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 @@
 		} 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)

Modified: trunk/blender/source/blender/editors/space_clip/tracking_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/tracking_ops.c	2012-03-16 11:46:08 UTC (rev 44921)
+++ trunk/blender/source/blender/editors/space_clip/tracking_ops.c	2012-03-16 14:06:43 UTC (rev 44922)
@@ -2957,18 +2957,6 @@
 
 	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) {




More information about the Bf-blender-cvs mailing list