[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46835] branches/soc-2011-tomato/source/ blender: Move search area form track to marker structure

Sergey Sharybin sergey.vfx at gmail.com
Mon May 21 11:19:08 CEST 2012


Revision: 46835
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46835
Author:   nazgul
Date:     2012-05-21 09:19:08 +0000 (Mon, 21 May 2012)
Log Message:
-----------
Move search area form track to marker structure

This allows different markers has different size of search area which
makes it possible to scale search area when doing planar tracking.

Made changes to all related areas such as transformation, tracking,
finally ported marker clamping function, added python bindings for
changed search area and added python API for pattern corners.

TODO: It's still possible to make marker's center go outside of pattern
      corners when translating pattern area or rotating it around median
      point.

Modified Paths:
--------------
    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/blenloader/intern/readfile.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/tracking_ops.c
    branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c
    branches/soc-2011-tomato/source/blender/editors/transform/transform_generics.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_tracking.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2012-05-21 09:00:35 UTC (rev 46834)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2012-05-21 09:19:08 UTC (rev 46835)
@@ -48,7 +48,7 @@
 struct Scene;
 
 void BKE_tracking_init_settings(struct MovieTracking *tracking);
-void BKE_tracking_clamp_track(struct MovieTrackingTrack *track, int event);
+void BKE_tracking_clamp_marker(struct MovieTrackingMarker *marker, int event);
 void BKE_tracking_track_flag(struct MovieTrackingTrack *track, int area, int flag, int clear);
 
 struct MovieTrackingTrack *BKE_tracking_add_track(struct MovieTracking *tracking, struct ListBase *tracksbase,
@@ -76,7 +76,8 @@
                                              float pos[2], int origin[2]);
 struct ImBuf *BKE_tracking_get_search_imbuf(struct ImBuf *ibuf, struct MovieTrackingTrack *track,
                                             struct MovieTrackingMarker *marker);
-struct ImBuf *BKE_tracking_track_mask_get(struct MovieTracking *tracking, struct MovieTrackingTrack *track, int width, int height);
+struct ImBuf *BKE_tracking_track_mask_get(struct MovieTracking *tracking, struct MovieTrackingTrack *track,
+                                          struct MovieTrackingMarker *marker, int width, int height);
 
 void BKE_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track);
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2012-05-21 09:00:35 UTC (rev 46834)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2012-05-21 09:19:08 UTC (rev 46835)
@@ -104,11 +104,10 @@
 	unified_to_pixel(ibuf, frame_pixel_coords, frame_pixel_coords);
 }
 
-static void get_search_origin_frame_pixel(const ImBuf *ibuf, const MovieTrackingTrack *track,
-                                          const MovieTrackingMarker *marker, float frame_pixel[2])
+static void get_search_origin_frame_pixel(const ImBuf *ibuf, const MovieTrackingMarker *marker, float frame_pixel[2])
 {
 	/* Get the lower left coordinate of the search window and snap to pixel coordinates */
-	marker_unified_to_frame_pixel_coordinates(ibuf, marker, track->search_min, frame_pixel);
+	marker_unified_to_frame_pixel_coordinates(ibuf, marker, marker->search_min, frame_pixel);
 	frame_pixel[0] = (int)frame_pixel[0];
 	frame_pixel[1] = (int)frame_pixel[1];
 }
@@ -120,26 +119,24 @@
 	unified_coords[1] = pixel_coords[1] / ibuf->y;
 }
 
-static void marker_unified_to_search_pixel(const ImBuf *ibuf, const MovieTrackingTrack *track,
-                                           const MovieTrackingMarker *marker, const float marker_unified[2],
-                                           float search_pixel[2])
+static void marker_unified_to_search_pixel(const ImBuf *ibuf, const MovieTrackingMarker *marker,
+                                           const float marker_unified[2], float search_pixel[2])
 {
 	float frame_pixel[2];
 	float search_origin_frame_pixel[2];
 
 	marker_unified_to_frame_pixel_coordinates(ibuf, marker, marker_unified, frame_pixel);
-	get_search_origin_frame_pixel(ibuf, track, marker, search_origin_frame_pixel);
+	get_search_origin_frame_pixel(ibuf, marker, search_origin_frame_pixel);
 	sub_v2_v2v2(search_pixel, frame_pixel, search_origin_frame_pixel);
 }
 
-static void search_pixel_to_marker_unified(const ImBuf *ibuf, const MovieTrackingTrack *track,
-                                           const MovieTrackingMarker *marker, const float search_pixel[2],
-                                           float marker_unified[2])
+static void search_pixel_to_marker_unified(const ImBuf *ibuf, const MovieTrackingMarker *marker,
+                                           const float search_pixel[2], float marker_unified[2])
 {
 	float frame_unified[2];
 	float search_origin_frame_pixel[2];
 
-	get_search_origin_frame_pixel(ibuf, track, marker, search_origin_frame_pixel);
+	get_search_origin_frame_pixel(ibuf, marker, search_origin_frame_pixel);
 	add_v2_v2v2(frame_unified, search_pixel, search_origin_frame_pixel);
 	pixel_to_unified(ibuf, frame_unified, frame_unified);
 
@@ -173,34 +170,18 @@
 	BKE_tracking_new_object(tracking, "Camera");
 }
 
-void BKE_tracking_clamp_track(MovieTrackingTrack *track, int event)
+void BKE_tracking_clamp_marker(MovieTrackingMarker *marker, int event)
 {
 	int a;
 	float pat_min[2], pat_max[2];
-	float eff_pat_min[2], eff_pat_max[2];
 
-	/* XXX: currently search area is global, pattern size is per-marker, so we'll need to
-	 *      find maximal size of pattern to clamp search size nicely
-	 */
-	INIT_MINMAX2(pat_min, pat_max);
+	BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
 
-	for (a = 0; a < track->markersnr; a++) {
-		float cur_pat_min[2], cur_pat_max[2];
-
-		BKE_tracking_marker_pattern_minmax(&track->markers[a], cur_pat_min, cur_pat_max);
-
-		DO_MINMAX2(cur_pat_min, pat_min, pat_max);
-		DO_MINMAX2(cur_pat_max, pat_min, pat_max);
-	}
-
-	copy_v2_v2(eff_pat_min, pat_min);
-	copy_v2_v2(eff_pat_max, pat_max);
-
 	if (event == CLAMP_PAT_DIM) {
 		for (a = 0; a < 2; a++) {
 			/* search shouldn't be resized smaller than pattern */
-			track->search_min[a] = MIN2(eff_pat_min[a], track->search_min[a]);
-			track->search_max[a] = MAX2(eff_pat_max[a], track->search_max[a]);
+			marker->search_min[a] = MIN2(pat_min[a], marker->search_min[a]);
+			marker->search_max[a] = MAX2(pat_max[a], marker->search_max[a]);
 		}
 	}
 	else if (event == CLAMP_PAT_POS) {
@@ -208,44 +189,40 @@
 
 		sub_v2_v2v2(dim, pat_max, pat_min);
 
-#if 0
-		/* XXX: needs porting, but we need to know marker here, will be ported after a bit
-		 *      more global refactoring
-		 */
 		for (a = 0; a < 2; a++) {
+			int b;
 			/* pattern shouldn't be moved outside of search */
-			if (eff_pat_min[a] < track->search_min[a]) {
-				track->pat_min[a] = track->search_min[a] - (eff_pat_min[a] - pat_min[a]);
-				track->pat_max[a] = track->pat_min[a] + dim[a];
+			if (pat_min[a] < marker->search_min[a]) {
+				for (b = 0; b < 4; b++)
+					marker->pattern_corners[b][a] += marker->search_min[a] - pat_min[a];
 			}
-			if (eff_pat_max[a] > track->search_max[a]) {
-				track->pat_max[a] = track->search_max[a] - (eff_pat_max[a] - pat_max[a]);
-				track->pat_min[a] = track->pat_max[a] - dim[a];
+			if (pat_max[a] > marker->search_max[a]) {
+				for (b = 0; b < 4; b++)
+					marker->pattern_corners[b][a] -= pat_max[a] - marker->search_max[a];
 			}
 		}
-#endif
 	}
 	else if (event == CLAMP_SEARCH_DIM) {
 		for (a = 0; a < 2; a++) {
 			/* search shouldn't be resized smaller than pattern */
-			track->search_min[a] = MIN2(eff_pat_min[a], track->search_min[a]);
-			track->search_max[a] = MAX2(eff_pat_max[a], track->search_max[a]);
+			marker->search_min[a] = MIN2(pat_min[a], marker->search_min[a]);
+			marker->search_max[a] = MAX2(pat_max[a], marker->search_max[a]);
 		}
 	}
 	else if (event == CLAMP_SEARCH_POS) {
 		float dim[2];
 
-		sub_v2_v2v2(dim, track->search_max, track->search_min);
+		sub_v2_v2v2(dim, marker->search_max, marker->search_min);
 
 		for (a = 0; a < 2; a++) {
 			/* search shouldn't be moved inside pattern */
-			if (track->search_min[a] > eff_pat_min[a]) {
-				track->search_min[a] = eff_pat_min[a];
-				track->search_max[a] = track->search_min[a] + dim[a];
+			if (marker->search_min[a] > pat_min[a]) {
+				marker->search_min[a] = pat_min[a];
+				marker->search_max[a] = marker->search_min[a] + dim[a];
 			}
-			if (track->search_max[a] < eff_pat_max[a]) {
-				track->search_max[a] = eff_pat_max[a];
-				track->search_min[a] = track->search_max[a] - dim[a];
+			if (marker->search_max[a] < pat_max[a]) {
+				marker->search_max[a] = pat_max[a];
+				marker->search_min[a] = marker->search_max[a] - dim[a];
 			}
 		}
 	}
@@ -253,8 +230,8 @@
 		float dim[2];
 		sub_v2_v2v2(dim, pat_max, pat_min);
 		for (a = 0; a < 2; a++) {
-			track->search_min[a] = pat_min[a];
-			track->search_max[a] = pat_max[a];
+			marker->search_min[a] = pat_min[a];
+			marker->search_max[a] = pat_max[a];
 		}
 	}
 }
@@ -324,8 +301,8 @@
 	negate_v2_v2(marker.pattern_corners[2], marker.pattern_corners[0]);
 	negate_v2_v2(marker.pattern_corners[3], marker.pattern_corners[1]);
 
-	copy_v2_v2(track->search_max, search);
-	negate_v2_v2(track->search_min, search);
+	copy_v2_v2(marker.search_max, search);
+	negate_v2_v2(marker.search_min, search);
 
 	BKE_tracking_insert_marker(track, &marker);
 
@@ -1276,13 +1253,13 @@
 	int x, y, w, h;
 	float search_origin[2];
 
-	get_search_origin_frame_pixel(ibuf, track, marker, search_origin);
+	get_search_origin_frame_pixel(ibuf, marker, search_origin);
 
 	x = search_origin[0];
 	y = search_origin[1];
 
-	w = (track->search_max[0] - track->search_min[0]) * ibuf->x;
-	h = (track->search_max[1] - track->search_min[1]) * ibuf->y;
+	w = (marker->search_max[0] - marker->search_min[0]) * ibuf->x;
+	h = (marker->search_max[1] - marker->search_min[1]) * ibuf->y;
 
 	searchibuf = IMB_allocImBuf(w, h, 32, ibuf->rect_float ? IB_rectfloat : IB_rect);
 	searchibuf->profile = ibuf->profile;
@@ -1319,7 +1296,7 @@
 	return NULL;
 }
 
-static void track_mask_gpencil_layer_rasterize(MovieTracking *tracking, MovieTrackingTrack *track,
+static void track_mask_gpencil_layer_rasterize(MovieTracking *tracking, MovieTrackingMarker *marker,
                                                bGPDlayer *layer, ImBuf *ibuf, int width, int height)
 {
 	bGPDframe *frame = layer->frames.first;
@@ -1342,8 +1319,8 @@
 				                               "track mask rasterization points");
 
 				for (i = 0; i < stroke->totpoints; i++, fp += 2) {
-					fp[0] = stroke_points[i].x * width / ibuf->x - track->search_min[0];
-					fp[1] = stroke_points[i].y * height * aspy / ibuf->x - track->search_min[1];
+					fp[0] = stroke_points[i].x * width / ibuf->x - marker->search_min[0];
+					fp[1] = stroke_points[i].y * height * aspy / ibuf->x - marker->search_min[1];
 				}
 
 				PLX_raskterize(mask_points, stroke->totpoints, mask, ibuf->x, ibuf->y);
@@ -1374,19 +1351,20 @@
 	IMB_rect_from_float(ibuf);
 }
 
-ImBuf *BKE_tracking_track_mask_get(MovieTracking *tracking, MovieTrackingTrack *track, int width, int height)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list