Revision: 47974
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47974
Author: nazgul
Date: 2012-06-15 18:31:46 +0000 (Fri, 15 Jun 2012)
Log Message:
-----------
Changed behavior of how pattern is controlling by mouse:
- Removed scaling option which used to be Ctrl+Slide of individual
pattern corner.
- Added extra rectangle area which is being drawing around pattern
and which supports the following things:
* Slide by it's left upper corner would define offset of marker
* Slide by it's right bottom corner would scale overall pattern
- Added extra handle which is drawing from pattern center and which
is being used to define scale and rotation of pattern area.
Modified Paths:
--------------
trunk/blender/source/blender/editors/space_clip/clip_draw.c
trunk/blender/source/blender/editors/space_clip/tracking_ops.c
Modified: trunk/blender/source/blender/editors/space_clip/clip_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/clip_draw.c 2012-06-15
18:15:27 UTC (rev 47973)
+++ trunk/blender/source/blender/editors/space_clip/clip_draw.c 2012-06-15
18:31:46 UTC (rev 47974)
@@ -812,6 +812,9 @@
if ((sc->flag & SC_SHOW_MARKER_PATTERN) && ((track->pat_flag & SELECT)
== sel || outline)) {
int i;
+ float pat_min[2], pat_max[2];
+ float dx = 12.0f / width, dy = 12.0f / height;
+ float tilt_ctrl[2];
if (!outline) {
if (track->pat_flag & SELECT)
@@ -825,6 +828,37 @@
draw_marker_slide_square(marker->pattern_corners[i][0],
marker->pattern_corners[i][1],
patdx / 1.5f, patdy / 1.5f,
outline, px);
}
+
+ /* ** sliders to control overall pattern ** */
+ add_v2_v2v2(tilt_ctrl, marker->pattern_corners[1],
marker->pattern_corners[2]);
+
+ BKE_tracking_marker_pattern_minmax(marker, pat_min, pat_max);
+
+ glEnable(GL_LINE_STIPPLE);
+ glLineStipple(3, 0xaaaa);
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(pat_min[0] - dx, pat_min[1] - dy);
+ glVertex2f(pat_max[0] + dx, pat_min[1] - dy);
+ glVertex2f(pat_max[0] + dx, pat_max[1] + dy);
+ glVertex2f(pat_min[0] - dx, pat_max[1] + dy);
+ glEnd();
+
+ glBegin(GL_LINES);
+ glVertex2f(0.0f, 0.0f);
+ glVertex2fv(tilt_ctrl);
+ glEnd();
+
+ glDisable(GL_LINE_STIPPLE);
+
+ /* marker's offset slider */
+ draw_marker_slide_square(pat_min[0] - dx, pat_max[1] + dy,
patdx, patdy, outline, px);
+
+ /* pattern re-sizing triangle */
+ draw_marker_slide_triangle(pat_max[0] + dx, pat_min[1] - dy,
patdx, patdy, outline, px);
+
+ /* slider to control pattern tilt */
+ draw_marker_slide_square(tilt_ctrl[0], tilt_ctrl[1], patdx,
patdy, outline, px);
}
glPopMatrix();
Modified: trunk/blender/source/blender/editors/space_clip/tracking_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/tracking_ops.c
2012-06-15 18:15:27 UTC (rev 47973)
+++ trunk/blender/source/blender/editors/space_clip/tracking_ops.c
2012-06-15 18:31:46 UTC (rev 47974)
@@ -249,9 +249,10 @@
/********************** slide marker operator *********************/
-#define SLIDE_ACTION_POS 0
-#define SLIDE_ACTION_SIZE 1
-#define SLIDE_ACTION_OFFSET 2
+#define SLIDE_ACTION_POS 0
+#define SLIDE_ACTION_SIZE 1
+#define SLIDE_ACTION_OFFSET 2
+#define SLIDE_ACTION_TILT_SIZE 3
typedef struct {
short area, action;
@@ -263,7 +264,7 @@
float *min, *max, *pos, *offset, (*corners)[2];
float spos[2];
- short lock, accurate, scale;
+ short lock, accurate;
/* data to restore on cancel */
float old_search_min[2], old_search_max[2], old_pos[2], old_offset[2];
@@ -271,6 +272,12 @@
float (*old_markers)[2];
} SlideMarkerData;
+static void slide_marker_tilt_slider(MovieTrackingMarker *marker, float
slider[2])
+{
+ add_v2_v2v2(slider, marker->pattern_corners[1],
marker->pattern_corners[2]);
+ add_v2_v2(slider, marker->pos);
+}
+
static SlideMarkerData *create_slide_marker_data(SpaceClip *sc,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
wmEvent *event,
int area, int corner, int
action, int width, int height)
@@ -308,6 +315,10 @@
data->pos = marker->pattern_corners[corner];
copy_v2_v2(data->spos, data->pos);
}
+ else if (action == SLIDE_ACTION_TILT_SIZE) {
+ data->corners = marker->pattern_corners;
+ slide_marker_tilt_slider(marker, data->spos);
+ }
}
else if (area == TRACK_AREA_SEARCH) {
data->min = marker->search_min;
@@ -333,13 +344,14 @@
return data;
}
-static int mouse_on_corner(SpaceClip *sc, MovieTrackingMarker *marker,
- int area, float co[2], int corner, int width, int
height)
+static int mouse_on_slide_zone(SpaceClip *sc, MovieTrackingMarker *marker,
+ int area, float co[2], float slide_zone[2],
+ float padding, int width, int height)
{
+ const float size = 12.0f;
int inside = 0;
- float size = 12.0f;
float min[2], max[2];
- float crn[2], dx, dy, tdx, tdy;
+ float dx, dy;
if (area == TRACK_AREA_SEARCH) {
copy_v2_v2(min, marker->search_min);
@@ -349,29 +361,52 @@
BKE_tracking_marker_pattern_minmax(marker, min, max);
}
+ min[0] -= padding / width;
+ min[1] -= padding / height;
+ max[0] += padding / width;
+ max[1] += padding / height;
+
dx = size / width / sc->zoom;
dy = size / height / sc->zoom;
- tdx = 5.0f / width / sc->zoom;
- tdy = 5.0f / height / sc->zoom;
+ dx = MIN2(dx, (max[0] - min[0]) / 6.0f);
+ dy = MIN2(dy, (max[1] - min[1]) / 6.0f);
- dx = MIN2(dx, (max[0] - min[0]) / 6.0f) + tdx;
- dy = MIN2(dy, (max[1] - min[1]) / 6.0f) + tdy;
+ return IN_RANGE_INCL(co[0], slide_zone[0] - dx, slide_zone[0] + dx) &&
+ IN_RANGE_INCL(co[1], slide_zone[1] - dy, slide_zone[1] + dy);
+ return inside;
+}
+
+static int mouse_on_corner(SpaceClip *sc, MovieTrackingMarker *marker,
+ int area, float co[2], int corner, float padding,
+ int width, int height)
+{
+ float min[2], max[2], crn[2];
+
+ if (area == TRACK_AREA_SEARCH) {
+ copy_v2_v2(min, marker->search_min);
+ copy_v2_v2(max, marker->search_max);
+ }
+ else {
+ BKE_tracking_marker_pattern_minmax(marker, min, max);
+ }
+
+ min[0] -= padding / width;
+ min[1] -= padding / height;
+ max[0] += padding / width;
+ max[1] += padding / height;
+
if (corner == 0) {
crn[0] = marker->pos[0] + max[0];
crn[1] = marker->pos[1] + min[1];
-
- inside = co[0] >= crn[0] - dx && co[0] <= crn[0] + tdx && co[1]
>= crn[1] - tdy && co[1] <= crn[1] + dy;
}
else {
crn[0] = marker->pos[0] + min[0];
crn[1] = marker->pos[1] + max[1];
-
- inside = co[0] >= crn[0] - dx && co[0] <= crn[0] + dx && co[1]
>= crn[1] - dy && co[1] <= crn[1] + dy;
}
- return inside;
+ return mouse_on_slide_zone(sc, marker, area, co, crn, padding, width,
height);
}
static int get_mouse_pattern_corner(SpaceClip *sc, MovieTrackingMarker
*marker, float co[2], int width, int height)
@@ -389,11 +424,11 @@
len = MIN2(cur_len, len);
}
- dx = 6.0f / width / sc->zoom;
- dy = 6.0f / height / sc->zoom;
+ dx = 12.0f / width / sc->zoom;
+ dy = 12.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);
+ dx = MIN2(dx, len * 2.0f / 3.0f);
+ dy = MIN2(dy, len * width / height * 2.0f / 3.0f);
for (i = 0; i < 4; i++) {
float crn[2];
@@ -430,6 +465,15 @@
return co[0] >= pos[0] - dx && co[0] <= pos[0] + dx && co[1] >= pos[1]
- dy && co[1] <= pos[1] + dy;
}
+static int mouse_on_tilt(SpaceClip *sc, MovieTrackingMarker *marker, float
co[2], int width, int height)
+{
+ float slider[2];
+
+ slide_marker_tilt_slider(marker, slider);
+
+ return mouse_on_slide_zone(sc, marker, TRACK_AREA_PAT, co, slider,
0.0f, width, height);
+}
+
static int slide_check_corners(float (*corners)[2])
{
int i, next, prev;
@@ -509,12 +553,12 @@
}
if (!ok && (sc->flag & SC_SHOW_MARKER_SEARCH)) {
- if (mouse_on_corner(sc, marker,
TRACK_AREA_SEARCH, co, 1, width, height)) {
+ if (mouse_on_corner(sc, marker,
TRACK_AREA_SEARCH, co, 1, 0.0f, width, height)) {
area = TRACK_AREA_SEARCH;
action = SLIDE_ACTION_OFFSET;
ok = TRUE;
}
- else if (mouse_on_corner(sc, marker,
TRACK_AREA_SEARCH, co, 0, width, height)) {
+ else if (mouse_on_corner(sc, marker,
TRACK_AREA_SEARCH, co, 0, 0.0f, width, height)) {
area = TRACK_AREA_SEARCH;
action = SLIDE_ACTION_SIZE;
ok = TRUE;
@@ -522,30 +566,30 @@
}
if (!ok && (sc->flag & SC_SHOW_MARKER_PATTERN))
{
- /* 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 current_corner =
get_mouse_pattern_corner(sc, marker, co, width, height);
+ int current_corner =
get_mouse_pattern_corner(sc, marker, co, width, height);
- if (current_corner != -1) {
- area = TRACK_AREA_PAT;
- action =
SLIDE_ACTION_POS;
- corner = current_corner;
- ok = TRUE;
- }
+ if (current_corner != -1) {
+ area = TRACK_AREA_PAT;
+ action = SLIDE_ACTION_POS;
+ corner = current_corner;
+ ok = TRUE;
}
else {
- if (mouse_on_corner(sc, marker,
TRACK_AREA_PAT, co, 1, width, height)) {
+ if (mouse_on_corner(sc, marker,
TRACK_AREA_PAT, co, 1, 12.0f, width, height)) {
area = TRACK_AREA_PAT;
action =
SLIDE_ACTION_OFFSET;
ok = TRUE;
}
-
- if (!ok && mouse_on_corner(sc,
marker, TRACK_AREA_PAT, co, 0, width, height)) {
+ if (!ok && mouse_on_corner(sc,
marker, TRACK_AREA_PAT, co, 0, 12.0f, width, height)) {
area = TRACK_AREA_PAT;
action =
SLIDE_ACTION_SIZE;
ok = TRUE;
}
+ if (!ok && mouse_on_tilt(sc,
marker, co, width, height)) {
+ area = TRACK_AREA_PAT;
+ action =
SLIDE_ACTION_TILT_SIZE;
+ ok = TRUE;
+ }
}
}
@@ -663,10 +707,6 @@
if (ELEM(event->type, LEFTCTRLKEY,
RIGHTCTRLKEY))
data->lock = event->val == KM_RELEASE;
- if (data->action == SLIDE_ACTION_POS)
- if (ELEM(event->type, LEFTCTRLKEY,
RIGHTCTRLKEY))
- data->scale = event->val == KM_PRESS;
-
if (ELEM(event->type, LEFTSHIFTKEY, RIGHTSHIFTKEY))
data->accurate = event->val == KM_PRESS;
@@ -703,18 +743,40 @@
}
else if (data->area == TRACK_AREA_PAT) {
if (data->action == SLIDE_ACTION_SIZE) {
- data->corners[0][0] =
data->old_corners[0][0] - dx;
- data->corners[0][1] =
data->old_corners[0][1] + dy;
+ float start[2], end[2];
+ float scale;
- data->corners[1][0] =
data->old_corners[1][0] + dx;
- data->corners[1][1] =
data->old_corners[1][1] + dy;
+ ED_clip_point_stable_pos(C,
data->mval[0], data->mval[1], &start[0], &start[1]);
- data->corners[2][0] =
data->old_corners[2][0] + dx;
- data->corners[2][1] =
data->old_corners[2][1] - dy;
+ sub_v2_v2(start, data->old_pos);
- data->corners[3][0] =
data->old_corners[3][0] - dx;
- data->corners[3][1] =
data->old_corners[3][1] - dy;
+ if (len_v2(start) > 0.0f) {
+ float mval[2];
+ if (data->accurate) {
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs