[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46653] branches/soc-2011-tomato/source/ blender/editors/space_clip: Tomato: support of corners sliding for mouse sliding operator

Sergey Sharybin sergey.vfx at gmail.com
Tue May 15 12:55:27 CEST 2012


Revision: 46653
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46653
Author:   nazgul
Date:     2012-05-15 10:55:26 +0000 (Tue, 15 May 2012)
Log Message:
-----------
Tomato: support of corners sliding for mouse sliding operator

This commits re-enables mouse sliding operator which behaves in the same
way as it used to for search area and marker position, but for pattern
it's now using individual corners. This allows to define affine transformation
which later would be used by tracker algorithm.

For non-affine tracking code is also ported but currently it's hardcoded to
use affine transformation. When real affine trackers and RNA/DNA changes would
be commited, easy to switch sliding operator to old-school behavior for
non-affine patterns.

Modified Paths:
--------------
    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

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	2012-05-15 07:37:42 UTC (rev 46652)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c	2012-05-15 10:55:26 UTC (rev 46653)
@@ -719,24 +719,69 @@
 	glPopMatrix();
 }
 
+static float get_shortest_pattern_side(MovieTrackingMarker *marker)
+{
+	int i, next;
+	float len = FLT_MAX;
+
+	for (i = 0; i < 4; i++) {
+		float cur_len;
+
+		next = (i + 1) % 4;
+
+		cur_len = len_v2v2(marker->pattern_corners[i], marker->pattern_corners[next]);
+
+		len = MIN2(cur_len, len);
+	}
+
+	return len;
+}
+
+static void draw_marker_slide_square(float x, float y, float dx, float dy, int outline, float px[2])
+{
+	float tdx, tdy;
+
+	tdx = dx;
+	tdy = dy;
+
+	if (outline) {
+		tdx += px[0];
+		tdy += px[1];
+	}
+
+	glBegin(GL_QUADS);
+		glVertex3f(x - tdx, y + tdy, 0.0f);
+		glVertex3f(x + tdx, y + tdy, 0.0f);
+		glVertex3f(x + tdx, y - tdy, 0.0f);
+		glVertex3f(x - tdx, y - tdy, 0.0f);
+	glEnd();
+}
+
+static void draw_marker_slide_triangle(float x, float y, float dx, float dy, int outline, float px[2])
+{
+	float tdx, tdy;
+
+	tdx = dx * 2.0f;
+	tdy = dy * 2.0f;
+
+	if (outline) {
+		tdx += px[0];
+		tdy += px[1];
+	}
+
+	glBegin(GL_TRIANGLES);
+		glVertex3f(x,       y,       0.0f);
+		glVertex3f(x - tdx, y,       0.0f);
+		glVertex3f(x,       y + tdy, 0.0f);
+	glEnd();
+}
+
 static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker,
                                     float marker_pos[2], int outline, int sel, int act, int width, int height)
 {
-#if 1
-	/* XXX: not re-implemented yet */
-	(void) sc;
-	(void) track;
-	(void) marker;
-	(void) marker_pos;
-	(void) outline;
-	(void) sel;
-	(void) act;
-	(void) width;
-	(void) height;
-#else
-	float x, y, dx, dy, patdx, patdy, searchdx, searchdy, tdx, tdy;
+	float dx, dy, patdx, patdy, searchdx, searchdy;
 	int tiny = sc->flag & SC_SHOW_TINY_MARKER;
-	float col[3], scol[3], px[2];
+	float col[3], scol[3], px[2], side;
 
 	if ((tiny && outline) || (marker->flag & MARKER_DISABLED))
 		return;
@@ -757,8 +802,9 @@
 	dx = 6.0f / width / sc->zoom;
 	dy = 6.0f / height / sc->zoom;
 
-	patdx = MIN2(dx * 2.0f / 3.0f, (track->pat_max[0] - track->pat_min[0]) / 6.0f);
-	patdy = MIN2(dy * 2.0f / 3.0f, (track->pat_max[1] - track->pat_min[1]) / 6.0f);
+	side = get_shortest_pattern_side(marker);
+	patdx = MIN2(dx * 2.0f / 3.0f, side / 6.0f);
+	patdy = MIN2(dy * 2.0f / 3.0f, side * width / height / 6.0f);
 
 	searchdx = MIN2(dx, (track->search_max[0] - track->search_min[0]) / 6.0f);
 	searchdy = MIN2(dy, (track->search_max[1] - track->search_min[1]) / 6.0f);
@@ -775,41 +821,10 @@
 		}
 
 		/* search offset square */
-		x = track->search_min[0];
-		y = track->search_max[1];
+		draw_marker_slide_square(track->search_min[0], track->search_max[1], searchdx, searchdy, outline, px);
 
-		tdx = searchdx;
-		tdy = searchdy;
-
-		if (outline) {
-			tdx += px[0];
-			tdy += px[1];
-		}
-
-		glBegin(GL_QUADS);
-			glVertex3f(x - tdx, y + tdy, 0);
-			glVertex3f(x + tdx, y + tdy, 0);
-			glVertex3f(x + tdx, y - tdy, 0);
-			glVertex3f(x - tdx, y - tdy, 0);
-		glEnd();
-
 		/* search re-sizing triangle */
-		x = track->search_max[0];
-		y = track->search_min[1];
-
-		tdx = searchdx * 2.0f;
-		tdy = searchdy * 2.0f;
-
-		if (outline) {
-			tdx += px[0];
-			tdy += px[1];
-		}
-
-		glBegin(GL_TRIANGLES);
-			glVertex3f(x, y, 0);
-			glVertex3f(x - tdx, y, 0);
-			glVertex3f(x, y + tdy, 0);
-		glEnd();
+		draw_marker_slide_triangle(track->search_max[0], track->search_min[1], searchdx, searchdy, outline, px);
 	}
 
 	if ((sc->flag & SC_SHOW_MARKER_PATTERN) && ((track->pat_flag & SELECT) == sel || outline)) {
@@ -820,49 +835,32 @@
 				glColor3fv(col);
 		}
 
-		/* pattern offset square */
-		x = track->pat_min[0];
-		y = track->pat_max[1];
+		/* XXX: need to be real check if affine tracking is enabled, but for now not
+		 *      sure how to do this, so assume affine tracker is always enabled */
+		if (TRUE) {
+			int i;
 
-		tdx = patdx;
-		tdy = patdy;
-
-		if (outline) {
-			tdx += px[0];
-			tdy += px[1];
+			/* pattern's corners sliding squares */
+			for (i = 0; i < 4; i++) {
+				draw_marker_slide_square(marker->pattern_corners[i][0], marker->pattern_corners[i][1],
+				                         patdx / 1.5f, patdy / 1.5f, outline, px);
+			}
 		}
+		else {
+			/* pattern offset square */
+			draw_marker_slide_square(marker->pattern_corners[3][0], marker->pattern_corners[3][1],
+			                         patdx, patdy, outline, px);
 
-		glBegin(GL_QUADS);
-			glVertex3f(x - tdx, y + tdy, 0);
-			glVertex3f(x + tdx, y + tdy, 0);
-			glVertex3f(x + tdx, y - tdy, 0);
-			glVertex3f(x - tdx, y - tdy, 0);
-		glEnd();
-
-		/* pattern re-sizing triangle */
-		x = track->pat_max[0];
-		y = track->pat_min[1];
-
-		tdx = patdx*2.0f;
-		tdy = patdy*2.0f;
-
-		if (outline) {
-			tdx += px[0];
-			tdy += px[1];
+			/* pattern re-sizing triangle */
+			draw_marker_slide_triangle(marker->pattern_corners[1][0], marker->pattern_corners[1][1],
+			                           patdx, patdy, outline, px);
 		}
-
-		glBegin(GL_TRIANGLES);
-			glVertex3f(x, y, 0);
-			glVertex3f(x - tdx, y, 0);
-			glVertex3f(x, y + tdy, 0);
-		glEnd();
 	}
 
 	glPopMatrix();
 
 	if (outline)
 		glLineWidth(1.0f);
-#endif
 }
 
 static void draw_marker_texts(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker,

Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c	2012-05-15 07:37:42 UTC (rev 46652)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c	2012-05-15 10:55:26 UTC (rev 46653)
@@ -444,8 +444,7 @@
 
 	/* markers */
 	WM_operatortype_append(CLIP_OT_add_marker);
-	/* XXX: need porting! */
-	//WM_operatortype_append(CLIP_OT_slide_marker);
+	WM_operatortype_append(CLIP_OT_slide_marker);
 	WM_operatortype_append(CLIP_OT_delete_track);
 	WM_operatortype_append(CLIP_OT_delete_marker);
 
@@ -624,8 +623,7 @@
 	WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", DELKEY, KM_PRESS, KM_SHIFT, 0);
 	WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", XKEY, KM_PRESS, KM_SHIFT, 0);
 
-	/* XXX: need porting */
-	//WM_keymap_add_item(keymap, "CLIP_OT_slide_marker", LEFTMOUSE, KM_PRESS, 0, 0);
+	WM_keymap_add_item(keymap, "CLIP_OT_slide_marker", LEFTMOUSE, KM_PRESS, 0, 0);
 
 	kmi = WM_keymap_add_item(keymap, "CLIP_OT_disable_markers", DKEY, KM_PRESS, KM_SHIFT, 0);
 	RNA_enum_set(kmi->ptr, "action", 2);	/* toggle */

Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c	2012-05-15 07:37:42 UTC (rev 46652)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c	2012-05-15 10:55:26 UTC (rev 46653)
@@ -248,8 +248,6 @@
 }
 
 /********************** slide marker operator *********************/
-/* XXX: need porting! */
-#if 0
 
 #define SLIDE_ACTION_POS	0
 #define SLIDE_ACTION_SIZE	1
@@ -262,15 +260,16 @@
 
 	int mval[2];
 	int width, height;
-	float *min, *max, *pos, *offset;
-	float smin[2], smax[2], spos[2], soff[2];
+	float *min, *max, *pos, *offset, (*corners)[2];
+	float smin[2], smax[2], spos[2], soff[2], scorners[4][2];
 	float (*smarkers)[2];
 
 	int lock, accurate;
 } SlideMarkerData;
 
 static SlideMarkerData *create_slide_marker_data(SpaceClip *sc, MovieTrackingTrack *track,
-			MovieTrackingMarker *marker, wmEvent *event, int area, int action, int width, int height)
+                                                 MovieTrackingMarker *marker, wmEvent *event,
+												 int area, int corner, int action, int width, int height)
 {
 	SlideMarkerData *data = MEM_callocN(sizeof(SlideMarkerData), "slide marker data");
 
@@ -289,10 +288,9 @@
 	}
 	else if (area == TRACK_AREA_PAT) {
 		if (action == SLIDE_ACTION_SIZE) {
-			data->min = track->pat_min;
-			data->max = track->pat_max;
+			data->corners = marker->pattern_corners;
 		}
-		else {
+		else if (action == SLIDE_ACTION_OFFSET) {
 			int a;
 
 			data->pos = marker->pos;
@@ -304,15 +302,28 @@
 			for (a = 0; a < track->markersnr; a++)
 				copy_v2_v2(data->smarkers[a], track->markers[a].pos);
 		}
+		else if (action == SLIDE_ACTION_POS) {
+			data->corners = marker->pattern_corners;
+			data->pos = marker->pattern_corners[corner];
+
+			copy_v2_v2(data->spos, data->pos);
+		}
 	}
 	else if (area == TRACK_AREA_SEARCH) {
 		data->min = track->search_min;
 		data->max = track->search_max;
 	}
 
-	if (area == TRACK_AREA_SEARCH || (area == TRACK_AREA_PAT && action != SLIDE_ACTION_OFFSET)) {
-		copy_v2_v2(data->smin, data->min);
-		copy_v2_v2(data->smax, data->max);
+	if ((area == TRACK_AREA_SEARCH) ||
+		(area == TRACK_AREA_PAT && !ELEM(action, SLIDE_ACTION_OFFSET, SLIDE_ACTION_POS)))
+	{
+		if (data->corners) {
+			memcpy(data->scorners, data->corners, sizeof(data->scorners));
+		}
+		else {
+			copy_v2_v2(data->smin, data->min);
+			copy_v2_v2(data->smax, data->max);
+		}
 	}
 
 	data->mval[0] = event->mval[0];
@@ -327,8 +338,6 @@
 	return data;
 }
 
-/* corner = 0: right-bottom corner,
- * corner = 1: left-top corner */
 static int mouse_on_corner(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker,
                            int area, float co[2], int corner, int width, int height)
 {
@@ -342,8 +351,7 @@
 		copy_v2_v2(max, track->search_max);
 	}
 	else {
-		copy_v2_v2(min, track->pat_min);
-		copy_v2_v2(max, track->pat_max);
+		BKE_tracking_marker_pattern_minmax(marker, min, max);
 	}
 
 	dx = size / width / sc->zoom;
@@ -371,22 +379,95 @@
 	return inside;
 }
 
+static int get_mouse_pattern_corner(SpaceClip *sc, MovieTrackingMarker *marker, float co[2], int width, int height)
+{
+	int i, next;
+	float len = FLT_MAX, dx, dy;
+
+	for (i = 0; i < 4; i++) {
+		float cur_len;
+
+		next = (i + 1) % 4;
+
+		cur_len = len_v2v2(marker->pattern_corners[i], marker->pattern_corners[next]);
+
+		len = MIN2(cur_len, len);
+	}
+
+	dx = 6.0f / width / sc->zoom;
+	dy = 6.0f / height / sc->zoom;
+
+	dx = MIN2(dx * 2.0f / 3.0f, len / 6.0f);
+	dy = MIN2(dy * 2.0f / 3.0f, len * width / height / 6.0f);
+
+	for (i = 0; i < 4; i++) {
+		float crn[2];
+		int inside;
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list