Merge pull request #38151 from madmiraal/fix-8368

Support SDL2 half axes and inverted axes mappings.
This commit is contained in:
Rémi Verschelde 2020-05-13 12:56:42 +02:00 committed by GitHub
commit aebe036459
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 739 additions and 625 deletions

View file

@ -88,7 +88,8 @@ static Vector<_GlobalConstant> _global_constants;
VARIANT_ENUM_CAST(KeyList);
VARIANT_ENUM_CAST(KeyModifierMask);
VARIANT_ENUM_CAST(ButtonList);
VARIANT_ENUM_CAST(JoystickList);
VARIANT_ENUM_CAST(JoyButtonList);
VARIANT_ENUM_CAST(JoyAxisList);
VARIANT_ENUM_CAST(MidiMessageList);
void register_global_constants() {
@ -388,90 +389,70 @@ void register_global_constants() {
BIND_GLOBAL_ENUM_CONSTANT(BUTTON_MASK_XBUTTON1);
BIND_GLOBAL_ENUM_CONSTANT(BUTTON_MASK_XBUTTON2);
//joypads
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_0);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_1);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_2);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_3);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_4);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_5);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_6);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_7);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_8);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_9);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_10);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_11);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_12);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_13);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_14);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_15);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_MAX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_CIRCLE);
// Joypad buttons
BIND_GLOBAL_ENUM_CONSTANT(JOY_INVALID_BUTTON);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_A);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_B);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_BACK);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_GUIDE);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_START);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_LEFT_STICK);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_RIGHT_STICK);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_LEFT_SHOULDER);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_RIGHT_SHOULDER);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_DPAD_UP);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_DPAD_DOWN);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_DPAD_LEFT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_DPAD_RIGHT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SDL_BUTTONS);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_CROSS);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_CIRCLE);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_SQUARE);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_TRIANGLE);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_B);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_SELECT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_START);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_PS);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_L1);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_R1);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_L3);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SONY_R3);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_A);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_B);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_BACK);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_START);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_HOME);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_LS);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_RS);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_LB);
BIND_GLOBAL_ENUM_CONSTANT(JOY_XBOX_RB);
BIND_GLOBAL_ENUM_CONSTANT(JOY_BUTTON_MAX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DS_A);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DS_B);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DS_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DS_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_VR_GRIP);
BIND_GLOBAL_ENUM_CONSTANT(JOY_VR_PAD);
BIND_GLOBAL_ENUM_CONSTANT(JOY_VR_TRIGGER);
BIND_GLOBAL_ENUM_CONSTANT(JOY_OCULUS_AX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_OCULUS_BY);
BIND_GLOBAL_ENUM_CONSTANT(JOY_OCULUS_MENU);
BIND_GLOBAL_ENUM_CONSTANT(JOY_OPENVR_MENU);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SELECT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_START);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DPAD_UP);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DPAD_DOWN);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DPAD_LEFT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_DPAD_RIGHT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_L);
BIND_GLOBAL_ENUM_CONSTANT(JOY_L2);
BIND_GLOBAL_ENUM_CONSTANT(JOY_L3);
BIND_GLOBAL_ENUM_CONSTANT(JOY_R);
BIND_GLOBAL_ENUM_CONSTANT(JOY_R2);
BIND_GLOBAL_ENUM_CONSTANT(JOY_R3);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_0);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_1);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_2);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_3);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_4);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_5);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_6);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_7);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_8);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_9);
// Joypad axes
BIND_GLOBAL_ENUM_CONSTANT(JOY_INVALID_AXIS);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_LEFT_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_LEFT_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_RIGHT_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_RIGHT_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_TRIGGER_LEFT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_TRIGGER_RIGHT);
BIND_GLOBAL_ENUM_CONSTANT(JOY_SDL_AXES);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_0_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_0_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_1_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_1_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_2_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_2_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_3_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_3_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_4_X);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_4_Y);
BIND_GLOBAL_ENUM_CONSTANT(JOY_AXIS_MAX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_ANALOG_LX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_ANALOG_LY);
BIND_GLOBAL_ENUM_CONSTANT(JOY_ANALOG_RX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_ANALOG_RY);
BIND_GLOBAL_ENUM_CONSTANT(JOY_ANALOG_L2);
BIND_GLOBAL_ENUM_CONSTANT(JOY_ANALOG_R2);
BIND_GLOBAL_ENUM_CONSTANT(JOY_VR_ANALOG_TRIGGER);
BIND_GLOBAL_ENUM_CONSTANT(JOY_VR_ANALOG_GRIP);
BIND_GLOBAL_ENUM_CONSTANT(JOY_OPENVR_TOUCHPADX);
BIND_GLOBAL_ENUM_CONSTANT(JOY_OPENVR_TOUCHPADY);
// midi
BIND_GLOBAL_ENUM_CONSTANT(MIDI_MESSAGE_NOTE_OFF);
BIND_GLOBAL_ENUM_CONSTANT(MIDI_MESSAGE_NOTE_ON);

View file

@ -39,6 +39,87 @@
#include "editor/editor_settings.h"
#endif
static const char *_joy_buttons[JOY_SDL_BUTTONS + 1] = {
"a",
"b",
"x",
"y",
"back",
"guide",
"start",
"leftstick",
"rightstick",
"leftshoulder",
"rightshoulder",
"dpup",
"dpdown",
"dpleft",
"dpright",
nullptr
};
static const char *_joy_button_names[JOY_BUTTON_MAX] = {
"Face Bottom",
"Face Right",
"Face Left",
"Face Top",
"Select",
"Guide",
"Start",
"Left Stick",
"Right Stick",
"Left Shoulder",
"Right Shoulder",
"D-Pad Up",
"D-Pad Down",
"D-Pad Left",
"D-Pad Right",
"Button 15",
"Button 16",
"Button 17",
"Button 18",
"Button 19",
"Button 20",
"Button 21",
"Button 22",
"Button 23",
"Button 24",
"Button 25",
"Button 26",
"Button 27",
"Button 28",
"Button 29",
"Button 30",
"Button 31",
"Button 32",
"Button 33",
"Button 34",
"Button 35"
};
static const char *_joy_axes[JOY_SDL_AXES + 1] = {
"leftx",
"lefty",
"rightx",
"righty",
"lefttrigger",
"righttrigger",
nullptr
};
static const char *_joy_axis_names[JOY_AXIS_MAX] = {
"Left Stick X",
"Left Stick Y",
"Right Stick X",
"Right Stick Y",
"Left Trigger",
"Right Trigger",
"Joystick 3 Stick X",
"Joystick 3 Stick Y",
"Joystick 4 Stick X",
"Joystick 4 Stick Y"
};
Input *Input::singleton = nullptr;
void (*Input::set_mouse_mode_func)(Input::MouseMode) = nullptr;
@ -336,13 +417,12 @@ void Input::joy_connection_changed(int p_idx, bool p_connected, String p_name, S
} else {
js.connected = false;
for (int i = 0; i < JOY_BUTTON_MAX; i++) {
if (i < JOY_AXIS_MAX)
set_joy_axis(p_idx, i, 0.0f);
int c = _combine_device(i, p_idx);
joy_buttons_pressed.erase(c);
};
}
for (int i = 0; i < JOY_AXIS_MAX; i++) {
set_joy_axis(p_idx, i, 0.0f);
}
};
joy_names[p_idx] = js;
@ -831,21 +911,9 @@ void Input::joy_button(int p_device, int p_button, bool p_pressed) {
return;
}
const Map<int, JoyEvent>::Element *el = map_db[joy.mapping].buttons.find(p_button);
if (!el) {
//don't process un-mapped events for now, it could mess things up badly for devices with additional buttons/axis
//return _button_event(p_last_id, p_device, p_button, p_pressed);
return;
}
JoyEvent map = _get_mapped_button_event(map_db[joy.mapping], p_button);
JoyEvent map = el->get();
if (map.type == TYPE_BUTTON) {
//fake additional axis event for triggers
if (map.index == JOY_L2 || map.index == JOY_R2) {
float value = p_pressed ? 1.0f : 0.0f;
int axis = map.index == JOY_L2 ? JOY_ANALOG_L2 : JOY_ANALOG_R2;
_axis_event(p_device, axis, value);
}
_button_event(p_device, map.index, p_pressed);
return;
}
@ -901,32 +969,20 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) {
return;
};
const Map<int, JoyEvent>::Element *el = map_db[joy.mapping].axis.find(p_axis);
if (!el) {
//return _axis_event(p_last_id, p_device, p_axis, p_value);
return;
};
JoyEvent map = el->get();
JoyEvent map = _get_mapped_axis_event(map_db[joy.mapping], p_axis, p_value);
if (map.type == TYPE_BUTTON) {
//send axis event for triggers
if (map.index == JOY_L2 || map.index == JOY_R2) {
float value = p_value.min == 0 ? p_value.value : 0.5f + p_value.value / 2.0f;
int axis = map.index == JOY_L2 ? JOY_ANALOG_L2 : JOY_ANALOG_R2;
_axis_event(p_device, axis, value);
}
if (map.index == JOY_DPAD_UP || map.index == JOY_DPAD_DOWN) {
if (map.index == JOY_BUTTON_DPAD_UP || map.index == JOY_BUTTON_DPAD_DOWN) {
bool pressed = p_value.value != 0.0f;
int button = p_value.value < 0 ? JOY_DPAD_UP : JOY_DPAD_DOWN;
int button = p_value.value < 0 ? JOY_BUTTON_DPAD_UP : JOY_BUTTON_DPAD_DOWN;
if (!pressed) {
if (joy_buttons_pressed.has(_combine_device(JOY_DPAD_UP, p_device))) {
_button_event(p_device, JOY_DPAD_UP, false);
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_UP, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_UP, false);
}
if (joy_buttons_pressed.has(_combine_device(JOY_DPAD_DOWN, p_device))) {
_button_event(p_device, JOY_DPAD_DOWN, false);
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_DOWN, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_DOWN, false);
}
}
if (pressed == joy_buttons_pressed.has(_combine_device(button, p_device))) {
@ -935,16 +991,17 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) {
_button_event(p_device, button, true);
return;
}
if (map.index == JOY_DPAD_LEFT || map.index == JOY_DPAD_RIGHT) {
if (map.index == JOY_BUTTON_DPAD_LEFT || map.index == JOY_BUTTON_DPAD_RIGHT) {
bool pressed = p_value.value != 0.0f;
int button = p_value.value < 0 ? JOY_DPAD_LEFT : JOY_DPAD_RIGHT;
int button = p_value.value < 0 ? JOY_BUTTON_DPAD_LEFT : JOY_BUTTON_DPAD_RIGHT;
if (!pressed) {
if (joy_buttons_pressed.has(_combine_device(JOY_DPAD_LEFT, p_device))) {
_button_event(p_device, JOY_DPAD_LEFT, false);
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_LEFT, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_LEFT, false);
}
if (joy_buttons_pressed.has(_combine_device(JOY_DPAD_RIGHT, p_device))) {
_button_event(p_device, JOY_DPAD_RIGHT, false);
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_RIGHT, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_RIGHT, false);
}
}
if (pressed == joy_buttons_pressed.has(_combine_device(button, p_device))) {
@ -953,19 +1010,21 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) {
_button_event(p_device, button, true);
return;
}
float deadzone = p_value.min == 0 ? 0.5f : 0.0f;
bool pressed = p_value.value > deadzone;
if (pressed == joy_buttons_pressed.has(_combine_device(map.index, p_device))) {
// button already pressed or released, this is an axis bounce value
return;
}
_button_event(p_device, map.index, pressed);
return;
}
if (map.type == TYPE_AXIS) {
_axis_event(p_device, map.index, val);
_axis_event(p_device, map.index, map.value);
return;
}
//printf("invalid mapping\n");
@ -976,12 +1035,26 @@ void Input::joy_hat(int p_device, int p_val) {
_THREAD_SAFE_METHOD_;
const Joypad &joy = joy_names[p_device];
const JoyEvent *map;
JoyEvent map[HAT_MAX];
if (joy.mapping == -1) {
map = hat_map_default;
} else {
map = map_db[joy.mapping].hat;
map[HAT_UP].type = TYPE_BUTTON;
map[HAT_UP].index = JOY_BUTTON_DPAD_UP;
map[HAT_UP].value = 0;
map[HAT_RIGHT].type = TYPE_BUTTON;
map[HAT_RIGHT].index = JOY_BUTTON_DPAD_RIGHT;
map[HAT_RIGHT].value = 0;
map[HAT_DOWN].type = TYPE_BUTTON;
map[HAT_DOWN].index = JOY_BUTTON_DPAD_DOWN;
map[HAT_DOWN].value = 0;
map[HAT_LEFT].type = TYPE_BUTTON;
map[HAT_LEFT].index = JOY_BUTTON_DPAD_LEFT;
map[HAT_LEFT].value = 0;
if (joy.mapping != -1) {
_get_mapped_hat_events(map_db[joy.mapping], 0, map);
};
int cur_val = joy_names[p_device].hat_current;
@ -1025,50 +1098,149 @@ void Input::_axis_event(int p_device, int p_axis, float p_value) {
parse_input_event(ievent);
};
Input::JoyEvent Input::_find_to_event(String p_to) {
Input::JoyEvent Input::_get_mapped_button_event(const JoyDeviceMapping &mapping, int p_button) {
// string names of the SDL buttons in the same order as input_event.h godot buttons
static const char *buttons[] = { "a", "b", "x", "y", "leftshoulder", "rightshoulder", "lefttrigger", "righttrigger", "leftstick", "rightstick", "back", "start", "dpup", "dpdown", "dpleft", "dpright", "guide", nullptr };
JoyEvent event;
event.type = TYPE_MAX;
static const char *axis[] = { "leftx", "lefty", "rightx", "righty", nullptr };
for (int i = 0; i < mapping.bindings.size(); i++) {
const JoyBinding binding = mapping.bindings[i];
if (binding.inputType == TYPE_BUTTON && binding.input.button == p_button) {
event.type = binding.outputType;
switch (binding.outputType) {
case TYPE_BUTTON:
event.index = binding.output.button;
return event;
case TYPE_AXIS:
event.index = binding.output.axis.axis;
return event;
default:
ERR_PRINT_ONCE("Joypad button mapping error.");
}
}
}
return event;
}
JoyEvent ret;
ret.type = -1;
ret.index = 0;
Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis, const JoyAxis &p_value) {
int i = 0;
while (buttons[i]) {
JoyEvent event;
event.type = TYPE_MAX;
if (p_to == buttons[i]) {
ret.type = TYPE_BUTTON;
ret.index = i;
ret.value = 0;
return ret;
};
++i;
};
for (int i = 0; i < mapping.bindings.size(); i++) {
const JoyBinding binding = mapping.bindings[i];
if (binding.inputType == TYPE_AXIS && binding.input.axis.axis == p_axis) {
float value = p_value.value;
if (binding.input.axis.invert)
value = -value;
if (binding.input.axis.range == FULL_AXIS ||
(binding.input.axis.range == POSITIVE_HALF_AXIS && value > 0) ||
(binding.input.axis.range == NEGATIVE_HALF_AXIS && value < 0)) {
event.type = binding.outputType;
switch (binding.outputType) {
case TYPE_BUTTON:
event.index = binding.output.button;
return event;
case TYPE_AXIS:
event.index = binding.output.axis.axis;
event.value = value;
if (binding.output.axis.range != binding.input.axis.range) {
float shifted_positive_value = 0;
switch (binding.input.axis.range) {
case POSITIVE_HALF_AXIS:
shifted_positive_value = value;
break;
case NEGATIVE_HALF_AXIS:
shifted_positive_value = value + 1;
break;
case FULL_AXIS:
shifted_positive_value = (value + 1) / 2;
break;
}
switch (binding.output.axis.range) {
case POSITIVE_HALF_AXIS:
event.value = shifted_positive_value;
break;
case NEGATIVE_HALF_AXIS:
event.value = shifted_positive_value - 1;
break;
case FULL_AXIS:
event.value = (shifted_positive_value * 2) - 1;
break;
}
}
return event;
default:
ERR_PRINT_ONCE("Joypad axis mapping error.");
}
}
}
}
return event;
}
i = 0;
while (axis[i]) {
void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, JoyEvent r_events[]) {
if (p_to == axis[i]) {
ret.type = TYPE_AXIS;
ret.index = i;
ret.value = 0;
return ret;
};
++i;
};
for (int i = 0; i < mapping.bindings.size(); i++) {
const JoyBinding binding = mapping.bindings[i];
if (binding.inputType == TYPE_HAT && binding.input.hat.hat == p_hat) {
return ret;
};
int index;
switch (binding.input.hat.hat_mask) {
case HAT_MASK_UP:
index = 0;
break;
case HAT_MASK_RIGHT:
index = 1;
break;
case HAT_MASK_DOWN:
index = 2;
break;
case HAT_MASK_LEFT:
index = 3;
break;
default:
ERR_PRINT_ONCE("Joypad button mapping error.");
continue;
}
r_events[index].type = binding.outputType;
switch (binding.outputType) {
case TYPE_BUTTON:
r_events[index].index = binding.output.button;
break;
case TYPE_AXIS:
r_events[index].index = binding.output.axis.axis;
break;
default:
ERR_PRINT_ONCE("Joypad button mapping error.");
}
}
}
}
JoyButtonList Input::_get_output_button(String output) {
for (int i = 0; _joy_buttons[i]; i++) {
if (output == _joy_buttons[i])
return JoyButtonList(i);
}
return JoyButtonList::JOY_INVALID_BUTTON;
}
JoyAxisList Input::_get_output_axis(String output) {
for (int i = 0; _joy_axes[i]; i++) {
if (output == _joy_axes[i])
return JoyAxisList(i);
}
return JoyAxisList::JOY_INVALID_AXIS;
}
void Input::parse_mapping(String p_mapping) {
_THREAD_SAFE_METHOD_;
JoyDeviceMapping mapping;
for (int i = 0; i < HAT_MAX; ++i)
mapping.hat[i].index = 1024 + i;
Vector<String> entry = p_mapping.split(",");
if (entry.size() < 2) {
@ -1087,45 +1259,79 @@ void Input::parse_mapping(String p_mapping) {
if (entry[idx] == "")
continue;
String from = entry[idx].get_slice(":", 1).replace(" ", "");
String to = entry[idx].get_slice(":", 0).replace(" ", "");
String output = entry[idx].get_slice(":", 0).replace(" ", "");
String input = entry[idx].get_slice(":", 1).replace(" ", "");
ERR_CONTINUE_MSG(output.length() < 1 || input.length() < 2,
String(entry[idx] + "\nInvalid device mapping entry: " + entry[idx]));
JoyEvent to_event = _find_to_event(to);
if (to_event.type == -1)
if (output == "platform")
continue;
String etype = from.substr(0, 1);
if (etype == "a") {
JoyAxisRange output_range = FULL_AXIS;
if (output[0] == '+' || output[0] == '-') {
ERR_CONTINUE_MSG(output.length() < 2, String(entry[idx] + "\nInvalid output: " + entry[idx]));
output = output.right(1);
if (output[0] == '+')
output_range = POSITIVE_HALF_AXIS;
else if (output[0] == '-')
output_range = NEGATIVE_HALF_AXIS;
}
int aid = from.substr(1, from.length() - 1).to_int();
mapping.axis[aid] = to_event;
JoyAxisRange input_range = FULL_AXIS;
if (input[0] == '+') {
input_range = POSITIVE_HALF_AXIS;
input = input.right(1);
} else if (input[0] == '-') {
input_range = NEGATIVE_HALF_AXIS;
input = input.right(1);
}
bool invert_axis = false;
if (input[input.length() - 1] == '~')
invert_axis = true;
} else if (etype == "b") {
JoyButtonList output_button = _get_output_button(output);
JoyAxisList output_axis = _get_output_axis(output);
ERR_CONTINUE_MSG(output_button == JOY_INVALID_BUTTON && output_axis == JOY_INVALID_AXIS,
String(entry[idx] + "\nUnrecognised output string: " + output));
ERR_CONTINUE_MSG(output_button != JOY_INVALID_BUTTON && output_axis != JOY_INVALID_AXIS,
String("BUG: Output string matched both button and axis: " + output));
int bid = from.substr(1, from.length() - 1).to_int();
mapping.buttons[bid] = to_event;
JoyBinding binding;
if (output_button != JOY_INVALID_BUTTON) {
binding.outputType = TYPE_BUTTON;
binding.output.button = output_button;
} else if (output_axis != JOY_INVALID_AXIS) {
binding.outputType = TYPE_AXIS;
binding.output.axis.axis = output_axis;
binding.output.axis.range = output_range;
}
} else if (etype == "h") {
switch (input[0]) {
case 'b':
binding.inputType = TYPE_BUTTON;
binding.input.button = input.right(1).to_int();
break;
case 'a':
binding.inputType = TYPE_AXIS;
binding.input.axis.axis = input.right(1).to_int();
binding.input.axis.range = input_range;
binding.input.axis.invert = invert_axis;
break;
case 'h':
ERR_CONTINUE_MSG(input.length() != 4 || input[2] != '.',
String(entry[idx] + "\nInvalid hat input: " + input));
binding.inputType = TYPE_HAT;
binding.input.hat.hat = input.substr(1, 1).to_int();
binding.input.hat.hat_mask = static_cast<HatMask>(input.right(3).to_int());
break;
default:
ERR_CONTINUE_MSG(true, String(entry[idx] + "\nUnrecognised input string: " + input));
}
int hat_value = from.get_slice(".", 1).to_int();
switch (hat_value) {
case 1:
mapping.hat[HAT_UP] = to_event;
break;
case 2:
mapping.hat[HAT_RIGHT] = to_event;
break;
case 4:
mapping.hat[HAT_DOWN] = to_event;
break;
case 8:
mapping.hat[HAT_LEFT] = to_event;
break;
};
};
mapping.bindings.push_back(binding);
};
map_db.push_back(mapping);
//printf("added mapping with uuid %ls\n", mapping.uid.c_str());
};
void Input::add_joy_mapping(String p_mapping, bool p_update_existing) {
@ -1187,50 +1393,18 @@ Array Input::get_connected_joypads() {
return ret;
}
static const char *_buttons[JOY_BUTTON_MAX] = {
"Face Button Bottom",
"Face Button Right",
"Face Button Left",
"Face Button Top",
"L",
"R",
"L2",
"R2",
"L3",
"R3",
"Select",
"Start",
"DPAD Up",
"DPAD Down",
"DPAD Left",
"DPAD Right"
};
static const char *_axes[JOY_AXIS_MAX] = {
"Left Stick X",
"Left Stick Y",
"Right Stick X",
"Right Stick Y",
"",
"",
"L2",
"R2",
"",
""
};
String Input::get_joy_button_string(int p_button) {
ERR_FAIL_INDEX_V(p_button, JOY_BUTTON_MAX, "");
return _buttons[p_button];
ERR_FAIL_INDEX_V(p_button, JOY_BUTTON_MAX, "Invalid button");
return _joy_button_names[p_button];
}
int Input::get_joy_button_index_from_string(String p_button) {
for (int i = 0; i < JOY_BUTTON_MAX; i++) {
if (p_button == _buttons[i]) {
if (p_button == _joy_button_names[i]) {
return i;
}
}
ERR_FAIL_V(-1);
ERR_FAIL_V(JOY_INVALID_BUTTON);
}
int Input::get_unused_joy_id() {
@ -1243,17 +1417,17 @@ int Input::get_unused_joy_id() {
}
String Input::get_joy_axis_string(int p_axis) {
ERR_FAIL_INDEX_V(p_axis, JOY_AXIS_MAX, "");
return _axes[p_axis];
ERR_FAIL_INDEX_V(p_axis, JOY_AXIS_MAX, "Invalid axis");
return _joy_axis_names[p_axis];
}
int Input::get_joy_axis_index_from_string(String p_axis) {
for (int i = 0; i < JOY_AXIS_MAX; i++) {
if (p_axis == _axes[i]) {
if (p_axis == _joy_axis_names[i]) {
return i;
}
}
ERR_FAIL_V(-1);
ERR_FAIL_V(JOY_INVALID_AXIS);
}
Input::Input() {
@ -1268,22 +1442,6 @@ Input::Input() {
event_dispatch_function = nullptr;
default_shape = CURSOR_ARROW;
hat_map_default[HAT_UP].type = TYPE_BUTTON;
hat_map_default[HAT_UP].index = JOY_DPAD_UP;
hat_map_default[HAT_UP].value = 0;
hat_map_default[HAT_RIGHT].type = TYPE_BUTTON;
hat_map_default[HAT_RIGHT].index = JOY_DPAD_RIGHT;
hat_map_default[HAT_RIGHT].value = 0;
hat_map_default[HAT_DOWN].type = TYPE_BUTTON;
hat_map_default[HAT_DOWN].index = JOY_DPAD_DOWN;
hat_map_default[HAT_DOWN].value = 0;
hat_map_default[HAT_LEFT].type = TYPE_BUTTON;
hat_map_default[HAT_LEFT].index = JOY_DPAD_LEFT;
hat_map_default[HAT_LEFT].value = 0;
fallback_mapping = -1;
// Parse default mappings.

View file

@ -145,7 +145,7 @@ private:
StringName name;
StringName uid;
bool connected;
bool last_buttons[JOY_BUTTON_MAX + 19]; //apparently SDL specifies 35 possible buttons on android
bool last_buttons[JOY_BUTTON_MAX];
float last_axis[JOY_AXIS_MAX];
float filter;
int last_hat;
@ -154,11 +154,9 @@ private:
Joypad() {
for (int i = 0; i < JOY_AXIS_MAX; i++) {
last_axis[i] = 0.0f;
}
for (int i = 0; i < JOY_BUTTON_MAX + 19; i++) {
for (int i = 0; i < JOY_BUTTON_MAX; i++) {
last_buttons[i] = false;
}
connected = false;
@ -183,26 +181,61 @@ private:
TYPE_MAX,
};
enum JoyAxisRange {
NEGATIVE_HALF_AXIS = -1,
FULL_AXIS = 0,
POSITIVE_HALF_AXIS = 1
};
struct JoyEvent {
int type;
int index;
int value;
float value;
};
struct JoyBinding {
JoyType inputType;
union {
int button;
struct {
int axis;
JoyAxisRange range;
bool invert;
} axis;
struct {
int hat;
HatMask hat_mask;
} hat;
} input;
JoyType outputType;
union {
JoyButtonList button;
struct {
JoyAxisList axis;
JoyAxisRange range;
} axis;
} output;
};
struct JoyDeviceMapping {
String uid;
String name;
Map<int, JoyEvent> buttons;
Map<int, JoyEvent> axis;
JoyEvent hat[HAT_MAX];
Vector<JoyBinding> bindings;
};
JoyEvent hat_map_default[HAT_MAX];
Vector<JoyDeviceMapping> map_db;
JoyEvent _find_to_event(String p_to);
JoyEvent _get_mapped_button_event(const JoyDeviceMapping &mapping, int p_button);
JoyEvent _get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis, const JoyAxis &p_value);
void _get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, JoyEvent r_events[HAT_MAX]);
JoyButtonList _get_output_button(String output);
JoyAxisList _get_output_axis(String output);
void _button_event(int p_device, int p_index, bool p_pressed);
void _axis_event(int p_device, int p_axis, float p_value);
float _handle_deadzone(int p_device, int p_axis, float p_value);

View file

@ -42,18 +42,7 @@ def make_default_controller_mappings(target, source, env):
src_path, current_platform, platform_mappings[current_platform][guid]
)
)
valid_mapping = True
for input_map in line_parts[2:]:
if "+" in input_map or "-" in input_map or "~" in input_map:
g.write(
"// WARNING - DISCARDED UNSUPPORTED MAPPING TYPE FROM DATABASE {}: {} {}\n".format(
src_path, current_platform, line
)
)
valid_mapping = False
break
if valid_mapping:
platform_mappings[current_platform][guid] = line
platform_mappings[current_platform][guid] = line
platform_variables = {
"Linux": "#if X11_ENABLED",

View file

@ -59,98 +59,84 @@ enum ButtonList {
BUTTON_MASK_XBUTTON2 = (1 << (BUTTON_XBUTTON2 - 1))
};
enum JoystickList {
enum JoyButtonList {
JOY_BUTTON_0 = 0,
JOY_BUTTON_1 = 1,
JOY_BUTTON_2 = 2,
JOY_BUTTON_3 = 3,
JOY_BUTTON_4 = 4,
JOY_BUTTON_5 = 5,
JOY_BUTTON_6 = 6,
JOY_BUTTON_7 = 7,
JOY_BUTTON_8 = 8,
JOY_BUTTON_9 = 9,
JOY_BUTTON_10 = 10,
JOY_BUTTON_11 = 11,
JOY_BUTTON_12 = 12,
JOY_BUTTON_13 = 13,
JOY_BUTTON_14 = 14,
JOY_BUTTON_15 = 15,
JOY_BUTTON_MAX = 16,
JOY_INVALID_BUTTON = -1,
JOY_L = JOY_BUTTON_4,
JOY_R = JOY_BUTTON_5,
JOY_L2 = JOY_BUTTON_6,
JOY_R2 = JOY_BUTTON_7,
JOY_L3 = JOY_BUTTON_8,
JOY_R3 = JOY_BUTTON_9,
JOY_SELECT = JOY_BUTTON_10,
JOY_START = JOY_BUTTON_11,
JOY_DPAD_UP = JOY_BUTTON_12,
JOY_DPAD_DOWN = JOY_BUTTON_13,
JOY_DPAD_LEFT = JOY_BUTTON_14,
JOY_DPAD_RIGHT = JOY_BUTTON_15,
// SDL Buttons
JOY_BUTTON_A = 0,
JOY_BUTTON_B = 1,
JOY_BUTTON_X = 2,
JOY_BUTTON_Y = 3,
JOY_BUTTON_BACK = 4,
JOY_BUTTON_GUIDE = 5,
JOY_BUTTON_START = 6,
JOY_BUTTON_LEFT_STICK = 7,
JOY_BUTTON_RIGHT_STICK = 8,
JOY_BUTTON_LEFT_SHOULDER = 9,
JOY_BUTTON_RIGHT_SHOULDER = 10,
JOY_BUTTON_DPAD_UP = 11,
JOY_BUTTON_DPAD_DOWN = 12,
JOY_BUTTON_DPAD_LEFT = 13,
JOY_BUTTON_DPAD_RIGHT = 14,
JOY_SDL_BUTTONS = 15,
JOY_SONY_CIRCLE = JOY_BUTTON_1,
JOY_SONY_X = JOY_BUTTON_0,
JOY_SONY_SQUARE = JOY_BUTTON_2,
JOY_SONY_TRIANGLE = JOY_BUTTON_3,
// Sony Buttons
JOY_SONY_X = JOY_BUTTON_A,
JOY_SONY_CROSS = JOY_BUTTON_A,
JOY_SONY_CIRCLE = JOY_BUTTON_B,
JOY_SONY_SQUARE = JOY_BUTTON_X,
JOY_SONY_TRIANGLE = JOY_BUTTON_Y,
JOY_SONY_SELECT = JOY_BUTTON_BACK,
JOY_SONY_START = JOY_BUTTON_START,
JOY_SONY_PS = JOY_BUTTON_GUIDE,
JOY_SONY_L1 = JOY_BUTTON_LEFT_SHOULDER,
JOY_SONY_R1 = JOY_BUTTON_RIGHT_SHOULDER,
JOY_SONY_L3 = JOY_BUTTON_LEFT_STICK,
JOY_SONY_R3 = JOY_BUTTON_RIGHT_STICK,
JOY_XBOX_A = JOY_BUTTON_0,
JOY_XBOX_B = JOY_BUTTON_1,
JOY_XBOX_X = JOY_BUTTON_2,
JOY_XBOX_Y = JOY_BUTTON_3,
// Xbox Buttons
JOY_XBOX_A = JOY_BUTTON_A,
JOY_XBOX_B = JOY_BUTTON_B,
JOY_XBOX_X = JOY_BUTTON_X,
JOY_XBOX_Y = JOY_BUTTON_Y,
JOY_XBOX_BACK = JOY_BUTTON_BACK,
JOY_XBOX_START = JOY_BUTTON_START,
JOY_XBOX_HOME = JOY_BUTTON_GUIDE,
JOY_XBOX_LS = JOY_BUTTON_LEFT_STICK,
JOY_XBOX_RS = JOY_BUTTON_RIGHT_STICK,
JOY_XBOX_LB = JOY_BUTTON_LEFT_SHOULDER,
JOY_XBOX_RB = JOY_BUTTON_RIGHT_SHOULDER,
JOY_DS_A = JOY_BUTTON_1,
JOY_DS_B = JOY_BUTTON_0,
JOY_DS_X = JOY_BUTTON_3,
JOY_DS_Y = JOY_BUTTON_2,
JOY_BUTTON_MAX = 36 // Apparently Android supports up to 36 buttons.
};
JOY_WII_C = JOY_BUTTON_5,
JOY_WII_Z = JOY_BUTTON_6,
enum JoyAxisList {
JOY_WII_MINUS = JOY_BUTTON_10,
JOY_WII_PLUS = JOY_BUTTON_11,
JOY_INVALID_AXIS = -1,
JOY_VR_GRIP = JOY_BUTTON_2,
JOY_VR_PAD = JOY_BUTTON_14,
JOY_VR_TRIGGER = JOY_BUTTON_15,
// SDL Axes
JOY_AXIS_LEFT_X = 0,
JOY_AXIS_LEFT_Y = 1,
JOY_AXIS_RIGHT_X = 2,
JOY_AXIS_RIGHT_Y = 3,
JOY_AXIS_TRIGGER_LEFT = 4,
JOY_AXIS_TRIGGER_RIGHT = 5,
JOY_SDL_AXES = 6,
JOY_OCULUS_AX = JOY_BUTTON_7,
JOY_OCULUS_BY = JOY_BUTTON_1,
JOY_OCULUS_MENU = JOY_BUTTON_3,
// Joystick axes.
JOY_AXIS_0_X = 0,
JOY_AXIS_0_Y = 1,
JOY_AXIS_1_X = 2,
JOY_AXIS_1_Y = 3,
JOY_AXIS_2_X = 4,
JOY_AXIS_2_Y = 5,
JOY_AXIS_3_X = 6,
JOY_AXIS_3_Y = 7,
JOY_AXIS_4_X = 8,
JOY_AXIS_4_Y = 9,
JOY_OPENVR_MENU = JOY_BUTTON_1,
// end of history
JOY_AXIS_0 = 0,
JOY_AXIS_1 = 1,
JOY_AXIS_2 = 2,
JOY_AXIS_3 = 3,
JOY_AXIS_4 = 4,
JOY_AXIS_5 = 5,
JOY_AXIS_6 = 6,
JOY_AXIS_7 = 7,
JOY_AXIS_8 = 8,
JOY_AXIS_9 = 9,
JOY_AXIS_MAX = 10,
JOY_ANALOG_LX = JOY_AXIS_0,
JOY_ANALOG_LY = JOY_AXIS_1,
JOY_ANALOG_RX = JOY_AXIS_2,
JOY_ANALOG_RY = JOY_AXIS_3,
JOY_ANALOG_L2 = JOY_AXIS_6,
JOY_ANALOG_R2 = JOY_AXIS_7,
JOY_VR_ANALOG_TRIGGER = JOY_AXIS_2,
JOY_VR_ANALOG_GRIP = JOY_AXIS_4,
JOY_OPENVR_TOUCHPADX = JOY_AXIS_0,
JOY_OPENVR_TOUCHPADY = JOY_AXIS_1,
JOY_AXIS_MAX = 10 // OpenVR supports up to 5 Joysticks making a total of 10 axes.
};
enum MidiMessageList {

View file

@ -1037,7 +1037,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_SPACE);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_BUTTON_0);
joyb->set_button_index(JOY_BUTTON_A);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_accept", action);
@ -1050,7 +1050,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_SPACE);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_BUTTON_3);
joyb->set_button_index(JOY_BUTTON_Y);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_select", action);
@ -1063,7 +1063,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_ESCAPE);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_BUTTON_1);
joyb->set_button_index(JOY_BUTTON_B);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_cancel", action);
@ -1097,7 +1097,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_LEFT);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_DPAD_LEFT);
joyb->set_button_index(JOY_BUTTON_DPAD_LEFT);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_left", action);
@ -1110,7 +1110,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_RIGHT);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_DPAD_RIGHT);
joyb->set_button_index(JOY_BUTTON_DPAD_RIGHT);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_right", action);
@ -1123,7 +1123,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_UP);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_DPAD_UP);
joyb->set_button_index(JOY_BUTTON_DPAD_UP);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_up", action);
@ -1136,7 +1136,7 @@ ProjectSettings::ProjectSettings() {
key->set_keycode(KEY_DOWN);
events.push_back(key);
joyb.instance();
joyb->set_button_index(JOY_DPAD_DOWN);
joyb->set_button_index(JOY_BUTTON_DPAD_DOWN);
events.push_back(joyb);
action["events"] = events;
GLOBAL_DEF("input/ui_down", action);

View file

@ -943,212 +943,185 @@
<constant name="BUTTON_MASK_XBUTTON2" value="256" enum="ButtonList">
Extra mouse button 2 mask.
</constant>
<constant name="JOY_BUTTON_0" value="0" enum="JoystickList">
Gamepad button 0.
<constant name="JOY_INVALID_BUTTON" value="-1" enum="JoyButtonList">
An invalid game controller button.
</constant>
<constant name="JOY_BUTTON_1" value="1" enum="JoystickList">
Gamepad button 1.
<constant name="JOY_BUTTON_A" value="0" enum="JoyButtonList">
Game controller SDL button A.
</constant>
<constant name="JOY_BUTTON_2" value="2" enum="JoystickList">
Gamepad button 2.
<constant name="JOY_BUTTON_B" value="1" enum="JoyButtonList">
Game controller SDL button B.
</constant>
<constant name="JOY_BUTTON_3" value="3" enum="JoystickList">
Gamepad button 3.
<constant name="JOY_BUTTON_X" value="2" enum="JoyButtonList">
Game controller SDL button X.
</constant>
<constant name="JOY_BUTTON_4" value="4" enum="JoystickList">
Gamepad button 4.
<constant name="JOY_BUTTON_Y" value="3" enum="JoyButtonList">
Game controller SDL button Y.
</constant>
<constant name="JOY_BUTTON_5" value="5" enum="JoystickList">
Gamepad button 5.
<constant name="JOY_BUTTON_BACK" value="4" enum="JoyButtonList">
Game controller SDL back button.
</constant>
<constant name="JOY_BUTTON_6" value="6" enum="JoystickList">
Gamepad button 6.
<constant name="JOY_BUTTON_GUIDE" value="5" enum="JoyButtonList">
Game controller SDL guide button.
</constant>
<constant name="JOY_BUTTON_7" value="7" enum="JoystickList">
Gamepad button 7.
<constant name="JOY_BUTTON_START" value="6" enum="JoyButtonList">
Game controller SDL start button.
</constant>
<constant name="JOY_BUTTON_8" value="8" enum="JoystickList">
Gamepad button 8.
<constant name="JOY_BUTTON_LEFT_STICK" value="7" enum="JoyButtonList">
Game controller SDL left stick button.
</constant>
<constant name="JOY_BUTTON_9" value="9" enum="JoystickList">
Gamepad button 9.
<constant name="JOY_BUTTON_RIGHT_STICK" value="8" enum="JoyButtonList">
Game controller SDL right stick button.
</constant>
<constant name="JOY_BUTTON_10" value="10" enum="JoystickList">
Gamepad button 10.
<constant name="JOY_BUTTON_LEFT_SHOULDER" value="9" enum="JoyButtonList">
Game controller SDL left shoulder button.
</constant>
<constant name="JOY_BUTTON_11" value="11" enum="JoystickList">
Gamepad button 11.
<constant name="JOY_BUTTON_RIGHT_SHOULDER" value="10" enum="JoyButtonList">
Game controller SDL right shoulder button.
</constant>
<constant name="JOY_BUTTON_12" value="12" enum="JoystickList">
Gamepad button 12.
<constant name="JOY_BUTTON_DPAD_UP" value="11" enum="JoyButtonList">
Game controller SDL D-pad up button.
</constant>
<constant name="JOY_BUTTON_13" value="13" enum="JoystickList">
Gamepad button 13.
<constant name="JOY_BUTTON_DPAD_DOWN" value="12" enum="JoyButtonList">
Game controller SDL D-pad down button.
</constant>
<constant name="JOY_BUTTON_14" value="14" enum="JoystickList">
Gamepad button 14.
<constant name="JOY_BUTTON_DPAD_LEFT" value="13" enum="JoyButtonList">
Game controller SDL D-pad left button.
</constant>
<constant name="JOY_BUTTON_15" value="15" enum="JoystickList">
Gamepad button 15.
<constant name="JOY_BUTTON_DPAD_RIGHT" value="14" enum="JoyButtonList">
Game controller SDL D-pad right button.
</constant>
<constant name="JOY_BUTTON_MAX" value="16" enum="JoystickList">
Represents the maximum number of joystick buttons supported.
<constant name="JOY_SDL_BUTTONS" value="15" enum="JoyButtonList">
The number of SDL game controller buttons.
</constant>
<constant name="JOY_SONY_CIRCLE" value="1" enum="JoystickList">
DualShock circle button.
<constant name="JOY_SONY_X" value="0" enum="JoyButtonList">
Sony DualShock controller X button maps to SDL button A.
</constant>
<constant name="JOY_SONY_X" value="0" enum="JoystickList">
DualShock X button.
<constant name="JOY_SONY_CROSS" value="0" enum="JoyButtonList">
Sony DualShock controller cross button maps to SDL button A.
</constant>
<constant name="JOY_SONY_SQUARE" value="2" enum="JoystickList">
DualShock square button.
<constant name="JOY_SONY_CIRCLE" value="1" enum="JoyButtonList">
Sony DualShock controller circle button maps to SDL button B.
</constant>
<constant name="JOY_SONY_TRIANGLE" value="3" enum="JoystickList">
DualShock triangle button.
<constant name="JOY_SONY_SQUARE" value="2" enum="JoyButtonList">
Sony DualShock controller square button maps to SDL button X.
</constant>
<constant name="JOY_XBOX_B" value="1" enum="JoystickList">
Xbox controller B button.
<constant name="JOY_SONY_TRIANGLE" value="3" enum="JoyButtonList">
Sony DualShock controller triangle button maps to SDL button Y.
</constant>
<constant name="JOY_XBOX_A" value="0" enum="JoystickList">
Xbox controller A button.
<constant name="JOY_SONY_SELECT" value="4" enum="JoyButtonList">
Sony DualShock controller select button maps to SDL back button.
</constant>
<constant name="JOY_XBOX_X" value="2" enum="JoystickList">
Xbox controller X button.
<constant name="JOY_SONY_START" value="6" enum="JoyButtonList">
Sony DualShock controller start button maps to SDL start button.
</constant>
<constant name="JOY_XBOX_Y" value="3" enum="JoystickList">
Xbox controller Y button.
<constant name="JOY_SONY_PS" value="5" enum="JoyButtonList">
Sony DualShock controller PS button maps to SDL guide button.
</constant>
<constant name="JOY_DS_A" value="1" enum="JoystickList">
Nintendo controller A button.
<constant name="JOY_SONY_L1" value="9" enum="JoyButtonList">
Sony DualShock controller L1 button maps to SDL left shoulder button.
</constant>
<constant name="JOY_DS_B" value="0" enum="JoystickList">
Nintendo controller B button.
<constant name="JOY_SONY_R1" value="10" enum="JoyButtonList">
Sony DualShock controller R1 button maps to SDL right shoulder button.
</constant>
<constant name="JOY_DS_X" value="3" enum="JoystickList">
Nintendo controller X button.
<constant name="JOY_SONY_L3" value="7" enum="JoyButtonList">
Sony DualShock controller L3 button maps to SDL left stick button.
</constant>
<constant name="JOY_DS_Y" value="2" enum="JoystickList">
Nintendo controller Y button.
<constant name="JOY_SONY_R3" value="8" enum="JoyButtonList">
Sony DualShock controller R3 button maps to SDL right stick button.
</constant>
<constant name="JOY_VR_GRIP" value="2" enum="JoystickList">
Grip (side) buttons on a VR controller.
<constant name="JOY_XBOX_A" value="0" enum="JoyButtonList">
Xbox game controller A button maps to SDL button A.
</constant>
<constant name="JOY_VR_PAD" value="14" enum="JoystickList">
Push down on the touchpad or main joystick on a VR controller.
<constant name="JOY_XBOX_B" value="1" enum="JoyButtonList">
Xbox game controller B button maps to SDL button B.
</constant>
<constant name="JOY_VR_TRIGGER" value="15" enum="JoystickList">
Trigger on a VR controller.
<constant name="JOY_XBOX_X" value="2" enum="JoyButtonList">
Xbox game controller X button maps to SDL button X.
</constant>
<constant name="JOY_OCULUS_AX" value="7" enum="JoystickList">
A button on the right Oculus Touch controller, X button on the left controller (also when used in OpenVR).
<constant name="JOY_XBOX_Y" value="3" enum="JoyButtonList">
Xbox game controller Y button maps to SDL button Y.
</constant>
<constant name="JOY_OCULUS_BY" value="1" enum="JoystickList">
B button on the right Oculus Touch controller, Y button on the left controller (also when used in OpenVR).
<constant name="JOY_XBOX_BACK" value="4" enum="JoyButtonList">
Xbox game controller back button maps to SDL back button.
</constant>
<constant name="JOY_OCULUS_MENU" value="3" enum="JoystickList">
Menu button on either Oculus Touch controller.
<constant name="JOY_XBOX_START" value="6" enum="JoyButtonList">
Xbox game controller start button maps to SDL start button.
</constant>
<constant name="JOY_OPENVR_MENU" value="1" enum="JoystickList">
Menu button in OpenVR (Except when Oculus Touch controllers are used).
<constant name="JOY_XBOX_HOME" value="5" enum="JoyButtonList">
Xbox game controller home button maps to SDL guide button.
</constant>
<constant name="JOY_SELECT" value="10" enum="JoystickList">
Gamepad button Select.
<constant name="JOY_XBOX_LS" value="7" enum="JoyButtonList">
Xbox game controller left stick button maps to SDL left stick button.
</constant>
<constant name="JOY_START" value="11" enum="JoystickList">
Gamepad button Start.
<constant name="JOY_XBOX_RS" value="8" enum="JoyButtonList">
Xbox game controller right stick button maps to SDL right stick button.
</constant>
<constant name="JOY_DPAD_UP" value="12" enum="JoystickList">
Gamepad DPad up.
<constant name="JOY_XBOX_LB" value="9" enum="JoyButtonList">
Xbox game controller left bumper button maps to SDL left shoulder button.
</constant>
<constant name="JOY_DPAD_DOWN" value="13" enum="JoystickList">
Gamepad DPad down.
<constant name="JOY_XBOX_RB" value="10" enum="JoyButtonList">
Xbox game controller right bumper button maps to SDL right shoulder button.
</constant>
<constant name="JOY_DPAD_LEFT" value="14" enum="JoystickList">
Gamepad DPad left.
<constant name="JOY_BUTTON_MAX" value="36" enum="JoyAxisList">
The maximum number of game controller buttons.
</constant>
<constant name="JOY_DPAD_RIGHT" value="15" enum="JoystickList">
Gamepad DPad right.
<constant name="JOY_INVALID_BUTTON" value="-1" enum="JoyButtonList">
An invalid game controller axis.
</constant>
<constant name="JOY_L" value="4" enum="JoystickList">
Gamepad left Shoulder button.
<constant name="JOY_AXIS_LEFT_X" value="0" enum="JoyAxisList">
Game controller left joystick x-axis.
</constant>
<constant name="JOY_L2" value="6" enum="JoystickList">
Gamepad left trigger.
<constant name="JOY_AXIS_LEFT_Y" value="1" enum="JoyAxisList">
Game controller left joystick y-axis.
</constant>
<constant name="JOY_L3" value="8" enum="JoystickList">
Gamepad left stick click.
<constant name="JOY_AXIS_RIGHT_X" value="2" enum="JoyAxisList">
Game controller right joystick x-axis.
</constant>
<constant name="JOY_R" value="5" enum="JoystickList">
Gamepad right Shoulder button.
<constant name="JOY_AXIS_RIGHT_Y" value="3" enum="JoyAxisList">
Game controller right joystick y-axis.
</constant>
<constant name="JOY_R2" value="7" enum="JoystickList">
Gamepad right trigger.
<constant name="JOY_AXIS_TRIGGER_LEFT" value="4" enum="JoyAxisList">
Game controller left trigger axis.
</constant>
<constant name="JOY_R3" value="9" enum="JoystickList">
Gamepad right stick click.
<constant name="JOY_AXIS_TRIGGER_RIGHT" value="5" enum="JoyAxisList">
Game controller right trigger axis.
</constant>
<constant name="JOY_AXIS_0" value="0" enum="JoystickList">
Gamepad left stick horizontal axis.
<constant name="JOY_SDL_AXES" value="6" enum="JoyAxisList">
The number of SDL game controller axes.
</constant>
<constant name="JOY_AXIS_1" value="1" enum="JoystickList">
Gamepad left stick vertical axis.
<constant name="JOY_AXIS_0_X" value="0" enum="JoyAxisList">
Game controller joystick 0 x-axis.
</constant>
<constant name="JOY_AXIS_2" value="2" enum="JoystickList">
Gamepad right stick horizontal axis.
<constant name="JOY_AXIS_0_Y" value="1" enum="JoyAxisList">
Game controller joystick 0 y-axis.
</constant>
<constant name="JOY_AXIS_3" value="3" enum="JoystickList">
Gamepad right stick vertical axis.
<constant name="JOY_AXIS_1_X" value="2" enum="JoyAxisList">
Game controller joystick 1 x-axis.
</constant>
<constant name="JOY_AXIS_4" value="4" enum="JoystickList">
Generic gamepad axis 4.
<constant name="JOY_AXIS_1_Y" value="3" enum="JoyAxisList">
Game controller joystick 1 y-axis.
</constant>
<constant name="JOY_AXIS_5" value="5" enum="JoystickList">
Generic gamepad axis 5.
<constant name="JOY_AXIS_2_X" value="4" enum="JoyAxisList">
Game controller joystick 2 x-axis.
</constant>
<constant name="JOY_AXIS_6" value="6" enum="JoystickList">
Gamepad left trigger analog axis.
<constant name="JOY_AXIS_2_Y" value="5" enum="JoyAxisList">
Game controller joystick 2 y-axis.
</constant>
<constant name="JOY_AXIS_7" value="7" enum="JoystickList">
Gamepad right trigger analog axis.
<constant name="JOY_AXIS_3_X" value="6" enum="JoyAxisList">
Game controller joystick 3 x-axis.
</constant>
<constant name="JOY_AXIS_8" value="8" enum="JoystickList">
Generic gamepad axis 8.
<constant name="JOY_AXIS_3_Y" value="7" enum="JoyAxisList">
Game controller joystick 3 y-axis.
</constant>
<constant name="JOY_AXIS_9" value="9" enum="JoystickList">
Generic gamepad axis 9.
<constant name="JOY_AXIS_4_X" value="8" enum="JoyAxisList">
Game controller joystick 4 x-axis.
</constant>
<constant name="JOY_AXIS_MAX" value="10" enum="JoystickList">
Represents the maximum number of joystick axes supported.
<constant name="JOY_AXIS_4_Y" value="9" enum="JoyAxisList">
Game controller joystick 4 y-axis.
</constant>
<constant name="JOY_ANALOG_LX" value="0" enum="JoystickList">
Gamepad left stick horizontal axis.
</constant>
<constant name="JOY_ANALOG_LY" value="1" enum="JoystickList">
Gamepad left stick vertical axis.
</constant>
<constant name="JOY_ANALOG_RX" value="2" enum="JoystickList">
Gamepad right stick horizontal axis.
</constant>
<constant name="JOY_ANALOG_RY" value="3" enum="JoystickList">
Gamepad right stick vertical axis.
</constant>
<constant name="JOY_ANALOG_L2" value="6" enum="JoystickList">
Gamepad left analog trigger.
</constant>
<constant name="JOY_ANALOG_R2" value="7" enum="JoystickList">
Gamepad right analog trigger.
</constant>
<constant name="JOY_VR_ANALOG_TRIGGER" value="2" enum="JoystickList">
VR Controller analog trigger.
</constant>
<constant name="JOY_VR_ANALOG_GRIP" value="4" enum="JoystickList">
VR Controller analog grip (side buttons).
</constant>
<constant name="JOY_OPENVR_TOUCHPADX" value="0" enum="JoystickList">
OpenVR touchpad X axis (Joystick axis on Oculus Touch and Windows MR controllers).
</constant>
<constant name="JOY_OPENVR_TOUCHPADY" value="1" enum="JoystickList">
OpenVR touchpad Y axis (Joystick axis on Oculus Touch and Windows MR controllers).
<constant name="JOY_AXIS_MAX" value="10" enum="JoyAxisList">
The maximum number of game controller axes.
</constant>
<constant name="MIDI_MESSAGE_NOTE_OFF" value="8" enum="MidiMessageList">
MIDI note OFF message.

View file

@ -96,7 +96,7 @@
<argument index="1" name="axis" type="int">
</argument>
<description>
Returns the current value of the joypad axis at given index (see [enum JoystickList]).
Returns the current value of the joypad axis at given index (see [enum JoyAxisList]).
</description>
</method>
<method name="get_joy_axis_index_from_string">
@ -114,7 +114,7 @@
<argument index="0" name="axis_index" type="int">
</argument>
<description>
Receives a [enum JoystickList] axis and returns its equivalent name as a string.
Receives a [enum JoyAxisList] axis and returns its equivalent name as a string.
</description>
</method>
<method name="get_joy_button_index_from_string">
@ -132,7 +132,7 @@
<argument index="0" name="button_index" type="int">
</argument>
<description>
Receives a gamepad button from [enum JoystickList] and returns its equivalent name as a string.
Receives a gamepad button from [enum JoyButtonList] and returns its equivalent name as a string.
</description>
</method>
<method name="get_joy_guid" qualifiers="const">
@ -235,7 +235,7 @@
<argument index="1" name="button" type="int">
</argument>
<description>
Returns [code]true[/code] if you are pressing the joypad button (see [enum JoystickList]).
Returns [code]true[/code] if you are pressing the joypad button (see [enum JoyButtonList]).
</description>
</method>
<method name="is_joy_known">
@ -244,7 +244,7 @@
<argument index="0" name="device" type="int">
</argument>
<description>
Returns [code]true[/code] if the system knows the specified device. This means that it sets all button and axis indices exactly as defined in [enum JoystickList]. Unknown joypads are not expected to match these constants, but you can still retrieve events from them.
Returns [code]true[/code] if the system knows the specified device. This means that it sets all button and axis indices. Unknown joypads are not expected to match these constants, but you can still retrieve events from them.
</description>
</method>
<method name="is_key_pressed" qualifiers="const">

View file

@ -13,7 +13,7 @@
</methods>
<members>
<member name="button_index" type="int" setter="set_button_index" getter="get_button_index" default="0">
Button identifier. One of the [enum JoystickList] button constants.
Button identifier. One of the [enum JoyButtonList] button constants.
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed" default="false">
If [code]true[/code], the button's state is pressed. If [code]false[/code], the button's state is released.

View file

@ -13,7 +13,7 @@
</methods>
<members>
<member name="axis" type="int" setter="set_axis" getter="get_axis" default="0">
Axis identifier. Use one of the [enum JoystickList] axis constants.
Axis identifier. Use one of the [enum JoyAxisList] axis constants.
</member>
<member name="axis_value" type="float" setter="set_axis_value" getter="get_axis_value" default="0.0">
Current position of the joystick on the given axis. The value ranges from [code]-1.0[/code] to [code]1.0[/code]. A value of [code]0[/code] means the axis is in its resting position.

View file

@ -62,7 +62,7 @@
<argument index="0" name="button" type="int">
</argument>
<description>
Returns [code]true[/code] if the button at index [code]button[/code] is pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] constants.
Returns [code]true[/code] if the button at index [code]button[/code] is pressed. See [enum JoyButtonList].
</description>
</method>
</methods>

View file

@ -24656,7 +24656,7 @@ msgstr ""
#: doc/classes/Input.xml:99
msgid ""
"Returns the current value of the joypad axis at given index (see [enum "
"JoystickList])."
"JoyAxisList])."
msgstr ""
#: doc/classes/Input.xml:108
@ -24665,7 +24665,7 @@ msgstr ""
#: doc/classes/Input.xml:117
msgid ""
"Receives a [enum JoystickList] axis and returns its equivalent name as a "
"Receives a [enum JoyAxisList] axis and returns its equivalent name as a "
"string."
msgstr ""
@ -24675,7 +24675,7 @@ msgstr ""
#: doc/classes/Input.xml:135
msgid ""
"Receives a gamepad button from [enum JoystickList] and returns its "
"Receives a gamepad button from [enum JoyButtonList] and returns its "
"equivalent name as a string."
msgstr ""
@ -24750,15 +24750,14 @@ msgstr ""
#: doc/classes/Input.xml:238
msgid ""
"Returns [code]true[/code] if you are pressing the joypad button (see [enum "
"JoystickList])."
"JoyButtonList])."
msgstr ""
#: doc/classes/Input.xml:247
msgid ""
"Returns [code]true[/code] if the system knows the specified device. This "
"means that it sets all button and axis indices exactly as defined in [enum "
"JoystickList]. Unknown joypads are not expected to match these constants, "
"but you can still retrieve events from them."
"means that it sets all button and axis indices. Unknown joypads are not "
"expected to match these constants, but you can still retrieve events from them."
msgstr ""
#: doc/classes/Input.xml:256
@ -25150,7 +25149,7 @@ msgid ""
msgstr ""
#: doc/classes/InputEventJoypadButton.xml:16
msgid "Button identifier. One of the [enum JoystickList] button constants."
msgid "Button identifier. One of the [enum JoyButtonList] button constants."
msgstr ""
#: doc/classes/InputEventJoypadButton.xml:19
@ -25178,7 +25177,7 @@ msgid ""
msgstr ""
#: doc/classes/InputEventJoypadMotion.xml:16
msgid "Axis identifier. Use one of the [enum JoystickList] axis constants."
msgid "Axis identifier. Use one of the [enum JoyAxisList] axis constants."
msgstr ""
#: doc/classes/InputEventJoypadMotion.xml:19
@ -57946,8 +57945,7 @@ msgstr ""
#: doc/classes/XRController3D.xml:65
msgid ""
"Returns [code]true[/code] if the button at index [code]button[/code] is "
"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] "
"constants."
"pressed. See [enum JoyButtonList]."
msgstr ""
#: doc/classes/XRController3D.xml:71

View file

@ -24666,7 +24666,7 @@ msgstr ""
#: doc/classes/Input.xml:99
msgid ""
"Returns the current value of the joypad axis at given index (see [enum "
"JoystickList])."
"JoyAxisList])."
msgstr ""
#: doc/classes/Input.xml:108
@ -24675,7 +24675,7 @@ msgstr ""
#: doc/classes/Input.xml:117
msgid ""
"Receives a [enum JoystickList] axis and returns its equivalent name as a "
"Receives a [enum JoyAxisList] axis and returns its equivalent name as a "
"string."
msgstr ""
@ -24685,7 +24685,7 @@ msgstr ""
#: doc/classes/Input.xml:135
msgid ""
"Receives a gamepad button from [enum JoystickList] and returns its "
"Receives a gamepad button from [enum JoyButtonList] and returns its "
"equivalent name as a string."
msgstr ""
@ -24760,15 +24760,14 @@ msgstr ""
#: doc/classes/Input.xml:238
msgid ""
"Returns [code]true[/code] if you are pressing the joypad button (see [enum "
"JoystickList])."
"JoyButtonList])."
msgstr ""
#: doc/classes/Input.xml:247
msgid ""
"Returns [code]true[/code] if the system knows the specified device. This "
"means that it sets all button and axis indices exactly as defined in [enum "
"JoystickList]. Unknown joypads are not expected to match these constants, "
"but you can still retrieve events from them."
"means that it sets all button and axis indices. Unknown joypads are not "
"expected to match these constants, but you can still retrieve events from them."
msgstr ""
#: doc/classes/Input.xml:256
@ -25160,7 +25159,7 @@ msgid ""
msgstr ""
#: doc/classes/InputEventJoypadButton.xml:16
msgid "Button identifier. One of the [enum JoystickList] button constants."
msgid "Button identifier. One of the [enum JoyButtonList] button constants."
msgstr ""
#: doc/classes/InputEventJoypadButton.xml:19
@ -25188,7 +25187,7 @@ msgid ""
msgstr ""
#: doc/classes/InputEventJoypadMotion.xml:16
msgid "Axis identifier. Use one of the [enum JoystickList] axis constants."
msgid "Axis identifier. Use one of the [enum JoyAxisList] axis constants."
msgstr ""
#: doc/classes/InputEventJoypadMotion.xml:19
@ -57956,8 +57955,7 @@ msgstr ""
#: doc/classes/XRController3D.xml:65
msgid ""
"Returns [code]true[/code] if the button at index [code]button[/code] is "
"pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] "
"constants."
"pressed. See [enum JoyButtonList]."
msgstr ""
#: doc/classes/XRController3D.xml:71

View file

@ -43,37 +43,45 @@
ProjectSettingsEditor *ProjectSettingsEditor::singleton = nullptr;
static const char *_button_names[JOY_BUTTON_MAX] = {
"DualShock Cross, Xbox A, Nintendo B",
"DualShock Circle, Xbox B, Nintendo A",
"DualShock Square, Xbox X, Nintendo Y",
"DualShock Triangle, Xbox Y, Nintendo X",
"L, L1",
"R, R1",
"L2",
"R2",
"L3",
"R3",
"Select, DualShock Share, Nintendo -",
"Start, DualShock Options, Nintendo +",
static const char *_button_descriptions[JOY_SDL_BUTTONS] = {
"Face Bottom, DualShock Cross, Xbox A, Nintendo B",
"Face Right, DualShock Circle, Xbox B, Nintendo A",
"Face Left, DualShock Square, Xbox X, Nintendo Y",
"Face Top, DualShock Triangle, Xbox Y, Nintendo X",
"DualShock Select, Xbox Back, Nintendo -",
"Home, DualShock PS, Guide",
"Start, Nintendo +",
"Left Stick, DualShock L3, Xbox L/LS",
"Right Stick, DualShock R3, Xbox R/RS",
"Left Shoulder, DualShock L1, Xbox LB",
"Right Shoulder, DualShock R1, Xbox RB",
"D-Pad Up",
"D-Pad Down",
"D-Pad Left",
"D-Pad Right"
};
static const char *_axis_names[JOY_AXIS_MAX * 2] = {
" (Left Stick Left)",
" (Left Stick Right)",
" (Left Stick Up)",
" (Left Stick Down)",
" (Right Stick Left)",
" (Right Stick Right)",
" (Right Stick Up)",
" (Right Stick Down)",
"", "", "", "",
"", " (L2)",
"", " (R2)"
static const char *_axis_descriptions[JOY_AXIS_MAX * 2] = {
"Left Stick Left",
"Left Stick Right",
"Left Stick Up",
"Left Stick Down",
"Right Stick Left",
"Right Stick Right",
"Right Stick Up",
"Right Stick Down",
"Joystick 2 Left",
"Joystick 2 Right, Left Trigger, L2, LT",
"Joystick 2 Up",
"Joystick 2 Down, Right Trigger, R2, RT",
"Joystick 3 Left",
"Joystick 3 Right",
"Joystick 3 Up",
"Joystick 3 Down",
"Joystick 4 Left",
"Joystick 4 Right",
"Joystick 4 Up",
"Joystick 4 Down",
};
void ProjectSettingsEditor::_unhandled_input(const Ref<InputEvent> &p_event) {
@ -527,9 +535,9 @@ void ProjectSettingsEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_even
device_index_label->set_text(TTR("Joypad Axis Index:"));
device_index->clear();
for (int i = 0; i < JOY_AXIS_MAX * 2; i++) {
String desc = _axis_names[i];
device_index->add_item(TTR("Axis") + " " + itos(i / 2) + " " + ((i & 1) ? "+" : "-") + desc);
String desc = TTR("Axis") + " " + itos(i / 2) + " " + ((i & 1) ? "+" : "-") +
" (" + TTR(_axis_descriptions[i]) + ")";
device_index->add_item(desc);
}
device_input->popup_centered(Size2(350, 95) * EDSCALE);
@ -548,10 +556,11 @@ void ProjectSettingsEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_even
device_index_label->set_text(TTR("Joypad Button Index:"));
device_index->clear();
for (int i = 0; i < JOY_BUTTON_MAX; i++) {
device_index->add_item(itos(i) + ": " + String(_button_names[i]));
String desc = TTR("Button") + " " + itos(i);
if (i < JOY_SDL_BUTTONS)
desc += " (" + TTR(_button_descriptions[i]) + ")";
device_index->add_item(desc);
}
device_input->popup_centered(Size2(350, 95) * EDSCALE);
@ -792,9 +801,10 @@ void ProjectSettingsEditor::_update_actions() {
if (jb.is_valid()) {
String str = _get_device_string(jb->get_device()) + ", " + TTR("Button") + " " + itos(jb->get_button_index());
if (jb->get_button_index() >= 0 && jb->get_button_index() < JOY_BUTTON_MAX) {
str += String() + " (" + _button_names[jb->get_button_index()] + ")";
String str = _get_device_string(jb->get_device()) + ", " +
TTR("Button") + " " + itos(jb->get_button_index());
if (jb->get_button_index() >= 0 && jb->get_button_index() < JOY_SDL_BUTTONS) {
str += String() + " (" + TTR(_button_descriptions[jb->get_button_index()]) + ")";
}
action2->set_text(0, str);
@ -835,8 +845,9 @@ void ProjectSettingsEditor::_update_actions() {
int ax = jm->get_axis();
int n = 2 * ax + (jm->get_axis_value() < 0 ? 0 : 1);
String desc = _axis_names[n];
String str = _get_device_string(jm->get_device()) + ", " + TTR("Axis") + " " + itos(ax) + " " + (jm->get_axis_value() < 0 ? "-" : "+") + desc;
String str = _get_device_string(jm->get_device()) + ", " +
TTR("Axis") + " " + itos(ax) + " " + (jm->get_axis_value() < 0 ? "-" : "+") +
" (" + _axis_descriptions[n] + ")";
action2->set_text(0, str);
action2->set_icon(0, input_editor->get_theme_icon("JoyAxis", "EditorIcons"));
}

View file

@ -247,37 +247,31 @@ static void on_focus_in(ViewController *view_controller, bool *is_focus_out) {
int joy_id = [self getJoyIdForController:controller];
if (element == gamepad.buttonA) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_A,
gamepad.buttonA.isPressed);
} else if (element == gamepad.buttonB) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_1,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_B,
gamepad.buttonB.isPressed);
} else if (element == gamepad.buttonX) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_X,
gamepad.buttonX.isPressed);
} else if (element == gamepad.buttonY) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_3,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_Y,
gamepad.buttonY.isPressed);
} else if (element == gamepad.leftShoulder) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_L,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_LEFT_SHOULDER,
gamepad.leftShoulder.isPressed);
} else if (element == gamepad.rightShoulder) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_R,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_RIGHT_SHOULDER,
gamepad.rightShoulder.isPressed);
} else if (element == gamepad.leftTrigger) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_L2,
gamepad.leftTrigger.isPressed);
} else if (element == gamepad.rightTrigger) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_R2,
gamepad.rightTrigger.isPressed);
} else if (element == gamepad.dpad) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_UP,
gamepad.dpad.up.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_DOWN,
gamepad.dpad.down.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_LEFT,
gamepad.dpad.left.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_RIGHT,
gamepad.dpad.right.isPressed);
};
@ -285,20 +279,20 @@ static void on_focus_in(ViewController *view_controller, bool *is_focus_out) {
jx.min = -1;
if (element == gamepad.leftThumbstick) {
jx.value = gamepad.leftThumbstick.xAxis.value;
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_LX, jx);
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_AXIS_LEFT_X, jx);
jx.value = -gamepad.leftThumbstick.yAxis.value;
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_LY, jx);
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_AXIS_LEFT_Y, jx);
} else if (element == gamepad.rightThumbstick) {
jx.value = gamepad.rightThumbstick.xAxis.value;
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_RX, jx);
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_AXIS_RIGHT_X, jx);
jx.value = -gamepad.rightThumbstick.yAxis.value;
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_RY, jx);
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_AXIS_RIGHT_Y, jx);
} else if (element == gamepad.leftTrigger) {
jx.value = gamepad.leftTrigger.value;
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_L2, jx);
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_AXIS_TRIGGER_LEFT, jx);
} else if (element == gamepad.rightTrigger) {
jx.value = gamepad.rightTrigger.value;
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_ANALOG_R2, jx);
OSIPhone::get_singleton()->joy_axis(joy_id, JOY_AXIS_TRIGGER_RIGHT, jx);
};
};
} else if (controller.gamepad != nil) {
@ -309,31 +303,31 @@ static void on_focus_in(ViewController *view_controller, bool *is_focus_out) {
int joy_id = [self getJoyIdForController:controller];
if (element == gamepad.buttonA) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_A,
gamepad.buttonA.isPressed);
} else if (element == gamepad.buttonB) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_1,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_B,
gamepad.buttonB.isPressed);
} else if (element == gamepad.buttonX) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_X,
gamepad.buttonX.isPressed);
} else if (element == gamepad.buttonY) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_3,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_Y,
gamepad.buttonY.isPressed);
} else if (element == gamepad.leftShoulder) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_L,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_LEFT_SHOULDER,
gamepad.leftShoulder.isPressed);
} else if (element == gamepad.rightShoulder) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_R,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_RIGHT_SHOULDER,
gamepad.rightShoulder.isPressed);
} else if (element == gamepad.dpad) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_UP,
gamepad.dpad.up.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_DOWN,
gamepad.dpad.down.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_LEFT,
gamepad.dpad.left.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_RIGHT,
gamepad.dpad.right.isPressed);
};
};
@ -347,19 +341,19 @@ static void on_focus_in(ViewController *view_controller, bool *is_focus_out) {
int joy_id = [self getJoyIdForController:controller];
if (element == gamepad.buttonA) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_0,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_A,
gamepad.buttonA.isPressed);
} else if (element == gamepad.buttonX) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_2,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_X,
gamepad.buttonX.isPressed);
} else if (element == gamepad.dpad) {
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_UP,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_UP,
gamepad.dpad.up.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_DOWN,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_DOWN,
gamepad.dpad.down.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_LEFT,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_LEFT,
gamepad.dpad.left.isPressed);
OSIPhone::get_singleton()->joy_button(joy_id, JOY_DPAD_RIGHT,
OSIPhone::get_singleton()->joy_button(joy_id, JOY_BUTTON_DPAD_RIGHT,
gamepad.dpad.right.isPressed);
};
};

View file

@ -659,14 +659,7 @@ void DisplayServerJavaScript::process_joypads() {
for (int button = 0; button < button_count; button++) {
float value = state.analogButton[button];
if (String::utf8(state.mapping) == "standard" && (button == JOY_ANALOG_L2 || button == JOY_ANALOG_R2)) {
Input::JoyAxis joy_axis;
joy_axis.min = 0;
joy_axis.value = value;
input->joy_axis(joypad, button, joy_axis);
} else {
input->joy_button(joypad, button, value);
}
input->joy_button(joypad, button, value);
}
for (int axis = 0; axis < axis_count; axis++) {

View file

@ -64,12 +64,12 @@ void JoypadUWP::process_controllers() {
button_mask *= 2;
}
input->joy_axis(joy.id, JOY_AXIS_0, axis_correct(reading.LeftThumbstickX));
input->joy_axis(joy.id, JOY_AXIS_1, axis_correct(reading.LeftThumbstickY, true));
input->joy_axis(joy.id, JOY_AXIS_2, axis_correct(reading.RightThumbstickX));
input->joy_axis(joy.id, JOY_AXIS_3, axis_correct(reading.RightThumbstickY, true));
input->joy_axis(joy.id, JOY_AXIS_4, axis_correct(reading.LeftTrigger, false, true));
input->joy_axis(joy.id, JOY_AXIS_5, axis_correct(reading.RightTrigger, false, true));
input->joy_axis(joy.id, JOY_AXIS_LEFT_X, axis_correct(reading.LeftThumbstickX));
input->joy_axis(joy.id, JOY_AXIS_LEFT_Y, axis_correct(reading.LeftThumbstickY, true));
input->joy_axis(joy.id, JOY_AXIS_RIGHT_X, axis_correct(reading.RightThumbstickX));
input->joy_axis(joy.id, JOY_AXIS_RIGHT_Y, axis_correct(reading.RightThumbstickY, true));
input->joy_axis(joy.id, JOY_AXIS_TRIGGER_LEFT, axis_correct(reading.LeftTrigger, false, true));
input->joy_axis(joy.id, JOY_AXIS_TRIGGER_RIGHT, axis_correct(reading.RightTrigger, false, true));
uint64_t timestamp = input->get_joy_vibration_timestamp(joy.id);
if (timestamp > joy.ff_timestamp) {

View file

@ -347,12 +347,12 @@ void JoypadWindows::process_joypads() {
button_mask = button_mask * 2;
}
input->joy_axis(joy.id, JOY_AXIS_0, axis_correct(joy.state.Gamepad.sThumbLX, true));
input->joy_axis(joy.id, JOY_AXIS_1, axis_correct(joy.state.Gamepad.sThumbLY, true, false, true));
input->joy_axis(joy.id, JOY_AXIS_2, axis_correct(joy.state.Gamepad.sThumbRX, true));
input->joy_axis(joy.id, JOY_AXIS_3, axis_correct(joy.state.Gamepad.sThumbRY, true, false, true));
input->joy_axis(joy.id, JOY_AXIS_4, axis_correct(joy.state.Gamepad.bLeftTrigger, true, true));
input->joy_axis(joy.id, JOY_AXIS_5, axis_correct(joy.state.Gamepad.bRightTrigger, true, true));
input->joy_axis(joy.id, JOY_AXIS_LEFT_X, axis_correct(joy.state.Gamepad.sThumbLX, true));
input->joy_axis(joy.id, JOY_AXIS_LEFT_Y, axis_correct(joy.state.Gamepad.sThumbLY, true, false, true));
input->joy_axis(joy.id, JOY_AXIS_RIGHT_X, axis_correct(joy.state.Gamepad.sThumbRX, true));
input->joy_axis(joy.id, JOY_AXIS_RIGHT_Y, axis_correct(joy.state.Gamepad.sThumbRY, true, false, true));
input->joy_axis(joy.id, JOY_AXIS_TRIGGER_LEFT, axis_correct(joy.state.Gamepad.bLeftTrigger, true, true));
input->joy_axis(joy.id, JOY_AXIS_TRIGGER_RIGHT, axis_correct(joy.state.Gamepad.bRightTrigger, true, true));
joy.last_packet = joy.state.dwPacketNumber;
}
uint64_t timestamp = input->get_joy_vibration_timestamp(joy.id);