[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59015] branches/soc-2011-tomato/source/ blender/editors/space_clip/tracking_ops.c: Prevent plane tracks from being concave

Sergey Sharybin sergey.vfx at gmail.com
Thu Aug 8 09:39:02 CEST 2013


Revision: 59015
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59015
Author:   nazgul
Date:     2013-08-08 07:39:02 +0000 (Thu, 08 Aug 2013)
Log Message:
-----------
Prevent plane tracks from being concave

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c

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	2013-08-08 07:38:56 UTC (rev 59014)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c	2013-08-08 07:39:02 UTC (rev 59015)
@@ -4596,6 +4596,7 @@
 	MovieTrackingPlaneTrack *plane_track;
 	MovieTrackingPlaneMarker *plane_marker;
 	int width, height;
+	int corner_index;
 	float *corner;
 	int previous_mval[2];
 	float previous_corner[2];
@@ -4697,6 +4698,7 @@
 		customdata->previous_mval[0] = event->mval[0];
 		customdata->previous_mval[1] = event->mval[1];
 
+		customdata->corner_index = corner;
 		customdata->corner = plane_marker->corners[corner];
 
 		copy_v2_v2(customdata->previous_corner, customdata->corner);
@@ -4754,6 +4756,9 @@
 	MovieClip *clip = ED_space_clip_get_clip(sc);
 	SlidePlaneMarkerData *data = (SlidePlaneMarkerData *) op->customdata;
 	float dx, dy, mdelta[2];
+	int next_corner_index, prev_corner_index, diag_corner_index;
+	float *next_corner, *prev_corner, *diag_corner;
+	float next_edge[2], prev_edge[2], next_diag_edge[2], prev_diag_edge[2];
 
 	switch (event->type) {
 		case LEFTCTRLKEY:
@@ -4776,10 +4781,51 @@
 				dy /= 5.0f;
 			}
 
-			/* TODO(sergey): Add concave check here. */
 			data->corner[0] = data->previous_corner[0] + dx;
 			data->corner[1] = data->previous_corner[1] + dy;
 
+
+			/*
+			                               prev_edge
+			    (Corner 3, current) <-----------------------   (Corner 2, previous)
+			            |                                              ^
+			            |                                              |
+			            |                                              |
+			            |                                              |
+			  next_edge |                                              | next_diag_edge
+			            |                                              |
+			            |                                              |
+			            |                                              |
+			            v                                              |
+			     (Corner 0, next)   ----------------------->   (Corner 1, diagonal)
+			                              prev_diag_edge
+			 */
+
+			next_corner_index = (data->corner_index + 1) % 4;
+			prev_corner_index = (data->corner_index + 3) % 4;
+			diag_corner_index = (data->corner_index + 2) % 4;
+
+			next_corner = data->plane_marker->corners[next_corner_index];
+			prev_corner = data->plane_marker->corners[prev_corner_index];
+			diag_corner = data->plane_marker->corners[diag_corner_index];
+
+			sub_v2_v2v2(next_edge, next_corner, data->corner);
+			sub_v2_v2v2(prev_edge, data->corner, prev_corner);
+			sub_v2_v2v2(next_diag_edge, prev_corner, diag_corner);
+			sub_v2_v2v2(prev_diag_edge, diag_corner, next_corner);
+
+			if (cross_v2v2(prev_edge, next_edge) < 0.0f) {
+				closest_to_line_v2(data->corner, data->corner, prev_corner, next_corner);
+			}
+
+			if (cross_v2v2(next_diag_edge, prev_edge) < 0.0f) {
+				closest_to_line_v2(data->corner, data->corner, prev_corner, diag_corner);
+			}
+
+			if (cross_v2v2(next_edge, prev_diag_edge) < 0.0f) {
+				closest_to_line_v2(data->corner, data->corner, next_corner, diag_corner);
+			}
+
 			data->previous_mval[0] = event->mval[0];
 			data->previous_mval[1] = event->mval[1];
 			copy_v2_v2(data->previous_corner, data->corner);




More information about the Bf-blender-cvs mailing list