Custom Ratio mouse input didn't check for initialization properly, which could lead to NaN values with edge slide.

Also adding missing modal keymaps for some transform operators.
This commit is contained in:
Martin Poirier
2009-11-18 17:14:56 +00:00
parent a90c770286
commit 7f151b0dc6
2 changed files with 32 additions and 23 deletions

View File

@@ -555,7 +555,8 @@ void transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_assign(keymap, "TFM_OT_shrink_fatten");
WM_modalkeymap_assign(keymap, "TFM_OT_tilt");
WM_modalkeymap_assign(keymap, "TFM_OT_trackball");
WM_modalkeymap_assign(keymap, "TFM_OT_mirror");
WM_modalkeymap_assign(keymap, "TFM_OT_edge_slide");
}
@@ -4445,8 +4446,9 @@ void initEdgeSlide(TransInfo *t)
t->customFree = freeSlideVerts;
initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
/* set custom point first if you want value to be initialized by init */
setCustomPoints(t, &t->mouse, sld->end, sld->start);
initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
t->idx_max = 0;
t->num.idx_max = 0;

View File

@@ -165,8 +165,14 @@ void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float ou
void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2])
{
short *data = mi->data;
short *data;
if (mi->data == NULL) {
mi->data = MEM_callocN(sizeof(short) * 4, "custom points");
}
data = mi->data;
data[0] = start[0];
data[1] = start[1];
data[2] = end[0];
@@ -180,28 +186,30 @@ void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[
short *data = mi->data;
short dx, dy;
dx = data[2] - data[0];
dy = data[3] - data[1];
length = (float)sqrtf(dx*dx + dy*dy);
if (mi->precision) {
/* deal with Shift key by adding motion / 10 to motion before shift press */
short 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];
if (data) {
dx = data[2] - data[0];
dy = data[3] - data[1];
distance = (mdx*dx + mdy*dy) / length;
}
else {
short mdx, mdy;
mdx = mval[0] - data[2];
mdy = mval[1] - data[3];
length = (float)sqrtf(dx*dx + dy*dy);
distance = (mdx*dx + mdy*dy) / length;
}
if (mi->precision) {
/* deal with Shift key by adding motion / 10 to motion before shift press */
short 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];
output[0] = distance / length;
distance = (mdx*dx + mdy*dy) / length;
}
else {
short mdx, mdy;
mdx = mval[0] - data[2];
mdy = mval[1] - data[3];
distance = (mdx*dx + mdy*dy) / length;
}
output[0] = distance / length;
}
}
void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
@@ -335,7 +343,6 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
case INPUT_CUSTOM_RATIO:
mi->apply = InputCustomRatio;
t->helpline = HLP_NONE;
mi->data = MEM_callocN(sizeof(short) * 4, "custom points");
break;
case INPUT_NONE:
default: