From 1176e078b965994964e7699efd41d9a8958db6da Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Thu, 23 Apr 2020 10:16:09 +0100 Subject: Parse SDL game controller half axis and inverted axis entries. --- core/input/input.cpp | 317 +++++++++++++++++++++++++++++-------------- core/input/input.h | 79 ++++++++++- core/input/input_builders.py | 13 +- 3 files changed, 288 insertions(+), 121 deletions(-) diff --git a/core/input/input.cpp b/core/input/input.cpp index 357e4c06c1..8d0686cce4 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -831,21 +831,9 @@ void Input::joy_button(int p_device, int p_button, bool p_pressed) { return; } - const Map::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,13 +889,7 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { return; }; - const Map::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); if (map.type == TYPE_BUTTON) { //send axis event for triggers @@ -976,12 +958,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 = SDL_BUTTON_DPAD_UP; + map[HAT_UP].value = 0; + + map[HAT_RIGHT].type = TYPE_BUTTON; + map[HAT_RIGHT].index = SDL_BUTTON_DPAD_RIGHT; + map[HAT_RIGHT].value = 0; + + map[HAT_DOWN].type = TYPE_BUTTON; + map[HAT_DOWN].index = SDL_BUTTON_DPAD_DOWN; + map[HAT_DOWN].value = 0; + + map[HAT_LEFT].type = TYPE_BUTTON; + map[HAT_LEFT].index = SDL_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 +1021,145 @@ 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 SDLExtendedJoyBind 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; + break; + case TYPE_AXIS: + event.index = binding.output.axis.axis; + break; + 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) { - 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 SDLExtendedJoyBind binding = mapping.bindings[i]; + if (binding.inputType == TYPE_AXIS && binding.input.axis.axis == p_axis) { + event.type = binding.outputType; + switch (binding.outputType) { + case TYPE_BUTTON: + event.index = binding.output.button; + break; + case TYPE_AXIS: + event.index = binding.output.axis.axis; + break; + default: + ERR_PRINT_ONCE("Joypad button 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 SDLExtendedJoyBind 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."); + } + } + } +} + +static const char *sdl_buttons[] = { + "a", + "b", + "x", + "y", + "back", + "guide", + "start", + "leftstick", + "rightstick", + "leftshoulder", + "rightshoulder", + "dpup", + "dpdown", + "dpleft", + "dpright", + nullptr +}; + +Input::SDLJoyButton Input::_get_output_button(String output) { + + for (int i = 0; sdl_buttons[i]; i++) { + if (output == sdl_buttons[i]) + return SDLJoyButton(i); + } + return SDLJoyButton::SDL_INVALID_BUTTON; +} + +static const char *sdl_axes[] = { + "leftx", + "lefty", + "rightx", + "righty", + "lefttrigger", + "righttrigger", + nullptr }; +Input::SDLJoyAxis Input::_get_output_axis(String output) { + + for (int i = 0; sdl_axes[i]; i++) { + if (output == sdl_axes[i]) + return SDLJoyAxis(i); + } + return SDLJoyAxis::SDL_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 entry = p_mapping.split(","); if (entry.size() < 2) { @@ -1087,45 +1178,83 @@ 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") { - - int aid = from.substr(1, from.length() - 1).to_int(); - mapping.axis[aid] = to_event; - - } else if (etype == "b") { + 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 bid = from.substr(1, from.length() - 1).to_int(); - mapping.buttons[bid] = 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; + + SDLJoyButton output_button = _get_output_button(output); + SDLJoyAxis output_axis = _get_output_axis(output); + ERR_CONTINUE_MSG(output_button == SDL_INVALID_BUTTON && output_axis == SDL_INVALID_AXIS, + String(entry[idx] + "\nUnrecognised output string: " + output)); + ERR_CONTINUE_MSG(output_button != SDL_INVALID_BUTTON && output_axis != SDL_INVALID_AXIS, + String("BUG: Output string matched both button and axis: " + output)); + + SDLExtendedJoyBind binding; + if (output_button != SDL_INVALID_BUTTON) { + binding.outputType = TYPE_BUTTON; + binding.output.button = output_button; + } else if (output_axis != SDL_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; + if (invert_axis) { + int int_range = static_cast(input_range); + int_range = -int_range; + binding.input.axis.range = static_cast(int_range); + } + 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(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) { @@ -1268,22 +1397,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. diff --git a/core/input/input.h b/core/input/input.h index 2e136dbf02..f95dff47a9 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -183,26 +183,91 @@ private: TYPE_MAX, }; + enum SDLJoyButton { + SDL_INVALID_BUTTON = -1, + SDL_BUTTON_A, + SDL_BUTTON_B, + SDL_BUTTON_X, + SDL_BUTTON_Y, + SDL_BUTTON_BACK, + SDL_BUTTON_GUIDE, + SDL_BUTTON_START, + SDL_BUTTON_LEFTSTICK, + SDL_BUTTON_RIGHTSTICK, + SDL_BUTTON_LEFTSHOULDER, + SDL_BUTTON_RIGHTSHOULDER, + SDL_BUTTON_DPAD_UP, + SDL_BUTTON_DPAD_DOWN, + SDL_BUTTON_DPAD_LEFT, + SDL_BUTTON_DPAD_RIGHT, + SDL_BUTTON_MAX + }; + + enum SDLJoyAxis { + SDL_INVALID_AXIS = -1, + SDL_AXIS_LEFTX, + SDL_AXIS_LEFTY, + SDL_AXIS_RIGHTX, + SDL_AXIS_RIGHTY, + SDL_AXIS_TRIGGERLEFT, + SDL_AXIS_TRIGGERRIGHT, + SDL_AXIS_MAX, + }; + + enum JoyAxisRange { + NEGATIVE_HALF_AXIS = -1, + FULL_AXIS = 0, + POSITIVE_HALF_AXIS = 1 + }; + struct JoyEvent { int type; int index; int value; }; - struct JoyDeviceMapping { + struct SDLExtendedJoyBind { + JoyType inputType; + union { + int button; + + struct { + int axis; + JoyAxisRange range; + } axis; + struct { + int hat; + HatMask hat_mask; + } hat; + + } input; + + JoyType outputType; + union { + SDLJoyButton button; + + struct { + SDLJoyAxis axis; + JoyAxisRange range; + } axis; + + } output; + }; + + struct JoyDeviceMapping { String uid; String name; - Map buttons; - Map axis; - JoyEvent hat[HAT_MAX]; + Vector bindings; }; - JoyEvent hat_map_default[HAT_MAX]; - Vector 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); + void _get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, JoyEvent r_events[HAT_MAX]); + SDLJoyButton _get_output_button(String output); + SDLJoyAxis _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); diff --git a/core/input/input_builders.py b/core/input/input_builders.py index 53b90f2073..748ec06133 100644 --- a/core/input/input_builders.py +++ b/core/input/input_builders.py @@ -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", -- cgit v1.2.3 From e7fee711b3d2417720ecfae86bc9351927f6daa0 Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Thu, 23 Apr 2020 13:01:36 +0100 Subject: Update game controller enums. --- core/global_constants.cpp | 133 +++++------ core/input/input.cpp | 248 ++++++++++---------- core/input/input.h | 49 +--- core/input/input_event.h | 170 +++++++------- core/project_settings.cpp | 14 +- doc/classes/@GlobalScope.xml | 267 ++++++++++------------ doc/classes/Input.xml | 10 +- doc/classes/InputEventJoypadButton.xml | 2 +- doc/classes/InputEventJoypadMotion.xml | 2 +- doc/classes/XRController3D.xml | 2 +- doc/translations/classes.pot | 20 +- doc/translations/fr.po | 20 +- editor/project_settings_editor.cpp | 83 ++++--- platform/iphone/app_delegate.mm | 70 +++--- platform/javascript/display_server_javascript.cpp | 9 +- platform/uwp/joypad_uwp.cpp | 12 +- platform/windows/joypad_windows.cpp | 12 +- 17 files changed, 520 insertions(+), 603 deletions(-) diff --git a/core/global_constants.cpp b/core/global_constants.cpp index afcb283e05..4f415a2056 100644 --- a/core/global_constants.cpp +++ b/core/global_constants.cpp @@ -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); diff --git a/core/input/input.cpp b/core/input/input.cpp index 8d0686cce4..97757cc965 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -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; @@ -892,23 +972,17 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { JoyEvent map = _get_mapped_axis_event(map_db[joy.mapping], p_axis); 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))) { @@ -917,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))) { @@ -935,12 +1010,14 @@ 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; } @@ -961,19 +1038,19 @@ void Input::joy_hat(int p_device, int p_val) { JoyEvent map[HAT_MAX]; map[HAT_UP].type = TYPE_BUTTON; - map[HAT_UP].index = SDL_BUTTON_DPAD_UP; + map[HAT_UP].index = JOY_BUTTON_DPAD_UP; map[HAT_UP].value = 0; map[HAT_RIGHT].type = TYPE_BUTTON; - map[HAT_RIGHT].index = SDL_BUTTON_DPAD_RIGHT; + map[HAT_RIGHT].index = JOY_BUTTON_DPAD_RIGHT; map[HAT_RIGHT].value = 0; map[HAT_DOWN].type = TYPE_BUTTON; - map[HAT_DOWN].index = SDL_BUTTON_DPAD_DOWN; + map[HAT_DOWN].index = JOY_BUTTON_DPAD_DOWN; map[HAT_DOWN].value = 0; map[HAT_LEFT].type = TYPE_BUTTON; - map[HAT_LEFT].index = SDL_BUTTON_DPAD_LEFT; + map[HAT_LEFT].index = JOY_BUTTON_DPAD_LEFT; map[HAT_LEFT].value = 0; if (joy.mapping != -1) { @@ -1027,7 +1104,7 @@ Input::JoyEvent Input::_get_mapped_button_event(const JoyDeviceMapping &mapping, event.type = TYPE_MAX; for (int i = 0; i < mapping.bindings.size(); i++) { - const SDLExtendedJoyBind binding = mapping.bindings[i]; + const JoyBinding binding = mapping.bindings[i]; if (binding.inputType == TYPE_BUTTON && binding.input.button == p_button) { event.type = binding.outputType; switch (binding.outputType) { @@ -1051,7 +1128,7 @@ Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, i event.type = TYPE_MAX; for (int i = 0; i < mapping.bindings.size(); i++) { - const SDLExtendedJoyBind binding = mapping.bindings[i]; + const JoyBinding binding = mapping.bindings[i]; if (binding.inputType == TYPE_AXIS && binding.input.axis.axis == p_axis) { event.type = binding.outputType; switch (binding.outputType) { @@ -1072,7 +1149,7 @@ Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, i void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, JoyEvent r_events[]) { for (int i = 0; i < mapping.bindings.size(); i++) { - const SDLExtendedJoyBind binding = mapping.bindings[i]; + const JoyBinding binding = mapping.bindings[i]; if (binding.inputType == TYPE_HAT && binding.input.hat.hat == p_hat) { int index; @@ -1109,51 +1186,22 @@ void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, J } } -static const char *sdl_buttons[] = { - "a", - "b", - "x", - "y", - "back", - "guide", - "start", - "leftstick", - "rightstick", - "leftshoulder", - "rightshoulder", - "dpup", - "dpdown", - "dpleft", - "dpright", - nullptr -}; +JoyButtonList Input::_get_output_button(String output) { -Input::SDLJoyButton Input::_get_output_button(String output) { - - for (int i = 0; sdl_buttons[i]; i++) { - if (output == sdl_buttons[i]) - return SDLJoyButton(i); + for (int i = 0; _joy_buttons[i]; i++) { + if (output == _joy_buttons[i]) + return JoyButtonList(i); } - return SDLJoyButton::SDL_INVALID_BUTTON; + return JoyButtonList::JOY_INVALID_BUTTON; } -static const char *sdl_axes[] = { - "leftx", - "lefty", - "rightx", - "righty", - "lefttrigger", - "righttrigger", - nullptr -}; - -Input::SDLJoyAxis Input::_get_output_axis(String output) { +JoyAxisList Input::_get_output_axis(String output) { - for (int i = 0; sdl_axes[i]; i++) { - if (output == sdl_axes[i]) - return SDLJoyAxis(i); + for (int i = 0; _joy_axes[i]; i++) { + if (output == _joy_axes[i]) + return JoyAxisList(i); } - return SDLJoyAxis::SDL_INVALID_AXIS; + return JoyAxisList::JOY_INVALID_AXIS; } void Input::parse_mapping(String p_mapping) { @@ -1208,18 +1256,18 @@ void Input::parse_mapping(String p_mapping) { if (input[input.length() - 1] == '~') invert_axis = true; - SDLJoyButton output_button = _get_output_button(output); - SDLJoyAxis output_axis = _get_output_axis(output); - ERR_CONTINUE_MSG(output_button == SDL_INVALID_BUTTON && output_axis == SDL_INVALID_AXIS, + 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 != SDL_INVALID_BUTTON && output_axis != SDL_INVALID_AXIS, + ERR_CONTINUE_MSG(output_button != JOY_INVALID_BUTTON && output_axis != JOY_INVALID_AXIS, String("BUG: Output string matched both button and axis: " + output)); - SDLExtendedJoyBind binding; - if (output_button != SDL_INVALID_BUTTON) { + JoyBinding binding; + if (output_button != JOY_INVALID_BUTTON) { binding.outputType = TYPE_BUTTON; binding.output.button = output_button; - } else if (output_axis != SDL_INVALID_AXIS) { + } else if (output_axis != JOY_INVALID_AXIS) { binding.outputType = TYPE_AXIS; binding.output.axis.axis = output_axis; binding.output.axis.range = output_range; @@ -1316,50 +1364,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() { @@ -1372,17 +1388,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() { diff --git a/core/input/input.h b/core/input/input.h index f95dff47a9..ef50973827 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -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,37 +181,6 @@ private: TYPE_MAX, }; - enum SDLJoyButton { - SDL_INVALID_BUTTON = -1, - SDL_BUTTON_A, - SDL_BUTTON_B, - SDL_BUTTON_X, - SDL_BUTTON_Y, - SDL_BUTTON_BACK, - SDL_BUTTON_GUIDE, - SDL_BUTTON_START, - SDL_BUTTON_LEFTSTICK, - SDL_BUTTON_RIGHTSTICK, - SDL_BUTTON_LEFTSHOULDER, - SDL_BUTTON_RIGHTSHOULDER, - SDL_BUTTON_DPAD_UP, - SDL_BUTTON_DPAD_DOWN, - SDL_BUTTON_DPAD_LEFT, - SDL_BUTTON_DPAD_RIGHT, - SDL_BUTTON_MAX - }; - - enum SDLJoyAxis { - SDL_INVALID_AXIS = -1, - SDL_AXIS_LEFTX, - SDL_AXIS_LEFTY, - SDL_AXIS_RIGHTX, - SDL_AXIS_RIGHTY, - SDL_AXIS_TRIGGERLEFT, - SDL_AXIS_TRIGGERRIGHT, - SDL_AXIS_MAX, - }; - enum JoyAxisRange { NEGATIVE_HALF_AXIS = -1, FULL_AXIS = 0, @@ -226,7 +193,7 @@ private: int value; }; - struct SDLExtendedJoyBind { + struct JoyBinding { JoyType inputType; union { int button; @@ -245,10 +212,10 @@ private: JoyType outputType; union { - SDLJoyButton button; + JoyButtonList button; struct { - SDLJoyAxis axis; + JoyAxisList axis; JoyAxisRange range; } axis; @@ -258,7 +225,7 @@ private: struct JoyDeviceMapping { String uid; String name; - Vector bindings; + Vector bindings; }; Vector map_db; @@ -266,8 +233,8 @@ private: JoyEvent _get_mapped_button_event(const JoyDeviceMapping &mapping, int p_button); JoyEvent _get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis); void _get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, JoyEvent r_events[HAT_MAX]); - SDLJoyButton _get_output_button(String output); - SDLJoyAxis _get_output_axis(String output); + 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); diff --git a/core/input/input_event.h b/core/input/input_event.h index 8774b3b1db..99ea2efee9 100644 --- a/core/input/input_event.h +++ b/core/input/input_event.h @@ -59,98 +59,84 @@ enum ButtonList { BUTTON_MASK_XBUTTON2 = (1 << (BUTTON_XBUTTON2 - 1)) }; -enum JoystickList { - - 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_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, - - JOY_SONY_CIRCLE = JOY_BUTTON_1, - JOY_SONY_X = JOY_BUTTON_0, - JOY_SONY_SQUARE = JOY_BUTTON_2, - JOY_SONY_TRIANGLE = JOY_BUTTON_3, - - JOY_XBOX_A = JOY_BUTTON_0, - JOY_XBOX_B = JOY_BUTTON_1, - JOY_XBOX_X = JOY_BUTTON_2, - JOY_XBOX_Y = JOY_BUTTON_3, - - 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_WII_C = JOY_BUTTON_5, - JOY_WII_Z = JOY_BUTTON_6, - - JOY_WII_MINUS = JOY_BUTTON_10, - JOY_WII_PLUS = JOY_BUTTON_11, - - JOY_VR_GRIP = JOY_BUTTON_2, - JOY_VR_PAD = JOY_BUTTON_14, - JOY_VR_TRIGGER = JOY_BUTTON_15, - - JOY_OCULUS_AX = JOY_BUTTON_7, - JOY_OCULUS_BY = JOY_BUTTON_1, - JOY_OCULUS_MENU = JOY_BUTTON_3, - - 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, +enum JoyButtonList { + + JOY_INVALID_BUTTON = -1, + + // 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, + + // 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, + + // 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_BUTTON_MAX = 36 // Apparently Android supports up to 36 buttons. +}; + +enum JoyAxisList { + + JOY_INVALID_AXIS = -1, + + // 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, + + // 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_AXIS_MAX = 10 // OpenVR supports up to 5 Joysticks making a total of 10 axes. }; enum MidiMessageList { diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 8829181489..12522281d0 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -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); diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 602ad43103..bf2ce321ac 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -943,212 +943,185 @@ Extra mouse button 2 mask. - - Gamepad button 0. + + An invalid game controller button. - - Gamepad button 1. + + Game controller SDL button A. - - Gamepad button 2. + + Game controller SDL button B. - - Gamepad button 3. + + Game controller SDL button X. - - Gamepad button 4. + + Game controller SDL button Y. - - Gamepad button 5. + + Game controller SDL back button. - - Gamepad button 6. + + Game controller SDL guide button. - - Gamepad button 7. + + Game controller SDL start button. - - Gamepad button 8. + + Game controller SDL left stick button. - - Gamepad button 9. + + Game controller SDL right stick button. - - Gamepad button 10. + + Game controller SDL left shoulder button. - - Gamepad button 11. + + Game controller SDL right shoulder button. - - Gamepad button 12. + + Game controller SDL D-pad up button. - - Gamepad button 13. + + Game controller SDL D-pad down button. - - Gamepad button 14. + + Game controller SDL D-pad left button. - - Gamepad button 15. + + Game controller SDL D-pad right button. - - Represents the maximum number of joystick buttons supported. + + The number of SDL game controller buttons. - - DualShock circle button. + + Sony DualShock controller X button maps to SDL button A. - - DualShock X button. + + Sony DualShock controller cross button maps to SDL button A. - - DualShock square button. + + Sony DualShock controller circle button maps to SDL button B. - - DualShock triangle button. + + Sony DualShock controller square button maps to SDL button X. - - Xbox controller B button. + + Sony DualShock controller triangle button maps to SDL button Y. - - Xbox controller A button. + + Sony DualShock controller select button maps to SDL back button. - - Xbox controller X button. + + Sony DualShock controller start button maps to SDL start button. - - Xbox controller Y button. + + Sony DualShock controller PS button maps to SDL guide button. - - Nintendo controller A button. + + Sony DualShock controller L1 button maps to SDL left shoulder button. - - Nintendo controller B button. + + Sony DualShock controller R1 button maps to SDL right shoulder button. - - Nintendo controller X button. + + Sony DualShock controller L3 button maps to SDL left stick button. - - Nintendo controller Y button. + + Sony DualShock controller R3 button maps to SDL right stick button. - - Grip (side) buttons on a VR controller. + + Xbox game controller A button maps to SDL button A. - - Push down on the touchpad or main joystick on a VR controller. + + Xbox game controller B button maps to SDL button B. - - Trigger on a VR controller. + + Xbox game controller X button maps to SDL button X. - - A button on the right Oculus Touch controller, X button on the left controller (also when used in OpenVR). + + Xbox game controller Y button maps to SDL button Y. - - B button on the right Oculus Touch controller, Y button on the left controller (also when used in OpenVR). + + Xbox game controller back button maps to SDL back button. - - Menu button on either Oculus Touch controller. + + Xbox game controller start button maps to SDL start button. - - Menu button in OpenVR (Except when Oculus Touch controllers are used). + + Xbox game controller home button maps to SDL guide button. - - Gamepad button Select. + + Xbox game controller left stick button maps to SDL left stick button. - - Gamepad button Start. + + Xbox game controller right stick button maps to SDL right stick button. - - Gamepad DPad up. + + Xbox game controller left bumper button maps to SDL left shoulder button. - - Gamepad DPad down. + + Xbox game controller right bumper button maps to SDL right shoulder button. - - Gamepad DPad left. + + The maximum number of game controller buttons. - - Gamepad DPad right. + + An invalid game controller axis. - - Gamepad left Shoulder button. + + Game controller left joystick x-axis. - - Gamepad left trigger. + + Game controller left joystick y-axis. - - Gamepad left stick click. + + Game controller right joystick x-axis. - - Gamepad right Shoulder button. + + Game controller right joystick y-axis. - - Gamepad right trigger. + + Game controller left trigger axis. - - Gamepad right stick click. + + Game controller right trigger axis. - - Gamepad left stick horizontal axis. + + The number of SDL game controller axes. - - Gamepad left stick vertical axis. + + Game controller joystick 0 x-axis. - - Gamepad right stick horizontal axis. + + Game controller joystick 0 y-axis. - - Gamepad right stick vertical axis. + + Game controller joystick 1 x-axis. - - Generic gamepad axis 4. + + Game controller joystick 1 y-axis. - - Generic gamepad axis 5. + + Game controller joystick 2 x-axis. - - Gamepad left trigger analog axis. + + Game controller joystick 2 y-axis. - - Gamepad right trigger analog axis. + + Game controller joystick 3 x-axis. - - Generic gamepad axis 8. + + Game controller joystick 3 y-axis. - - Generic gamepad axis 9. + + Game controller joystick 4 x-axis. - - Represents the maximum number of joystick axes supported. + + Game controller joystick 4 y-axis. - - Gamepad left stick horizontal axis. - - - Gamepad left stick vertical axis. - - - Gamepad right stick horizontal axis. - - - Gamepad right stick vertical axis. - - - Gamepad left analog trigger. - - - Gamepad right analog trigger. - - - VR Controller analog trigger. - - - VR Controller analog grip (side buttons). - - - OpenVR touchpad X axis (Joystick axis on Oculus Touch and Windows MR controllers). - - - OpenVR touchpad Y axis (Joystick axis on Oculus Touch and Windows MR controllers). + + The maximum number of game controller axes. MIDI note OFF message. diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index 0f212e7498..fc3c3776ce 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -96,7 +96,7 @@ - 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]). @@ -114,7 +114,7 @@ - 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. @@ -132,7 +132,7 @@ - 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. @@ -235,7 +235,7 @@ - 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]). @@ -244,7 +244,7 @@ - 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. diff --git a/doc/classes/InputEventJoypadButton.xml b/doc/classes/InputEventJoypadButton.xml index 19aa97e1ec..7876bace75 100644 --- a/doc/classes/InputEventJoypadButton.xml +++ b/doc/classes/InputEventJoypadButton.xml @@ -13,7 +13,7 @@ - Button identifier. One of the [enum JoystickList] button constants. + Button identifier. One of the [enum JoyButtonList] button constants. If [code]true[/code], the button's state is pressed. If [code]false[/code], the button's state is released. diff --git a/doc/classes/InputEventJoypadMotion.xml b/doc/classes/InputEventJoypadMotion.xml index 01e02b79b1..bfd961ce1f 100644 --- a/doc/classes/InputEventJoypadMotion.xml +++ b/doc/classes/InputEventJoypadMotion.xml @@ -13,7 +13,7 @@ - Axis identifier. Use one of the [enum JoystickList] axis constants. + Axis identifier. Use one of the [enum JoyAxisList] axis constants. 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. diff --git a/doc/classes/XRController3D.xml b/doc/classes/XRController3D.xml index e4a06a80db..8e80eb9a32 100644 --- a/doc/classes/XRController3D.xml +++ b/doc/classes/XRController3D.xml @@ -62,7 +62,7 @@ - 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]. diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index d58b9d9472..28db7e4e04 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -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 diff --git a/doc/translations/fr.po b/doc/translations/fr.po index d39ab5f248..57466d0b04 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -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 diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index afcba4f67f..e5dd0c148e 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -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 &p_event) { @@ -527,9 +535,9 @@ void ProjectSettingsEditor::_add_item(int p_item, Ref 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 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")); } diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm index 0ac8bb7a56..fb30441bd3 100644 --- a/platform/iphone/app_delegate.mm +++ b/platform/iphone/app_delegate.mm @@ -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); }; }; diff --git a/platform/javascript/display_server_javascript.cpp b/platform/javascript/display_server_javascript.cpp index 060e446fca..c302614eca 100644 --- a/platform/javascript/display_server_javascript.cpp +++ b/platform/javascript/display_server_javascript.cpp @@ -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++) { diff --git a/platform/uwp/joypad_uwp.cpp b/platform/uwp/joypad_uwp.cpp index 93a9992706..066787e9d6 100644 --- a/platform/uwp/joypad_uwp.cpp +++ b/platform/uwp/joypad_uwp.cpp @@ -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) { diff --git a/platform/windows/joypad_windows.cpp b/platform/windows/joypad_windows.cpp index 8fdc92a79c..821d4eb685 100644 --- a/platform/windows/joypad_windows.cpp +++ b/platform/windows/joypad_windows.cpp @@ -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); -- cgit v1.2.3 From e0d4e840b4e74d061add885b9ad2aa095b61058e Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Mon, 4 May 2020 15:42:38 +0100 Subject: Implement half axis and inverted axis mapping. --- core/input/input.cpp | 69 +++++++++++++++++++++++++++++++++++++--------------- core/input/input.h | 5 ++-- 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/core/input/input.cpp b/core/input/input.cpp index 97757cc965..91ff676211 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -969,7 +969,7 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { return; }; - JoyEvent map = _get_mapped_axis_event(map_db[joy.mapping], p_axis); + JoyEvent map = _get_mapped_axis_event(map_db[joy.mapping], p_axis, p_value); if (map.type == TYPE_BUTTON) { @@ -1024,7 +1024,7 @@ void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { 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"); @@ -1110,10 +1110,10 @@ Input::JoyEvent Input::_get_mapped_button_event(const JoyDeviceMapping &mapping, switch (binding.outputType) { case TYPE_BUTTON: event.index = binding.output.button; - break; + return event; case TYPE_AXIS: event.index = binding.output.axis.axis; - break; + return event; default: ERR_PRINT_ONCE("Joypad button mapping error."); } @@ -1122,7 +1122,7 @@ Input::JoyEvent Input::_get_mapped_button_event(const JoyDeviceMapping &mapping, return event; } -Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis) { +Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis, const JoyAxis &p_value) { JoyEvent event; event.type = TYPE_MAX; @@ -1130,16 +1130,49 @@ Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, 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) { - event.type = binding.outputType; - switch (binding.outputType) { - case TYPE_BUTTON: - event.index = binding.output.button; - break; - case TYPE_AXIS: - event.index = binding.output.axis.axis; - break; - default: - ERR_PRINT_ONCE("Joypad button mapping error."); + 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."); + } } } } @@ -1282,11 +1315,7 @@ void Input::parse_mapping(String p_mapping) { binding.inputType = TYPE_AXIS; binding.input.axis.axis = input.right(1).to_int(); binding.input.axis.range = input_range; - if (invert_axis) { - int int_range = static_cast(input_range); - int_range = -int_range; - binding.input.axis.range = static_cast(int_range); - } + binding.input.axis.invert = invert_axis; break; case 'h': ERR_CONTINUE_MSG(input.length() != 4 || input[2] != '.', diff --git a/core/input/input.h b/core/input/input.h index ef50973827..9accf14a4f 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -190,7 +190,7 @@ private: struct JoyEvent { int type; int index; - int value; + float value; }; struct JoyBinding { @@ -201,6 +201,7 @@ private: struct { int axis; JoyAxisRange range; + bool invert; } axis; struct { @@ -231,7 +232,7 @@ private: Vector map_db; JoyEvent _get_mapped_button_event(const JoyDeviceMapping &mapping, int p_button); - JoyEvent _get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis); + 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); -- cgit v1.2.3