[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55028] trunk/blender/source/blender: Fix for incorrect subpixel precision of marker when using track offset

Sergey Sharybin sergey.vfx at gmail.com
Mon Mar 4 19:30:49 CET 2013


Revision: 55028
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55028
Author:   nazgul
Date:     2013-03-04 18:30:48 +0000 (Mon, 04 Mar 2013)
Log Message:
-----------
Fix for incorrect subpixel precision of marker when using track offset

Issue was caused by the way how pattern sampling happens in case of
anchored display: track offset is applying on search buffer which
means offset is rounding to an integer. Fractional pat of offset was
completely ignoring which lead to jumps in pattern buffer.

This was only a visualization issue in track preview widget.

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

Modified: trunk/blender/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_tracking.h	2013-03-04 17:06:16 UTC (rev 55027)
+++ trunk/blender/source/blender/blenkernel/BKE_tracking.h	2013-03-04 18:30:48 UTC (rev 55028)
@@ -162,7 +162,7 @@
 /* **** Image sampling **** */
 struct ImBuf *BKE_tracking_sample_pattern(int frame_width, int frame_height,
                                           struct ImBuf *struct_ibuf, struct MovieTrackingTrack *track,
-                                          struct MovieTrackingMarker *marker, int use_mask,
+                                          struct MovieTrackingMarker *marker, int from_anchor, int use_mask,
                                           int num_samples_x, int num_samples_y, float pos[2]);
 struct ImBuf *BKE_tracking_get_pattern_imbuf(struct ImBuf *ibuf, struct MovieTrackingTrack *track,
                                              struct MovieTrackingMarker *marker, int anchored, int disable_channels);

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2013-03-04 17:06:16 UTC (rev 55027)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2013-03-04 18:30:48 UTC (rev 55028)
@@ -1699,7 +1699,7 @@
 
 ImBuf *BKE_tracking_sample_pattern(int frame_width, int frame_height, ImBuf *search_ibuf,
                                    MovieTrackingTrack *track, MovieTrackingMarker *marker,
-                                   int use_mask, int num_samples_x, int num_samples_y,
+                                   int from_anchor, int use_mask, int num_samples_x, int num_samples_y,
                                    float pos[2])
 {
 #ifdef WITH_LIBMV
@@ -1719,6 +1719,28 @@
 
 	get_marker_coords_for_tracking(frame_width, frame_height, marker, src_pixel_x, src_pixel_y);
 
+	/* from_anchor means search buffer was obtained for an anchored position,
+	 * which means applying track offset rounded to pixel space (we could not
+	 * store search buffer with sub-pixel precision)
+	 *
+	 * in this case we need to alter coordinates a bit, to compensate rounded
+	 * fractional part of offset
+	 */
+	if (from_anchor) {
+		int a;
+
+		for (a = 0; a < 5; a++) {
+			src_pixel_x[a] += ((track->offset[0] * frame_width) - ((int) (track->offset[0] * frame_width)));
+			src_pixel_y[a] += ((track->offset[1] * frame_height) - ((int) (track->offset[1] * frame_height)));
+
+			/* when offset is negative, rounding happens in opposite direction */
+			if (track->offset[0] < 0.0f)
+				src_pixel_x[a] += 1.0f;
+			if (track->offset[1] < 0.0f)
+				src_pixel_y[a] += 1.0f;
+		}
+	}
+
 	if (use_mask) {
 		mask = BKE_tracking_track_get_mask(frame_width, frame_height, track, marker);
 	}
@@ -1779,7 +1801,7 @@
 
 	if (search_ibuf) {
 		pattern_ibuf = BKE_tracking_sample_pattern(ibuf->x, ibuf->y, search_ibuf, track, marker,
-		                                           FALSE, num_samples_x, num_samples_y, NULL);
+		                                           anchored, FALSE, num_samples_x, num_samples_y, NULL);
 
 		IMB_freeImBuf(search_ibuf);
 	}

Modified: trunk/blender/source/blender/editors/interface/interface_draw.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_draw.c	2013-03-04 17:06:16 UTC (rev 55027)
+++ trunk/blender/source/blender/editors/interface/interface_draw.c	2013-03-04 18:30:48 UTC (rev 55028)
@@ -1602,7 +1602,7 @@
 
 		tmpibuf = BKE_tracking_sample_pattern(scopes->frame_width, scopes->frame_height,
 		                                            scopes->track_search, scopes->track,
-		                                            &scopes->undist_marker, scopes->use_track_mask,
+		                                            &scopes->undist_marker, TRUE, scopes->use_track_mask,
 		                                            width, height, scopes->track_pos);
 
 		if (tmpibuf) {




More information about the Bf-blender-cvs mailing list