Commit 99341249 authored by Andrew Eikum's avatar Andrew Eikum Committed by Alexandre Julliard

dinput: Fix condition effect joystick offset calculation.

parent 2efaddc7
...@@ -67,6 +67,11 @@ static inline LinuxInputEffectImpl *impl_from_IDirectInputEffect(IDirectInputEff ...@@ -67,6 +67,11 @@ static inline LinuxInputEffectImpl *impl_from_IDirectInputEffect(IDirectInputEff
return CONTAINING_RECORD(iface, LinuxInputEffectImpl, IDirectInputEffect_iface); return CONTAINING_RECORD(iface, LinuxInputEffectImpl, IDirectInputEffect_iface);
} }
double ff_effect_direction_to_rad(unsigned int dir)
{
return (dir & 0xffff) * M_PI / 0x8000;
}
/****************************************************************************** /******************************************************************************
* LinuxInputEffectImpl * LinuxInputEffectImpl
*/ */
...@@ -172,8 +177,10 @@ static HRESULT WINAPI LinuxInputEffectImpl_GetParameters( ...@@ -172,8 +177,10 @@ static HRESULT WINAPI LinuxInputEffectImpl_GetParameters(
return diErr; return diErr;
else { else {
if (peff->dwFlags & DIEFF_CARTESIAN) { if (peff->dwFlags & DIEFF_CARTESIAN) {
peff->rglDirection[0] = sin(M_PI * 3 * This->effect.direction / 0x7FFF) * 1000; /* rotate so 0 points right */
peff->rglDirection[1] = cos(M_PI * 3 * This->effect.direction / 0x7FFF) * 1000; double angle = ff_effect_direction_to_rad(This->effect.direction + 0xc000);
peff->rglDirection[0] = sin(angle) * 1000;
peff->rglDirection[1] = -cos(angle) * 1000;
} else { } else {
/* Polar and spherical coordinates are the same for two or less /* Polar and spherical coordinates are the same for two or less
* axes. * axes.
...@@ -505,9 +512,11 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters( ...@@ -505,9 +512,11 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters(
/* One condition block. This needs to be rotated to direction, /* One condition block. This needs to be rotated to direction,
* and expanded to separate x and y conditions. */ * and expanded to separate x and y conditions. */
int i; int i;
double factor[2]; double factor[2], angle;
factor[0] = asin((This->effect.direction * 3.0 * M_PI) / 0x7FFF); /* rotate so 0 points right */
factor[1] = acos((This->effect.direction * 3.0 * M_PI) / 0x7FFF); angle = ff_effect_direction_to_rad(This->effect.direction + 0xc000);
factor[0] = sin(angle);
factor[1] = -cos(angle);
for (i = 0; i < 2; ++i) { for (i = 0; i < 2; ++i) {
This->effect.u.condition[i].center = (int)(factor[i] * (tsp->lOffset / 10) * 32); This->effect.u.condition[i].center = (int)(factor[i] * (tsp->lOffset / 10) * 32);
This->effect.u.condition[i].right_coeff = (int)(factor[i] * (tsp->lPositiveCoefficient / 10) * 32); This->effect.u.condition[i].right_coeff = (int)(factor[i] * (tsp->lPositiveCoefficient / 10) * 32);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment