[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43129] trunk/blender/source/blender: Camera tracking: more accurate track preview widget

Sergey Sharybin sergey.vfx at gmail.com
Wed Jan 4 16:25:56 CET 2012


Revision: 43129
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43129
Author:   nazgul
Date:     2012-01-04 15:25:43 +0000 (Wed, 04 Jan 2012)
Log Message:
-----------
Camera tracking: more accurate track preview widget

- Added 1px extra margin to deal with bicubic interpolation nicely
- Code should be a bit more clear now

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

Modified: trunk/blender/source/blender/blenkernel/intern/movieclip.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/movieclip.c	2012-01-04 14:43:26 UTC (rev 43128)
+++ trunk/blender/source/blender/blenkernel/intern/movieclip.c	2012-01-04 15:25:43 UTC (rev 43129)
@@ -860,7 +860,9 @@
 						undist_marker.pos[1]/= height*aspy;
 					}
 
-					tmpibuf= BKE_tracking_get_pattern_imbuf(ibuf, track, &undist_marker, 1, 1, scopes->track_pos, NULL);
+					/* NOTE: margin should be kept in sync with value from ui_draw_but_TRACKPREVIEW */
+					tmpibuf= BKE_tracking_get_pattern_imbuf(ibuf, track, &undist_marker, 2 /* margin */,
+							1 /* anchor */, scopes->track_pos, NULL);
 
 					if(tmpibuf->rect_float)
 						IMB_rect_from_float(tmpibuf);

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-01-04 14:43:26 UTC (rev 43128)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-01-04 15:25:43 UTC (rev 43129)
@@ -999,17 +999,24 @@
 	if(anchored)
 		add_v2_v2(mpos, track->offset);
 
+	if(pos)
+		zero_v2(pos);
+
 	x= mpos[0]*ibuf->x;
 	y= mpos[1]*ibuf->y;
-	x1= x-(int)(-min[0]*ibuf->x);
-	y1= y-(int)(-min[1]*ibuf->y);
-	x2= x+(int)(max[0]*ibuf->x);
-	y2= y+(int)(max[1]*ibuf->y);
 
+	w= (max[0]-min[0])*ibuf->x;
+	h= (max[1]-min[1])*ibuf->y;
+
+	w= w|1;
+	h= h|1;
+
+	x1= x-(int)(w/2.0f);
+	y1= y-(int)(h/2.0f);
+	x2= x+(int)(w/2.0f);
+	y2= y+(int)(h/2.0f);
+
 	/* dimensions should be odd */
-	w= (x2-x1)|1;
-	h= (y2-y1)|1;
-
 	tmpibuf= IMB_allocImBuf(w+margin*2, h+margin*2, 32, IB_rect);
 	IMB_rectcpy(tmpibuf, ibuf, 0, 0, x1-margin, y1-margin, w+margin*2, h+margin*2);
 
@@ -1023,13 +1030,17 @@
 		origin[1]= y1-margin;
 	}
 
-	if ((track->flag & TRACK_PREVIEW_GRAYSCALE) ||
-			(track->flag & TRACK_DISABLE_RED)       ||
-			(track->flag & TRACK_DISABLE_GREEN)     ||
-			(track->flag & TRACK_DISABLE_BLUE) ) {
+	if((track->flag & TRACK_PREVIEW_GRAYSCALE) ||
+	   (track->flag & TRACK_DISABLE_RED)       ||
+	   (track->flag & TRACK_DISABLE_GREEN)     ||
+	   (track->flag & TRACK_DISABLE_BLUE))
+	{
 		disable_imbuf_channels(tmpibuf, track, 1 /* grayscale */);
 	}
 
+	tmpibuf->ftype= PNG;
+	IMB_saveiff(tmpibuf, "/tmp/1.png", IB_rect);
+
 	return tmpibuf;
 }
 

Modified: trunk/blender/source/blender/editors/interface/interface_draw.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_draw.c	2012-01-04 14:43:26 UTC (rev 43128)
+++ trunk/blender/source/blender/editors/interface/interface_draw.c	2012-01-04 15:25:43 UTC (rev 43129)
@@ -1465,21 +1465,16 @@
 {
 	ImBuf *scaleibuf;
 	int x, y, w= ibuf->x*zoomx, h= ibuf->y*zoomy;
-	const float max_x= ibuf->x-1.0f;
-	const float max_y= ibuf->y-1.0f;
 	const float scalex= 1.0f/zoomx;
 	const float scaley= 1.0f/zoomy;
 
 	scaleibuf= IMB_allocImBuf(w, h, 32, IB_rect);
 
-	for(y= 0; y<scaleibuf->y; y++) {
-		for (x= 0; x<scaleibuf->x; x++) {
+	for(y= 0; y<h; y++) {
+		for (x= 0; x<w; x++) {
 			float src_x= scalex*x;
 			float src_y= scaley*y;
 
-			CLAMP(src_x, 0, max_x);
-			CLAMP(src_y, 0, max_y);
-
 			bicubic_interpolation(ibuf, scaleibuf, src_x, src_y, x, y);
 		}
 	}
@@ -1514,28 +1509,36 @@
 		ok= 1;
 	}
 	else if(scopes->track_preview) {
-		int a, off_x, off_y;
-		float zoomx, zoomy;
+		/* additional margin around image */
+		/* NOTE: should be kept in sync with value from BKE_movieclip_update_scopes */
+		const int margin= 2;
+		float zoomx, zoomy, track_pos[2], off_x, off_y;
+		int a;
 		ImBuf *drawibuf;
 
 		glPushMatrix();
 
+		track_pos[0]= scopes->track_pos[0]-margin;
+		track_pos[1]= scopes->track_pos[1]-margin;
+
 		/* draw content of pattern area */
 		glScissor(ar->winrct.xmin+rect.xmin, ar->winrct.ymin+rect.ymin, scissor[2], scissor[3]);
 
-		zoomx= (rect.xmax-rect.xmin) / (scopes->track_preview->x-2.0f);
-		zoomy= (rect.ymax-rect.ymin) / (scopes->track_preview->y-2.0f);
+		zoomx= (rect.xmax-rect.xmin) / (scopes->track_preview->x-2*margin);
+		zoomy= (rect.ymax-rect.ymin) / (scopes->track_preview->y-2*margin);
 
-		off_x= ((int)scopes->track_pos[0]-scopes->track_pos[0]-0.5f)*zoomx;
-		off_y= ((int)scopes->track_pos[1]-scopes->track_pos[1]-0.5f)*zoomy;
+		off_x= ((int)track_pos[0]-track_pos[0]+0.5)*zoomx;
+		off_y= ((int)track_pos[1]-track_pos[1]+0.5)*zoomy;
 
 		drawibuf= scale_trackpreview_ibuf(scopes->track_preview, zoomx, zoomy);
-		glaDrawPixelsSafe(off_x+rect.xmin, off_y+rect.ymin, rect.xmax-rect.xmin+1.f-off_x, rect.ymax-rect.ymin+1.f-off_y, drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect);
-
+		glaDrawPixelsSafe(off_x+rect.xmin-zoomx*(margin-0.5f), off_y+rect.ymin-zoomy*(margin-0.5f),
+		                  rect.xmax-rect.xmin+2+(int)(zoomx*(margin-0.5f)-off_x),
+		                  rect.ymax-rect.ymin+2+(int)(zoomy*(margin-0.5f)-off_y),
+		                  drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect);
 		IMB_freeImBuf(drawibuf);
 
 		/* draw cross for pizel position */
-		glTranslatef(off_x+rect.xmin+scopes->track_pos[0]*zoomx, off_y+rect.ymin+scopes->track_pos[1]*zoomy, 0.f);
+		glTranslatef(off_x+rect.xmin+track_pos[0]*zoomx, off_y+rect.ymin+track_pos[1]*zoomy, 0.f);
 		glScissor(ar->winrct.xmin + rect.xmin, ar->winrct.ymin+rect.ymin, rect.xmax-rect.xmin, rect.ymax-rect.ymin);
 
 		for(a= 0; a< 2; a++) {



More information about the Bf-blender-cvs mailing list