Rémi Bernon : windows.gaming.input: Implement IConditionForceEffect_SetParameters.
Alexandre Julliard
julliard at winehq.org
Wed May 18 15:38:31 CDT 2022
Module: wine
Branch: master
Commit: 37abfa73f264217cf3499fc04ca0f58d10a9746e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=37abfa73f264217cf3499fc04ca0f58d10a9746e
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Thu May 12 16:03:31 2022 +0200
windows.gaming.input: Implement IConditionForceEffect_SetParameters.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/tests/force_feedback.c | 11 -----------
dlls/windows.gaming.input/condition_effect.c | 20 ++++++++++++++++++--
dlls/windows.gaming.input/force_feedback.c | 13 ++++++++++++-
dlls/windows.gaming.input/provider.idl | 14 ++++++++++++++
4 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/dlls/dinput/tests/force_feedback.c b/dlls/dinput/tests/force_feedback.c
index 6903e490193..05b0ad9c427 100644
--- a/dlls/dinput/tests/force_feedback.c
+++ b/dlls/dinput/tests/force_feedback.c
@@ -5514,23 +5514,13 @@ static void test_windows_gaming_input(void)
.report_id = 4,
.report_len = 12,
.report_buf = {4,0x01,0x00,0x70,0x17,0x7b,0x02,0xe9,0x04,0x4c,0x66,0x7f},
- .todo = TRUE,
},
/* update effect */
- {
- .code = IOCTL_HID_WRITE_REPORT,
- .report_id = 3,
- .report_len = 18,
- .report_buf = {3,0x01,0x03,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x00,0x00,0x00},
- .wine_only = TRUE,
- .todo = TRUE,
- },
{
.code = IOCTL_HID_WRITE_REPORT,
.report_id = 3,
.report_len = 18,
.report_buf = {3,0x01,0x03,0x08,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x99,0x00,0x00,0x00},
- .todo = TRUE,
},
};
struct hid_expect expect_create_constant[] =
@@ -6216,7 +6206,6 @@ static void test_windows_gaming_input(void)
ok( hr == S_OK, "get_Kind returned %#lx\n", hr );
ok( condition_kind == ConditionForceEffectKind_Spring, "got kind %u\n", condition_kind );
hr = IConditionForceEffect_SetParameters( condition_effect, direction, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6 );
- todo_wine
ok( hr == S_OK, "SetParameters returned %#lx\n", hr );
IConditionForceEffect_Release( condition_effect );
diff --git a/dlls/windows.gaming.input/condition_effect.c b/dlls/windows.gaming.input/condition_effect.c
index dccc50bb48f..c3a5a1fcd8b 100644
--- a/dlls/windows.gaming.input/condition_effect.c
+++ b/dlls/windows.gaming.input/condition_effect.c
@@ -110,10 +110,26 @@ static HRESULT WINAPI effect_get_Kind( IConditionForceEffect *iface, ConditionFo
static HRESULT WINAPI effect_SetParameters( IConditionForceEffect *iface, Vector3 direction, FLOAT positive_coeff, FLOAT negative_coeff,
FLOAT max_positive_magnitude, FLOAT max_negative_magnitude, FLOAT deadzone, FLOAT bias )
{
- FIXME( "iface %p, direction %s, positive_coeff %f, negative_coeff %f, max_positive_magnitude %f, max_negative_magnitude %f, deadzone %f, bias %f stub!\n",
+ struct condition_effect *impl = impl_from_IConditionForceEffect( iface );
+ WineForceFeedbackEffectParameters params =
+ {
+ .condition =
+ {
+ .type = WineForceFeedbackEffectType_Condition + impl->kind,
+ .direction = direction,
+ .positive_coeff = positive_coeff,
+ .negative_coeff = negative_coeff,
+ .max_positive_magnitude = max_positive_magnitude,
+ .max_negative_magnitude = max_negative_magnitude,
+ .deadzone = deadzone,
+ .bias = bias,
+ },
+ };
+
+ TRACE( "iface %p, direction %s, positive_coeff %f, negative_coeff %f, max_positive_magnitude %f, max_negative_magnitude %f, deadzone %f, bias %f.\n",
iface, debugstr_vector3( &direction ), positive_coeff, negative_coeff, max_positive_magnitude, max_negative_magnitude, deadzone, bias );
- return E_NOTIMPL;
+ return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, NULL );
}
static const struct IConditionForceEffectVtbl effect_vtbl =
diff --git a/dlls/windows.gaming.input/force_feedback.c b/dlls/windows.gaming.input/force_feedback.c
index 3e6b49ee1aa..dd10f86bd3e 100644
--- a/dlls/windows.gaming.input/force_feedback.c
+++ b/dlls/windows.gaming.input/force_feedback.c
@@ -162,7 +162,18 @@ static HRESULT WINAPI effect_impl_put_Parameters( IWineForceFeedbackEffectImpl *
case WineForceFeedbackEffectType_Condition_Damper:
case WineForceFeedbackEffectType_Condition_Inertia:
case WineForceFeedbackEffectType_Condition_Friction:
- FIXME("stub!\n");
+ impl->repeat_count = 1;
+ impl->condition.lPositiveCoefficient = round( atan( params.condition.positive_coeff ) / M_PI_2 * 10000 );
+ impl->condition.lNegativeCoefficient = round( atan( params.condition.negative_coeff ) / M_PI_2 * 10000 );
+ impl->condition.dwPositiveSaturation = round( params.condition.max_positive_magnitude * 10000 );
+ impl->condition.dwNegativeSaturation = round( params.condition.max_negative_magnitude * 10000 );
+ impl->condition.lDeadBand = round( params.condition.deadzone * 10000 );
+ impl->condition.lOffset = round( params.condition.bias * 10000 );
+ impl->params.dwDuration = -1;
+ impl->params.dwStartDelay = 0;
+ impl->directions[0] = round( params.condition.direction.X * 10000 );
+ impl->directions[1] = round( params.condition.direction.Y * 10000 );
+ impl->directions[2] = round( params.condition.direction.Z * 10000 );
break;
}
diff --git a/dlls/windows.gaming.input/provider.idl b/dlls/windows.gaming.input/provider.idl
index 4aacc43d80e..e7b6e96b8aa 100644
--- a/dlls/windows.gaming.input/provider.idl
+++ b/dlls/windows.gaming.input/provider.idl
@@ -37,6 +37,7 @@ namespace Windows.Gaming.Input.Custom {
typedef enum WineForceFeedbackEffectType WineForceFeedbackEffectType;
typedef struct WineGameControllerState WineGameControllerState;
typedef struct WineGameControllerVibration WineGameControllerVibration;
+ typedef struct WineConditionEffectParameters WineConditionEffectParameters;
typedef struct WineConstantEffectParameters WineConstantEffectParameters;
typedef struct WineRampEffectParameters WineRampEffectParameters;
typedef struct WinePeriodicEffectParameters WinePeriodicEffectParameters;
@@ -92,6 +93,18 @@ namespace Windows.Gaming.Input.Custom {
UINT16 right;
};
+ struct WineConditionEffectParameters
+ {
+ WineForceFeedbackEffectType type;
+ Windows.Foundation.Numerics.Vector3 direction;
+ FLOAT positive_coeff;
+ FLOAT negative_coeff;
+ FLOAT max_positive_magnitude;
+ FLOAT max_negative_magnitude;
+ FLOAT deadzone;
+ FLOAT bias;
+ };
+
struct WineConstantEffectParameters
{
WineForceFeedbackEffectType type;
@@ -137,6 +150,7 @@ namespace Windows.Gaming.Input.Custom {
union WineForceFeedbackEffectParameters
{
WineForceFeedbackEffectType type;
+ WineConditionEffectParameters condition;
WineConstantEffectParameters constant;
WineRampEffectParameters ramp;
WinePeriodicEffectParameters periodic;
More information about the wine-cvs
mailing list