3 #if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP || SILICONSTUDIO_PLATFORM_WINDOWS_STORE
5 using System.Collections.Generic;
9 namespace SiliconStudio.
Paradox.Input
11 public partial class InputManager
16 private class XInputGamePadFactory : GamePadFactory
18 private const int XInputGamePadCount = 4;
20 private static readonly Guid[] ControllerGuids =
new Guid[XInputGamePadCount];
22 private readonly Controller[] controllers;
27 static XInputGamePadFactory()
30 for (
int i = 0; i < XInputGamePadCount; i++)
32 ControllerGuids[i] =
new Guid(i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
36 public XInputGamePadFactory()
38 controllers =
new Controller[XInputGamePadCount];
39 for (
int i = 0; i < controllers.Length; i++)
41 controllers[i] =
new Controller((UserIndex)i);
51 var toto = controllers[0].IsConnected;
53 catch (DllNotFoundException ex)
55 for (
int i = 0; i < XInputGamePadCount; i++)
56 controllers[i] = null;
58 Logger.Warning(
"XInput dll was not found on the computer. GamePad detection will not fully work for the current game instance. " +
59 "To fix the problem, please install or repair DirectX installation. [Exception details: {0}]", ex.Message);
65 foreach (var xinputController
in controllers)
67 if (xinputController.IsConnected)
68 yield
return new GamePadKey(ControllerGuids[(
int)xinputController.UserIndex],
this);
72 public override GamePad GetGamePad(Guid guid)
74 for (
int i = 0; i < XInputGamePadCount; i++)
76 if (controllers[i] != null && ControllerGuids[i] == guid)
78 return new XInputGamePad(controllers[i],
new GamePadKey(guid,
this));
88 private class XInputGamePad :
GamePad
90 #region Constants and Fields
92 private Controller instance;
96 public XInputGamePad(Controller instance, GamePadKey key) : base(key)
98 this.instance = instance;
101 public override void Dispose()
106 public override GamePadState GetState()
108 var gamePadState =
new GamePadState();
111 if (instance.GetState(out xinputState))
113 gamePadState.IsConnected =
true;
114 gamePadState.Buttons = (
GamePadButton)xinputState.Gamepad.Buttons;
116 gamePadState.LeftTrigger = xinputState.Gamepad.LeftTrigger / 255.0f;
117 gamePadState.RightTrigger = xinputState.Gamepad.RightTrigger / 255.0f;
119 gamePadState.LeftThumb.X = ClampDeadZone(xinputState.Gamepad.LeftThumbX / 32768.0f, Gamepad.LeftThumbDeadZone / 32768.0f);
120 gamePadState.LeftThumb.Y = ClampDeadZone(xinputState.Gamepad.LeftThumbY / 32768.0f, Gamepad.LeftThumbDeadZone / 32768.0f);
122 gamePadState.RightThumb.X = ClampDeadZone(xinputState.Gamepad.RightThumbX / 32768.0f, Gamepad.RightThumbDeadZone / 32768.0f);
123 gamePadState.RightThumb.Y = ClampDeadZone(xinputState.Gamepad.RightThumbY / 32768.0f, Gamepad.RightThumbDeadZone / 32768.0f);