Skip to content
This repository was archived by the owner on Feb 1, 2026. It is now read-only.

Commit d001fe2

Browse files
authored
Implements gamepad deltas on thumbsticks (#981)
* Implements gamepad deltas on thumbsticks * Adds `INPUT_GAMEPAD_BINDING_COUNT` constant
1 parent 83a2929 commit d001fe2

File tree

7 files changed

+88
-21
lines changed

7 files changed

+88
-21
lines changed

objects/objTest001_Gamepad/Draw_0.gml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ else
1313
_string += string_concat("Gamepad type = ", InputDeviceGetGamepadType(_device), "\n\n");
1414

1515
var _i = INPUT_GAMEPAD_BINDING_MIN;
16-
repeat(1 + INPUT_GAMEPAD_BINDING_MAX - INPUT_GAMEPAD_BINDING_MIN)
16+
repeat(INPUT_GAMEPAD_BINDING_COUNT)
1717
{
1818
_string += string_concat(_i, " = ", InputDeviceGetGamepadValue(_device, _i), "\n");
1919
++_i;

objects/objTest200_ConsoleSuite/Draw_0.gml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ else
4545
_string += "INPUT TEST:\n";
4646
_string += "Press buttons and axes on the gamepad to confirm behavior\n";
4747
var _i = INPUT_GAMEPAD_BINDING_MIN;
48-
repeat(1 + INPUT_GAMEPAD_BINDING_MAX - INPUT_GAMEPAD_BINDING_MIN)
48+
repeat(INPUT_GAMEPAD_BINDING_COUNT)
4949
{
5050
if (abs(InputDeviceGetGamepadValue(_device, _i)) >= 0.1)
5151
{

scripts/__InputClassGamepad/__InputClassGamepad.gml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,27 @@ function __InputClassGamepad(_gamepadIndex) constructor
2323
__steamHandleIndex = undefined;
2424

2525
__readArray = variable_clone(_genericReadArray, 1);
26+
27+
__prevValueArray = array_create(4, 0); // [gp_axislh, gp_axislv, gp_axisrh, gp_axisrv]
28+
__valueArray = array_create(4, 0); // [gp_axislh, gp_axislv, gp_axisrh, gp_axisrv]
29+
30+
31+
32+
static __UpdatePrevValues = function()
33+
{
34+
if (INPUT_BAN_GAMEPADS || __blocked || (not gamepad_is_connected(__gamepadIndex)))
35+
{
36+
__prevValueArray[@ 0] = 0;
37+
__prevValueArray[@ 1] = 0;
38+
__prevValueArray[@ 2] = 0;
39+
__prevValueArray[@ 3] = 0;
40+
return;
41+
}
42+
43+
array_copy(__prevValueArray, 0, __valueArray, 0, 4);
44+
__valueArray[@ 0] = __readArray[gp_axislh - INPUT_GAMEPAD_BINDING_MIN](__gamepadIndex, gp_axislh);
45+
__valueArray[@ 1] = __readArray[gp_axislv - INPUT_GAMEPAD_BINDING_MIN](__gamepadIndex, gp_axislv);
46+
__valueArray[@ 2] = __readArray[gp_axisrh - INPUT_GAMEPAD_BINDING_MIN](__gamepadIndex, gp_axisrh);
47+
__valueArray[@ 3] = __readArray[gp_axisrv - INPUT_GAMEPAD_BINDING_MIN](__gamepadIndex, gp_axisrv);
48+
}
2649
}

scripts/__InputConstants/__InputConstants.gml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,5 +187,6 @@ enum INPUT_PLUG_IN_CALLBACK
187187
// 32809 = gp_extra5
188188
// 32810 = gp_extra6
189189

190-
#macro INPUT_GAMEPAD_BINDING_MIN gp_face1
191-
#macro INPUT_GAMEPAD_BINDING_MAX gp_extra6
190+
#macro INPUT_GAMEPAD_BINDING_MIN gp_face1
191+
#macro INPUT_GAMEPAD_BINDING_MAX gp_extra6
192+
#macro INPUT_GAMEPAD_BINDING_COUNT (1 + INPUT_GAMEPAD_BINDING_MAX - INPUT_GAMEPAD_BINDING_MIN)

scripts/__InputGetGamepadActive/__InputGetGamepadActive.gml

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,56 @@
22

33
function __InputGetGamepadActive(_device)
44
{
5+
static _gamepadArray = __InputSystem().__gamepadArray;
6+
57
if (INPUT_BAN_GAMEPADS) return false;
68

79
if (_device < 0) return false;
810
if (not InputGameHasFocus()) return false;
911
if (not InputDeviceIsConnected(_device)) return false;
1012
if (not gamepad_is_connected(_device)) return false;
1113

12-
var _readArray = __InputGamepadGetReadArray(_device);
13-
14-
var _binding = INPUT_GAMEPAD_BINDING_MIN;
15-
repeat(1 + INPUT_GAMEPAD_BINDING_MAX - INPUT_GAMEPAD_BINDING_MIN)
14+
with(_gamepadArray[_device])
1615
{
17-
if ((((_binding != gp_axislh) && (_binding != gp_axislv) && (_binding != gp_axisrh) && (_binding != gp_axisrv)) || INPUT_GAMEPAD_THUMBSTICK_REPORTS_ACTIVE)
18-
&& (((_binding != gp_shoulderlb) && (_binding != gp_shoulderrb)) || INPUT_GAMEPAD_TRIGGER_REPORTS_ACTIVE))
16+
var _readArray = __readArray;
17+
18+
var _prevValueArray = __prevValueArray; //Thumbsticks only
19+
var _valueArray = __valueArray; //Thumbsticks only
20+
21+
var _binding = INPUT_GAMEPAD_BINDING_MIN;
22+
repeat(INPUT_GAMEPAD_BINDING_COUNT)
1923
{
20-
if (abs(_readArray[_binding - INPUT_GAMEPAD_BINDING_MIN](_device, _binding)) > INPUT_GAMEPAD_THUMBSTICK_MIN_THRESHOLD)
24+
if ((_binding == gp_axislh) || (_binding == gp_axislv) || (_binding == gp_axisrh) || (_binding == gp_axisrv))
2125
{
22-
return true;
26+
if (INPUT_GAMEPAD_THUMBSTICK_REPORTS_ACTIVE)
27+
{
28+
if ((abs(_prevValueArray[_binding - gp_axislh]) <= INPUT_GAMEPAD_THUMBSTICK_MIN_THRESHOLD)
29+
&& (abs(_valueArray[_binding - gp_axislh]) > INPUT_GAMEPAD_THUMBSTICK_MIN_THRESHOLD))
30+
{
31+
return true;
32+
}
33+
}
2334
}
35+
else if ((_binding == gp_shoulderlb) || (_binding == gp_shoulderrb))
36+
{
37+
if (INPUT_GAMEPAD_TRIGGER_REPORTS_ACTIVE)
38+
{
39+
if (abs(_readArray[_binding - INPUT_GAMEPAD_BINDING_MIN](_device, _binding)) > INPUT_GAMEPAD_TRIGGER_MIN_THRESHOLD)
40+
{
41+
return true;
42+
}
43+
}
44+
}
45+
else
46+
{
47+
if (_readArray[_binding - INPUT_GAMEPAD_BINDING_MIN](_device, _binding))
48+
{
49+
return true;
50+
}
51+
}
52+
53+
++_binding;
2454
}
25-
26-
++_binding;
2755
}
2856

2957
return false;

scripts/__InputGetGamepadOutput/__InputGetGamepadOutput.gml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function __InputGetGamepadOutput(_device)
1212
var _readArray = __InputGamepadGetReadArray(_device);
1313

1414
var _binding = INPUT_GAMEPAD_BINDING_MIN;
15-
repeat(1 + INPUT_GAMEPAD_BINDING_MAX - INPUT_GAMEPAD_BINDING_MIN)
15+
repeat(INPUT_GAMEPAD_BINDING_COUNT)
1616
{
1717
if (abs(_readArray[_binding - INPUT_GAMEPAD_BINDING_MIN](_device, _binding)) > INPUT_GAMEPAD_THUMBSTICK_MIN_THRESHOLD)
1818
{

scripts/__InputRegisterCollect/__InputRegisterCollect.gml

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,18 @@ function __InputRegisterCollect()
159159
if ((not INPUT_BAN_GAMEPADS) && (current_time > INPUT_GAMEPADS_COLLECT_PREDELAY))
160160
{
161161
__InputUpdateGamepadPresence();
162+
163+
_i = 0;
164+
repeat(array_length(__gamepadArray))
165+
{
166+
var _gamepad = __gamepadArray[_i];
167+
if (is_struct(_gamepad))
168+
{
169+
_gamepad.__UpdatePrevValues();
170+
}
171+
172+
++_i;
173+
}
162174
}
163175

164176
//Handle rebinding
@@ -170,15 +182,18 @@ function __InputRegisterCollect()
170182
}
171183

172184
//Handle hotswap
173-
if ((not INPUT_BAN_HOTSWAP) && __hotswap)
185+
if (not INPUT_BAN_HOTSWAP)
174186
{
175-
if (InputPlayerGetInactive())
187+
if (__hotswap)
176188
{
177-
var _device = InputDeviceGetNewActivity();
178-
if (_device != INPUT_NO_DEVICE)
189+
if (InputPlayerGetInactive())
179190
{
180-
InputPlayerSetDevice(_device);
181-
if (is_callable(__hotswapCallback)) __hotswapCallback();
191+
var _device = InputDeviceGetNewActivity();
192+
if (_device != INPUT_NO_DEVICE)
193+
{
194+
InputPlayerSetDevice(_device);
195+
if (is_callable(__hotswapCallback)) __hotswapCallback();
196+
}
182197
}
183198
}
184199
}

0 commit comments

Comments
 (0)