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

Reply via email to