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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs