[#21433] Angular rotation snap issue, final value set is not snapped - SVN 27250 and 2.50A1

Proper fix for this. Moving special mouse input stuff to custom callbacks (this also makes the per transform main functions a bit cleaner).

It also fixes the operator property (value) for shear and warp.
This commit is contained in:
Martin Poirier 2010-03-09 01:19:32 +00:00
parent f03a17d0f9
commit 70efb8d322
3 changed files with 63 additions and 20 deletions

@ -2064,6 +2064,16 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* ************************** WARP *************************** */
void postInputWarp(TransInfo *t, float values[3])
{
mul_v3_fl(values, (float)(M_PI * 2));
if (t->customData) /* non-null value indicates reversed input */
{
negate_v3(values);
}
}
void initWarp(TransInfo *t)
{
float max[3], min[3];
@ -2073,13 +2083,14 @@ void initWarp(TransInfo *t)
t->transform = Warp;
t->handleEvent = handleEventWarp;
setInputPostFct(&t->mouse, postInputWarp);
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 5.0f;
t->snap[2] = 1.0f;
t->snap[1] = 5.0f / 180 * M_PI;
t->snap[2] = 1.0f / 180 * M_PI;
t->num.increment = 1.0f;
@ -2154,13 +2165,8 @@ int Warp(TransInfo *t, short mval[2])
mul_m4_v3(t->viewmat, cursor);
sub_v3_v3v3(cursor, cursor, t->viewmat[3]);
/* amount of degrees for warp */
circumfac = 360.0f * t->values[0];
if (t->customData) /* non-null value indicates reversed input */
{
circumfac *= -1;
}
/* amount of radians for warp */
circumfac = t->values[0];
snapGrid(t, &circumfac);
applyNumInput(&t->num, &circumfac);
@ -2172,13 +2178,17 @@ int Warp(TransInfo *t, short mval[2])
outputNumInput(&(t->num), c);
sprintf(str, "Warp: %s", c);
circumfac = circumfac / 180 * M_PI;
}
else {
/* default header print */
sprintf(str, "Warp: %.3f", circumfac);
sprintf(str, "Warp: %.3f", circumfac * 180 / M_PI);
}
circumfac*= (float)(-M_PI/360.0);
t->values[0] = circumfac;
circumfac /= 2; /* only need 180 on each side to make 360 */
for(i = 0; i < t->total; i++, td++) {
float loc[3];
@ -2225,12 +2235,18 @@ int Warp(TransInfo *t, short mval[2])
/* ************************** SHEAR *************************** */
void postInputShear(TransInfo *t, float values[3])
{
mul_v3_fl(values, 0.05f);
}
void initShear(TransInfo *t)
{
t->mode = TFM_SHEAR;
t->transform = Shear;
t->handleEvent = handleEventShear;
setInputPostFct(&t->mouse, postInputShear);
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE);
t->idx_max = 0;
@ -2281,7 +2297,7 @@ int Shear(TransInfo *t, short mval[2])
copy_m3_m4(persmat, t->viewmat);
invert_m3_m3(persinv, persmat);
value = 0.05f * t->values[0];
value = t->values[0];
snapGrid(t, &value);
@ -2652,6 +2668,8 @@ int ToSphere(TransInfo *t, short mval[2])
else if (ratio > 1)
ratio = 1.0f;
t->values[0] = ratio;
/* header print for NumInput */
if (hasNumInput(&t->num)) {
char c[20];
@ -2696,11 +2714,19 @@ int ToSphere(TransInfo *t, short mval[2])
/* ************************** ROTATION *************************** */
void postInputRotation(TransInfo *t, float values[3])
{
if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
t->con.applyRot(t, NULL, t->axis, values);
}
}
void initRotation(TransInfo *t)
{
t->mode = TFM_ROTATION;
t->transform = Rotation;
setInputPostFct(&t->mouse, postInputRotation);
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
t->ndof.axis = 16;
@ -2973,7 +2999,7 @@ int Rotation(TransInfo *t, short mval[2])
snapGrid(t, &final);
if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
t->con.applyRot(t, NULL, t->axis, &final);
t->con.applyRot(t, NULL, t->axis, NULL);
} else {
/* reset axis if constraint is not set */
negate_v3_v3(t->axis, t->viewinv[2]);
@ -3004,15 +3030,10 @@ int Rotation(TransInfo *t, short mval[2])
sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext);
}
// fixes [#21433] but breaks, typical local axis rotation - campbell
// t->values[0] = final;
t->values[0] = final;
vec_rot_to_mat3( mat, t->axis, final);
// TRANSFORM_FIX_ME
// t->values[0] = final; // used in manipulator
// copy_m3_m3(t->mat, mat); // used in manipulator
applyRotation(t, final, t->axis);
recalcData(t);
@ -5521,6 +5542,7 @@ int TimeSlide(TransInfo *t, short mval[2])
UI_view2d_region_to_view(v2d, t->imval[0], t->imval[0], &sval[0], &sval[1]);
/* t->values[0] stores cval[0], which is the current mouse-pointer location (in frames) */
// XXX Need to be able to repeat this
t->values[0] = cval[0];
/* handle numeric-input stuff */

@ -234,6 +234,7 @@ typedef struct TransData {
typedef struct MouseInput {
void (*apply)(struct TransInfo *, struct MouseInput *, short [2], float [3]);
void (*post)(struct TransInfo *, float [3]);
short imval[2]; /* initial mouse position */
char precision;
@ -632,6 +633,7 @@ int handleMouseInput(struct TransInfo *t, struct MouseInput *mi, struct wmEvent
void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, short mval[2], float output[3]);
void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2]);
void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *, float [3]));
/*********************** Generics ********************************/

@ -225,6 +225,8 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
double dx3 = mval[0] - mi->imval[0];
double dy3 = mval[1] - mi->imval[1];
double *angle = mi->data;
/* use doubles here, to make sure a "1.0" (no rotation) doesnt become 9.999999e-01, which gives 0.02 for acos */
double deler = ((dx1*dx1+dy1*dy1)+(dx2*dx2+dy2*dy2)-(dx3*dx3+dy3*dy3))
/ (2.0 * (A*B?A*B:1.0));
@ -266,7 +268,11 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
mi->imval[1] = mval[1];
}
output[0] += dphi;
*angle += dphi;
printf("angle %.3f\n", *angle);
output[0] = *angle;
}
void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2])
@ -279,6 +285,8 @@ void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2])
mi->imval[0] = mval[0];
mi->imval[1] = mval[1];
mi->post = NULL;
}
static void calcSpringFactor(MouseInput *mi)
@ -314,6 +322,7 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
t->helpline = HLP_SPRING;
break;
case INPUT_ANGLE:
mi->data = MEM_callocN(sizeof(double), "angle accumulator");
mi->apply = InputAngle;
t->helpline = HLP_ANGLE;
break;
@ -354,12 +363,22 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
applyMouseInput(t, mi, mi->imval, t->values);
}
void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *, float [3]))
{
mi->post = post;
}
void applyMouseInput(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
{
if (mi->apply != NULL)
{
mi->apply(t, mi, mval, output);
}
if (mi->post)
{
mi->post(t, output);
}
}
int handleMouseInput(TransInfo *t, MouseInput *mi, wmEvent *event)