blob: 5186773ba8b78f90c69de3c2b9e5e6df67c8d2f5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
/************************************************************************************
Filename : Win32_Gamepad.cpp
Content : Win32 implementation of Platform app infrastructure
Created : May 6, 2013
Authors : Lee Cooper
Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
************************************************************************************/
#include "Win32_Gamepad.h"
namespace OVR { namespace OvrPlatform { namespace Win32 {
GamepadManager::GamepadManager()
{
hXInputModule = ::LoadLibraryA("Xinput9_1_0.dll");
if (hXInputModule)
{
pXInputGetState = (PFn_XInputGetState)
::GetProcAddress(hXInputModule, "XInputGetState");
}
}
GamepadManager::~GamepadManager()
{
if (hXInputModule)
::FreeLibrary(hXInputModule);
}
static inline float GamepadStick(short in)
{
float v;
if (abs(in) < 9000)
return 0;
else if (in > 9000)
v = (float) in - 9000;
else
v = (float) in + 9000;
return v / (32767 - 9000);
}
static inline float GamepadTrigger(BYTE in)
{
if (in < 30)
return 0;
else
return float(in-30) / 225;
}
uint32_t GamepadManager::GetGamepadCount()
{
return 1;
}
bool GamepadManager::GetGamepadState(uint32_t index, GamepadState* pState)
{
// For now we just support one gamepad.
OVR_UNUSED(index);
if (pXInputGetState)
{
XINPUT_STATE xis;
if (pXInputGetState(0, &xis))
return false;
if (xis.dwPacketNumber == LastPadPacketNo)
return false;
// State changed.
pState->Buttons = xis.Gamepad.wButtons; // Currently matches Xinput
pState->LT = GamepadTrigger(xis.Gamepad.bLeftTrigger);
pState->RT = GamepadTrigger(xis.Gamepad.bRightTrigger);
pState->LX = GamepadStick(xis.Gamepad.sThumbLX);
pState->LY = GamepadStick(xis.Gamepad.sThumbLY);
pState->RX = GamepadStick(xis.Gamepad.sThumbRX);
pState->RY = GamepadStick(xis.Gamepad.sThumbRY);
LastPadPacketNo = xis.dwPacketNumber;
return true;
}
return false;
}
}}} // OVR::OvrPlatform::Win32
|