4 #if SILICONSTUDIO_PLATFORM_WINDOWS_DESKTOP
7 using System.Diagnostics;
9 using System.Windows.Forms;
11 using SiliconStudio.Core;
12 using SiliconStudio.Paradox.Games;
15 namespace SiliconStudio.
Paradox.Input
17 public partial class InputManager
20 private Stopwatch pointerClock;
28 pointerClock =
new Stopwatch();
30 GamePadFactories.Add(
new XInputGamePadFactory());
31 GamePadFactories.Add(
new DirectInputGamePadFactory());
34 public override void Initialize()
38 switch (Game.Context.ContextType)
40 case AppContextType.Desktop:
41 InitializeFromWindowsForms(Game.Context);
43 case AppContextType.DesktopWpf:
44 InitializeFromWindowsWpf(Game.Context);
46 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_OPENGL
47 case AppContextType.DesktopOpenTK:
48 InitializeFromOpenTK(Game.Context);
52 throw new ArgumentException(
string.Format(
"WindowContext [{0}] not supported", Game.Context.ContextType));
59 private void InitializeFromWindowsForms(GameContext uiContext)
61 uiControl = (
Control) uiContext.Control;
63 pointerClock.Restart();
65 BindRawInputKeyboard(uiControl);
67 uiControl.MouseEnter += (_, e) => uiControl.Focus();
68 uiControl.MouseMove += (_, e) => OnMouseMoveEvent(
new Vector2(e.X, e.Y));
69 uiControl.MouseDown += (_, e) => OnMouseInputEvent(
new Vector2(e.X, e.Y), ConvertMouseButton(e.Button), InputEventType.Down);
70 uiControl.MouseUp += (_, e) => OnMouseInputEvent(
new Vector2(e.X, e.Y), ConvertMouseButton(e.Button), InputEventType.Up);
71 uiControl.MouseWheel += (_, e) => OnMouseInputEvent(
new Vector2(e.X, e.Y), MouseButton.Middle, InputEventType.Wheel, e.Delta);
72 uiControl.MouseLeave += (_, e) => OnMouseLeaveEvent();
73 uiControl.SizeChanged += UiControlOnSizeChanged;
75 ControlWidth = uiControl.ClientSize.Width;
76 ControlHeight = uiControl.ClientSize.Height;
79 private void InitializeFromWindowsWpf(GameContext uiContext)
81 var uiControlWpf = (
Window)uiContext.Control;
83 var inputElement = uiControlWpf;
85 BindRawInputKeyboard(uiControl);
86 uiControlWpf.Deactivated += OnUiControlLostFocus;
87 uiControlWpf.MouseMove += (_, e) => OnMouseMoveEvent(PointToVector2(e.GetPosition(inputElement)));
88 uiControlWpf.MouseDown += (_, e) => OnMouseInputEvent(PointToVector2(e.GetPosition(inputElement)), ConvertMouseButton(e.ChangedButton), InputEventType.Down);
89 uiControlWpf.MouseUp += (_, e) => OnMouseInputEvent(PointToVector2(e.GetPosition(inputElement)), ConvertMouseButton(e.ChangedButton), InputEventType.Up);
90 uiControlWpf.MouseWheel += (_, e) => OnMouseInputEvent(PointToVector2(e.GetPosition(inputElement)),
MouseButton.Middle, InputEventType.Wheel, e.Delta);
91 uiControlWpf.MouseLeave += (_, e) => OnMouseLeaveEvent();
92 uiControlWpf.SizeChanged += OnWpfSizeChanged;
94 ControlWidth = (float)uiControlWpf.ActualWidth;
95 ControlHeight = (
float)uiControlWpf.ActualHeight;
98 private void UiControlOnSizeChanged(
object sender,
EventArgs eventArgs)
100 ControlWidth = uiControl.ClientSize.Width;
101 ControlHeight = uiControl.ClientSize.Height;
104 private void OnWpfSizeChanged(
object sender, SizeChangedEventArgs e)
106 ControlWidth = (float)e.NewSize.Width;
107 ControlHeight = (
float)e.NewSize.Height;
110 private void OnMouseInputEvent(
Vector2 pixelPosition,
MouseButton button, InputEventType type,
float value = 0)
113 if (!uiControl.ClientRectangle.Contains(uiControl.PointToClient(
Control.MousePosition)))
117 if (type == InputEventType.Up && !MouseButtonCurrentlyDown[(
int)button])
120 CurrentMousePosition = NormalizeScreenPosition(pixelPosition);
123 lock (MouseInputEvents)
124 MouseInputEvents.Add(mouseInputEvent);
126 if (type != InputEventType.Wheel)
128 var buttonId = (int)button;
129 MouseButtonCurrentlyDown[buttonId] = type == InputEventType.Down;
130 HandlePointerEvents(buttonId, CurrentMousePosition, InputEventTypeToPointerState(type),
PointerType.Mouse);
134 private void OnMouseMoveEvent(
Vector2 pixelPosition)
136 CurrentMousePosition = NormalizeScreenPosition(pixelPosition);
141 var buttonId = (int)button;
142 if (MouseButtonCurrentlyDown[buttonId])
147 private void OnMouseLeaveEvent()
149 if (HasDownMouseButtons())
155 var buttonId = (int)button;
156 if (MouseButtonCurrentlyDown[buttonId])
160 MouseButtonCurrentlyDown[buttonId] =
false;
165 private void OnUiControlLostFocus(
object sender,
EventArgs e)
170 private MouseButton ConvertMouseButton(MouseButtons mouseButton)
174 case MouseButtons.Left:
175 return MouseButton.Left;
176 case MouseButtons.Right:
177 return MouseButton.Right;
178 case MouseButtons.Middle:
179 return MouseButton.Middle;
180 case MouseButtons.XButton1:
181 return MouseButton.Extended1;
182 case MouseButtons.XButton2:
183 return MouseButton.Extended2;
188 private MouseButton ConvertMouseButton(
System.Windows.Input.MouseButton mouseButton)
192 case System.Windows.Input.MouseButton.Left:
193 return MouseButton.Left;
194 case System.Windows.Input.MouseButton.Right:
195 return MouseButton.Right;
196 case System.Windows.Input.MouseButton.Middle:
197 return MouseButton.Middle;
198 case System.Windows.Input.MouseButton.XButton1:
199 return MouseButton.Extended1;
200 case System.Windows.Input.MouseButton.XButton2:
201 return MouseButton.Extended2;
206 private PointerState InputEventTypeToPointerState(InputEventType type)
210 case InputEventType.Up:
211 return PointerState.Up;
212 case InputEventType.Down:
213 return PointerState.Down;
215 throw new ArgumentOutOfRangeException(
"type");
221 return new Vector2((
float)point.X, (
float)point.Y);
225 public override bool MultiTouchEnabled {
get; set; }
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
SiliconStudio.Core.IServiceRegistry IServiceRegistry
The type of the serialized type will be passed as a generic arguments of the serializer. Example: serializer of A becomes instantiated as Serializer{A}.
System.Windows.Point Point