Commit: e6abc3ad5751a272930841757e588bc25ce0bde7
Author: Campbell Barton
Date:   Fri Oct 30 17:31:07 2015 +1100
Branches: master
https://developer.blender.org/rBe6abc3ad5751a272930841757e588bc25ce0bde7

Transform: Support storing virtual cursor location

Grabbing now doesn't 'jump' when shift is released (matching rotation modes).

This simplifies most logic for transform input,
where mouse input callbacks can choose to use the 'virtual' cursor,
which accounts for precision when shift is held.

===================================================================

M       source/blender/editors/transform/transform.c
M       source/blender/editors/transform/transform.h
M       source/blender/editors/transform/transform_input.c

===================================================================

diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index 6d0e859..86d97e9 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -313,7 +313,7 @@ static void convertViewVec2D_mask(View2D *v2d, float 
r_vec[3], int dx, int dy)
        r_vec[2] = 0.0f;
 }
 
-void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy)
+void convertViewVec(TransInfo *t, float r_vec[3], double dx, double dy)
 {
        if ((t->spacetype == SPACE_VIEW3D) && (t->ar->regiontype == 
RGN_TYPE_WINDOW)) {
                if (t->options & CTX_PAINT_CURVE) {
@@ -7605,12 +7605,17 @@ static void applyBakeTime(TransInfo *t, const int 
mval[2])
 
        float fac = 0.1f;
 
+       /* XXX, disable precission for now,
+        * this isn't even accessible by the user */
+#if 0
        if (t->mouse.precision) {
                /* calculate ratio for shiftkey pos, and for total, and blend 
these for precision */
                time = (float)(t->center2d[0] - t->mouse.precision_mval[0]) * 
fac;
                time += 0.1f * ((float)(t->center2d[0] * fac - mval[0]) - time);
        }
-       else {
+       else
+#endif
+       {
                time = (float)(t->center2d[0] - mval[0]) * fac;
        }
 
diff --git a/source/blender/editors/transform/transform.h 
b/source/blender/editors/transform/transform.h
index d4e1b3f..bd5d043 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -326,15 +326,29 @@ typedef struct TransData {
 } TransData;
 
 typedef struct MouseInput {
-       void    (*apply)(struct TransInfo *t, struct MouseInput *mi, const int 
mval[2], float output[3]);
+       void    (*apply)(struct TransInfo *t, struct MouseInput *mi, const 
double mval[2], float output[3]);
        void    (*post)(struct TransInfo *t, float values[3]);
 
        int     imval[2];               /* initial mouse position               
 */
        bool    precision;
-       int     precision_mval[2];      /* mouse position when precision key 
was pressed */
+       float   precision_factor;
        float   center[2];
        float   factor;
        void    *data; /* additional data, if needed by the particular function 
*/
+
+       /**
+        * Use virtual cursor, which takes precission into account
+        * keeping track of the cursors 'virtual' location,
+        * to avoid jumping values when its toggled.
+        *
+        * This works well for scaling drag motion,
+        * but not for rotating around a point (rotaton needs its own custom 
accumulator)
+        */
+       bool use_virtual_mval;
+       struct {
+               double prev[2];
+               double accum[2];
+       } virtual_mval;
 } MouseInput;
 
 typedef struct TransInfo {
@@ -549,7 +563,7 @@ int  transformEnd(struct bContext *C, TransInfo *t);
 
 void setTransformViewMatrices(TransInfo *t);
 void setTransformViewAspect(TransInfo *t, float r_aspect[3]);
-void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy);
+void convertViewVec(TransInfo *t, float r_vec[3], double dx, double dy);
 void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const 
eV3DProjTest flag);
 void projectIntView(TransInfo *t, const float vec[3], int adr[2]);
 void projectFloatViewEx(TransInfo *t, const float vec[3], float adr[2], const 
eV3DProjTest flag);
diff --git a/source/blender/editors/transform/transform_input.c 
b/source/blender/editors/transform/transform_input.c
index a18be8f..16ce0cd 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -39,54 +39,26 @@
 
 #include "MEM_guardedalloc.h" 
 
-struct InputTrackBall_Data {
-       float value_accum[2];
-       float value_prev[2];
-};
-
 /* ************************** INPUT FROM MOUSE *************************** */
 
-static void InputVector(TransInfo *t, MouseInput *mi, const int mval[2], float 
output[3])
+static void InputVector(TransInfo *t, MouseInput *mi, const double mval[2], 
float output[3])
 {
-       float vec[3], dvec[3];
-       if (mi->precision) {
-               /* calculate the main translation and the precise one separate 
*/
-               convertViewVec(t, dvec, (mval[0] - mi->precision_mval[0]), 
(mval[1] - mi->precision_mval[1]));
-               mul_v3_fl(dvec, 0.1f);
-               convertViewVec(t, vec, (mi->precision_mval[0] - 
t->mouse.imval[0]), (mi->precision_mval[1] - t->mouse.imval[1]));
-               add_v3_v3v3(output, vec, dvec);
-       }
-       else {
-               convertViewVec(t, output, (mval[0] - t->mouse.imval[0]), 
(mval[1] - t->mouse.imval[1]));
-       }
-
+       convertViewVec(t, output, mval[0] - mi->imval[0], mval[1] - 
mi->imval[1]);
 }
 
-static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, const int 
mval[2], float output[3])
+static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, const double 
mval[2], float output[3])
 {
-       float ratio, precise_ratio, dx, dy;
-       if (mi->precision) {
-               /* calculate ratio for shiftkey pos, and for total, and blend 
these for precision */
-               dx = (float)(mi->center[0] - mi->precision_mval[0]);
-               dy = (float)(mi->center[1] - mi->precision_mval[1]);
-               ratio = hypotf(dx, dy);
-
-               dx = (float)(mi->center[0] - mval[0]);
-               dy = (float)(mi->center[1] - mval[1]);
-               precise_ratio = hypotf(dx, dy);
+       double dx, dy;
+       float ratio;
 
-               ratio = (ratio + (precise_ratio - ratio) / 10.0f) / mi->factor;
-       }
-       else {
-               dx = (float)(mi->center[0] - mval[0]);
-               dy = (float)(mi->center[1] - mval[1]);
-               ratio = hypotf(dx, dy) / mi->factor;
-       }
+       dx = (mi->center[0] - mval[0]);
+       dy = (mi->center[1] - mval[1]);
+       ratio = hypot(dx, dy) / mi->factor;
 
        output[0] = ratio;
 }
 
-static void InputSpringFlip(TransInfo *t, MouseInput *mi, const int mval[2], 
float output[3])
+static void InputSpringFlip(TransInfo *t, MouseInput *mi, const double 
mval[2], float output[3])
 {
        InputSpring(t, mi, mval, output);
 
@@ -99,51 +71,29 @@ static void InputSpringFlip(TransInfo *t, MouseInput *mi, 
const int mval[2], flo
        }
 }
 
-static void InputSpringDelta(TransInfo *t, MouseInput *mi, const int mval[2], 
float output[3])
+static void InputSpringDelta(TransInfo *t, MouseInput *mi, const double 
mval[2], float output[3])
 {
        InputSpring(t, mi, mval, output);
        output[0] -= 1.0f;
 }
 
-static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, const int 
mval[2], float output[3])
+static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, const double 
mval[2], float output[3])
 {
-       struct InputTrackBall_Data *data = mi->data;
-       float dxy[2];
-       float dxy_accum[2];
+       output[0] = (float)(mi->imval[1] - mval[1]);
+       output[1] = (float)(mval[0] - mi->imval[0]);
 
-       dxy[0] = (mi->imval[1] - mval[1]);
-       dxy[1] = (mval[0] - mi->imval[0]);
-
-       sub_v2_v2v2(dxy_accum, dxy, data->value_prev);
-
-       add_v2_v2(data->value_prev, dxy_accum);
-
-       if (mi->precision) {
-               mul_v2_fl(dxy_accum, 1.0f / 30.0f);
-       }
-
-       add_v2_v2(data->value_accum, dxy_accum);
-       mul_v2_v2fl(output, data->value_accum, mi->factor);
+       output[0] *= mi->factor;
+       output[1] *= mi->factor;
 }
 
-static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, const int 
mval[2], float output[3])
+static void InputHorizontalRatio(TransInfo *t, MouseInput *UNUSED(mi), const 
double mval[2], float output[3])
 {
-       float x, pad;
-
-       pad = t->ar->winx / 10;
-
-       if (mi->precision) {
-               /* deal with Shift key by adding motion / 10 to motion before 
shift press */
-               x = mi->precision_mval[0] + (float)(mval[0] - 
mi->precision_mval[0]) / 10.0f;
-       }
-       else {
-               x = mval[0];
-       }
+       const float pad = t->ar->winx / 10;
 
-       output[0] = (x - pad) / (t->ar->winx - 2 * pad);
+       output[0] = (mval[0] - pad) / (t->ar->winx - 2 * pad);
 }
 
-static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, const int 
mval[2], float output[3])
+static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, const double 
mval[2], float output[3])
 {
        float vec[3];
 
@@ -153,24 +103,14 @@ static void InputHorizontalAbsolute(TransInfo *t, 
MouseInput *mi, const int mval
        output[0] = dot_v3v3(t->viewinv[0], vec) * 2.0f;
 }
 
-static void InputVerticalRatio(TransInfo *t, MouseInput *mi, const int 
mval[2], float output[3])
+static void InputVerticalRatio(TransInfo *t, MouseInput *UNUSED(mi), const 
double mval[2], float output[3])
 {
-       float y, pad;
+       const float pad = t->ar->winy / 10;
 
-       pad = t->ar->winy / 10;
-
-       if (mi->precision) {
-               /* deal with Shift key by adding motion / 10 to motion before 
shift press */
-               y = mi->precision_mval[1] + (float)(mval[1] - 
mi->precision_mval[1]) / 10.0f;
-       }
-       else {
-               y = mval[0];
-       }
-
-       output[0] = (y - pad) / (t->ar->winy - 2 * pad);
+       output[0] = (mval[1] - pad) / (t->ar->winy - 2 * pad);
 }
 
-static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, const int 
mval[2], float output[3])
+static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, const double 
mval[2], float output[3])
 {
        float vec[3];
 
@@ -194,7 +134,7 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, 
const int mval_start[
        data[3] = mval_end[1];
 }
 
-static void InputCustomRatioFlip(TransInfo *UNUSED(t), MouseInput *mi, const 
int mval[2], float output[3])
+static void InputCustomRatioFlip(TransInfo *UNUSED(t), MouseInput *mi, const 
double mval[2], float output[3])
 {
        double length;
        double distance;
@@ -202,38 +142,28 @@ static void InputCustomRatioFlip(TransInfo *UNUSED(t), 
MouseInput *mi, const int
        const int *data = mi->data;
        
        if (data) {
+               int mdx, mdy;
                dx = data[2] - data[0];
                dy = data[3] - data[1];
-               
+
                length = hypot(dx, dy);
-               
-               if (mi->precision) {
-                       /* deal with Shift key by adding motion / 10 to motion 
before shift press */
-                       int mdx, mdy;
-                       mdx = (mi->precision_mval[0] + (float)(mval[0] - 
mi->precision_mval[0]) / 10.0f) - data[2];
-                       mdy = (mi->precision_mval[1] + (float)(mval[1] - 
mi->precision_mval[1]) / 10.0f) - data[3];
 
-                       distance = (length != 0.0) ? (mdx * dx + mdy * dy) / 
length : 0.0;
-               }
-               else {
-                       int mdx, mdy;
-                       mdx = mval[0] - data[2];
-                       mdy = mval[1] - data[3];
+               mdx = mval[0] - data[2];
+               mdy = mval[1] - data[3];
 
-                       distance = (length != 0.0) ? (mdx * dx + mdy * dy) / 
length : 0.0;
-               }
+               distance = (length != 0.0) ? (mdx * dx + mdy * dy) / length : 
0.0;
 
                output[0] = (length != 0.0) ? (double)(distance / length) : 0.0;
        }
 }
 
-static void InputCustomRatio(TransInfo *t, MouseInput *mi, const int mval[2], 
float output[3])
+static void InputCustomRatio(TransInfo *t, MouseInput *mi, const double 
mval[2], float output[3])
 {
        InputCustomRatioFlip(t, mi, mva

@@ 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