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) {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to