[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37864] branches/soc-2011-tomato: Camera tracking integration

Sergey Sharybin g.ulairi at gmail.com
Mon Jun 27 16:24:23 CEST 2011


Revision: 37864
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37864
Author:   nazgul
Date:     2011-06-27 14:24:23 +0000 (Mon, 27 Jun 2011)
Log Message:
-----------
Camera tracking integration
===========================

- Fixed "sliding" when panning footage in high zoom.
  This was most noticeable near right top corner of footage.
- Fixed 1px flickering of marker during playback with
  "Lock to Selection" toggled on. This was caused by
  precision errors. Used UI_view2d_to_region_no_clip-like
  offsets calculations, but in float values. Maybe there
  could be something smarter..
- Implemented tarcking along single frame.
  Hotkey is ALT+left/right array. Also changed a bit
  tracking tools buttons in Tools panel.
- Fixed "Lock to Selection" during tracking -- tracks
  synchronization should happen before centering view.
- Approximate marker's position for frames, which haven't
  got marker for them.
  Use the nearest marker from left side for approximation.
  For frames above  first marker's framenr sue first marker
  position.
- Markers now could be disabled. Added checkbox to
  "Active Marker" panel.
- Changes in cache line:
  * Bright line means active track has marker for frame.
  * Dark line means marker's position is approximated.
  * Yellow-less line means marker is disabled for that frames.

NOTE: .blend files which are saved with previous tomato version
      would fail to work properly. I don't want to spend time
      on making that files work properly atm, so don't blame on this.

Modified Paths:
--------------
    branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
    branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_space_types.h
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h

Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py	2011-06-27 14:24:23 UTC (rev 37864)
@@ -66,11 +66,20 @@
 
             col = layout.column(align=True)
             col.label(text="2D tracking:")
-            col.operator("clip.track_markers")
-            col.operator("clip.track_markers", text="Track Backwards").backwards=True
-            col.operator("clip.clear_track_path")
+            row = col.row(align=True)
+
+            op = row.operator("clip.track_markers", text="", icon='REW')
+            op.sequence = True
+            op.backwards = True
+            op = row.operator("clip.track_markers", text="", icon='PLAY_REVERSE')
+            op.backwards = True
+            row.operator("clip.track_markers", text="", icon='PLAY')
+            op = row.operator("clip.track_markers", text="", icon='FF')
+            op.sequence = True
+
+            layout.operator("clip.clear_track_path")
         else:
-          layout.operator('clip.open')
+            layout.operator('clip.open')
 
 
 class CLIP_PT_marker_preview(bpy.types.Panel):

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-06-27 14:24:23 UTC (rev 37864)
@@ -45,6 +45,7 @@
 void BKE_tracking_track_flag(struct MovieTrackingTrack *track, int area, int flag, int clear);
 void BKE_tracking_insert_marker(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
 struct MovieTrackingMarker *BKE_tracking_get_marker(struct MovieTrackingTrack *track, int framenr);
+struct MovieTrackingMarker *BKE_tracking_ensure_marker(struct MovieTrackingTrack *track, int framenr);
 int BKE_tracking_has_marker(struct MovieTrackingTrack *track, int framenr);
 
 void BKE_tracking_free_track(struct MovieTrackingTrack *track);

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-06-27 14:24:23 UTC (rev 37864)
@@ -150,7 +150,7 @@
 {
 	MovieTrackingMarker *old_marker= BKE_tracking_get_marker(track, marker->framenr);
 
-	if(old_marker) {
+	if(old_marker && old_marker->framenr==marker->framenr) {
 		*old_marker= *marker;
 	} else {
 		int a= track->markersnr;
@@ -167,6 +167,8 @@
 
 		memmove(track->markers+a+2, track->markers+a+1, (track->markersnr-a-2)*sizeof(MovieTrackingMarker));
 		track->markers[a+1]= *marker;
+
+		track->last_marker= a+1;
 	}
 }
 
@@ -177,39 +179,58 @@
 	if(!track->markersnr)
 		return NULL;
 
-	if((track->flag&TRACK_PROCESSED)==0) {
-		/* non-precessed tracks contains the only marker
-		   which should be used independelntly from current frame number. */
+	/* approximate pre-first framenr marker with first marker */
+	if(framenr<track->markers[0].framenr)
+		return &track->markers[0];
 
-		if(track->markersnr)
-			return &track->markers[0];
-
-		return NULL;
-	}
-
 	if(track->last_marker<track->markersnr)
 		a= track->last_marker;
 
 	if(track->markers[a].framenr<=framenr) {
-		while(a<track->markersnr) {
+		while(a<track->markersnr && track->markers[a].framenr<=framenr) {
 			if(track->markers[a].framenr==framenr) {
 				track->last_marker= a;
 				return &track->markers[a];
 			}
 			a++;
 		}
+
+		/* if there's no marker for exact position, use nearest marker from left side */
+		return &track->markers[a-1];
 	} else {
-		while(a--) {
+		while(a>=0 && track->markers[a].framenr>=framenr) {
 			if(track->markers[a].framenr==framenr) {
 				track->last_marker= a;
 				return &track->markers[a];
 			}
+
+			a--;
 		}
+
+		/* if there's no marker for exact position, use nearest marker from left side */
+		return &track->markers[a];
 	}
 
 	return NULL;
 }
 
+MovieTrackingMarker *BKE_tracking_ensure_marker(MovieTrackingTrack *track, int framenr)
+{
+	MovieTrackingMarker *marker= BKE_tracking_get_marker(track, framenr);
+
+	if(marker && marker->framenr!=framenr) {
+		MovieTrackingMarker marker_new;
+
+		marker_new= *marker;
+		marker_new.framenr= framenr;
+
+		BKE_tracking_insert_marker(track, &marker_new);
+		marker= BKE_tracking_get_marker(track, framenr);
+	}
+
+	return marker;
+}
+
 int BKE_tracking_has_marker(MovieTrackingTrack *track, int framenr)
 {
 	return BKE_tracking_get_marker(track, framenr) != 0;
@@ -515,7 +536,7 @@
 	while(track) {
 		MovieTrackingMarker *marker= BKE_tracking_get_marker(track, curfra);
 
-		if(marker) {
+		if(marker && marker->framenr==curfra) {
 #ifdef WITH_LIBMV
 			int width, height, pos[2];
 			float *patch= acquire_search_floatbuf(ibuf, track, marker, &width, &height, pos);
@@ -533,17 +554,13 @@
 						x1, y1, &x2, &y2)) {
 				MovieTrackingMarker marker_new;
 
+				memset(&marker_new, 0, sizeof(marker_new));
 				marker_new.pos[0]= marker->pos[0]+track->search_min[0]+x2/ibuf_new->x;
 				marker_new.pos[1]= marker->pos[1]+track->search_min[1]+y2/ibuf_new->y;
 
 				if(context->backwards) marker_new.framenr= curfra-1;
 				else marker_new.framenr= curfra+1;
 
-				/* happens when current frame was changed after placing marker
-				   but before tracking it */
-				if(marker->framenr!=curfra)
-					marker->framenr= curfra;
-
 				track->flag|= TRACK_PROCESSED;
 
 				BKE_tracking_insert_marker(track, &marker_new);

Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c	2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c	2011-06-27 14:24:23 UTC (rev 37864)
@@ -66,6 +66,7 @@
 #define B_MARKER_PAT_DIM		5
 #define B_MARKER_SEARCH_POS		6
 #define B_MARKER_SEARCH_DIM		7
+#define B_MARKER_FLAG			8
 
 static void to_pixel_space(float r[2], float a[2], int width, int height)
 {
@@ -74,7 +75,7 @@
 	r[1]*= height;
 }
 
-static void trackingMarker_buttons(const bContext *C, uiBlock *block)
+static void trackingMarker_buttons(const bContext *C, uiLayout *layout)
 {
 	SpaceClip *sc= CTX_wm_space_clip(C);
 	MovieClip *clip= ED_space_clip(sc);
@@ -82,6 +83,8 @@
 	MovieTrackingTrack *track;
 	MovieTrackingMarker *marker;
 	float pat_dim[2], pat_pos[2], search_dim[2], search_pos[2];
+	uiBlock *block;
+	uiLayout *col;
 
 	ED_space_clip_size(sc, &width, &height);
 	BKE_movieclip_last_selection(clip, &type, (void**)&track);
@@ -106,6 +109,17 @@
 	to_pixel_space(sc->track_search, search_dim, width, height);
 	to_pixel_space(sc->track_search_pos, search_pos, width, height);
 
+	sc->marker_flag= marker->flag;
+
+	block= uiLayoutAbsoluteBlock(layout);
+
+	uiDefButBitI(block, OPTION, MARKER_DISABLED, B_MARKER_FLAG,  "Disabled", 10, 190, 145, 19, &sc->marker_flag,
+		0, 0, 0, 0, "Marker is disabled for current frame.");
+
+	col= uiLayoutColumn(layout, 1);
+	uiLayoutSetActive(col, (sc->marker_flag&MARKER_DISABLED)==0);
+
+	block= uiLayoutAbsoluteBlock(col);
 	uiBlockBeginAlign(block);
 
 	uiDefBut(block, LABEL, 0, "Position:", 0, 171, 145, 19, NULL, 0, 0, 0, 0, "");
@@ -133,6 +147,7 @@
 		10.0*width, step, digits, "Width of marker's search in screen soordinates.");
 	uiDefButF(block, NUM, B_MARKER_SEARCH_DIM, "Height:", 10, 0, 300, 19, &sc->track_search[1], 3.0f,
 		10.0*height, step, digits, "Height of marker's search in screen soordinates.");
+
 	uiBlockEndAlign(block);
 }
 
@@ -147,8 +162,9 @@
 	ED_space_clip_size(sc, &width, &height);
 
 	BKE_movieclip_last_selection(clip, &type, (void**)&track);
-	marker= BKE_tracking_get_marker(track, sc->user.framenr);
 
+	marker= BKE_tracking_ensure_marker(track, sc->user.framenr);
+
 	if(event==B_MARKER_POS) {
 		marker->pos[0]= sc->marker_pos[0]/width;
 		marker->pos[1]= sc->marker_pos[1]/height;
@@ -212,6 +228,10 @@
 		BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
 
 		ok= 1;
+	} else if(event==B_MARKER_FLAG) {
+		marker->flag= sc->marker_flag;
+
+		ok= 1;
 	}
 
 	if(ok)
@@ -222,7 +242,6 @@
 
 static int clip_panel_marker_poll(const bContext *C, PanelType *UNUSED(pt))
 {
-	Scene *scene= CTX_data_scene(C);
 	SpaceClip *sc= CTX_wm_space_clip(C);
 	MovieClip *clip;
 	int type;
@@ -251,7 +270,7 @@
 	block= uiLayoutAbsoluteBlock(pa->layout);
 	uiBlockSetHandleFunc(block, do_tracking_marker, NULL);
 
-	trackingMarker_buttons(C, block);
+	trackingMarker_buttons(C, pa->layout);
 }
 
 void ED_clip_buttons_register(ARegionType *art)

Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c	2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c	2011-06-27 14:24:23 UTC (rev 37864)
@@ -69,14 +69,18 @@
 static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Scene *scene)
 {
 	float x;
-	int *points, totseg;
+	int *points, totseg, sel_type;
 	float sfra= SFRA, efra= EFRA;
+	void *sel;
+	float framelen= ar->winx/(efra-sfra+1);
 
+	BKE_movieclip_last_selection(clip, &sel_type, &sel);
+
 	glEnable(GL_BLEND);
 
 	/* cache background */
 	glColor4ub(128, 128, 255, 64);
-	glRecti(0, 0, ar->winx, 5);
+	glRecti(0, 0, ar->winx, 8);
 
 	/* cached segments -- could be usefu lto debug caching strategies */
 	BKE_movieclip_get_cache_segments(clip, &totseg, &points);
@@ -91,25 +95,58 @@
 			x1= (points[a*2]-sfra)/(efra-sfra+1)*ar->winx;
 			x2= (points[a*2+1]-sfra+1)/(efra-sfra+1)*ar->winx;
 
-			glRecti(x1, 0, x2, 5);
+			glRecti(x1, 0, x2, 8);
 		}
 	}
 
+	/* track */
+	if(sel_type==MCLIP_SEL_TRACK) {
+		int i, a= 0;
+		MovieTrackingTrack *track= (MovieTrackingTrack *)sel;
+
+		for(i= sfra; i <= efra; i++) {
+			int framenr;
+			MovieTrackingMarker *marker;
+
+			while(a<track->markersnr) {
+				if(track->markers[a].framenr>=i)
+					break;
+
+				if(a<track->markersnr-1 && track->markers[a+1].framenr>i)
+					break;
+
+				a++;
+			}
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list