[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