diff options
-rw-r--r-- | core/os/input.cpp | 4 | ||||
-rw-r--r-- | core/os/input.h | 5 | ||||
-rw-r--r-- | core/os/os.cpp | 7 | ||||
-rw-r--r-- | core/os/os.h | 3 | ||||
-rw-r--r-- | doc/base/classes.xml | 154 | ||||
-rw-r--r-- | main/input_default.cpp | 46 | ||||
-rw-r--r-- | main/input_default.h | 9 | ||||
-rw-r--r-- | platform/windows/os_windows.cpp | 7 | ||||
-rw-r--r-- | platform/windows/os_windows.h | 3 | ||||
-rw-r--r-- | platform/x11/os_x11.cpp | 8 | ||||
-rw-r--r-- | platform/x11/os_x11.h | 4 |
11 files changed, 226 insertions, 24 deletions
diff --git a/core/os/input.cpp b/core/os/input.cpp index d8d746c811..6e1e618d9a 100644 --- a/core/os/input.cpp +++ b/core/os/input.cpp @@ -53,8 +53,12 @@ void Input::_bind_methods() { ObjectTypeDB::bind_method(_MD("is_mouse_button_pressed","button"),&Input::is_mouse_button_pressed); ObjectTypeDB::bind_method(_MD("is_joy_button_pressed","device","button"),&Input::is_joy_button_pressed); ObjectTypeDB::bind_method(_MD("is_action_pressed","action"),&Input::is_action_pressed); + ObjectTypeDB::bind_method(_MD("add_joy_mapping","mapping", "update_existing"),&Input::add_joy_mapping, DEFVAL(false)); + ObjectTypeDB::bind_method(_MD("remove_joy_mapping","guid"),&Input::remove_joy_mapping); + ObjectTypeDB::bind_method(_MD("is_joy_known","device"),&Input::is_joy_known); ObjectTypeDB::bind_method(_MD("get_joy_axis","device","axis"),&Input::get_joy_axis); ObjectTypeDB::bind_method(_MD("get_joy_name","device"),&Input::get_joy_name); + ObjectTypeDB::bind_method(_MD("get_joy_guid","device"),&Input::get_joy_guid); ObjectTypeDB::bind_method(_MD("get_accelerometer"),&Input::get_accelerometer); //ObjectTypeDB::bind_method(_MD("get_mouse_pos"),&Input::get_mouse_pos); - this is not the function you want ObjectTypeDB::bind_method(_MD("get_mouse_speed"),&Input::get_mouse_speed); diff --git a/core/os/input.h b/core/os/input.h index 57eaa973d9..2dd4496f26 100644 --- a/core/os/input.h +++ b/core/os/input.h @@ -63,7 +63,10 @@ public: virtual float get_joy_axis(int p_device,int p_axis)=0; virtual String get_joy_name(int p_idx)=0; virtual void joy_connection_changed(int p_idx, bool p_connected, String p_name, String p_guid)=0; - + virtual void add_joy_mapping(String p_mapping, bool p_update_existing=false)=0; + virtual void remove_joy_mapping(String p_guid)=0; + virtual bool is_joy_known(int p_device)=0; + virtual String get_joy_guid(int p_device) const=0; virtual Point2 get_mouse_pos() const=0; virtual Point2 get_mouse_speed() const=0; diff --git a/core/os/os.cpp b/core/os/os.cpp index 1a505fb236..be447d511e 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -507,6 +507,13 @@ float OS::get_time_scale() const { return _time_scale; } +bool OS::is_joy_known(int p_device) { + return true; +} + +String OS::get_joy_guid(int p_device) const { + return "Default Joystick"; +} OS::OS() { last_error=NULL; diff --git a/core/os/os.h b/core/os/os.h index 711743f23a..83ea2c2101 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -397,6 +397,9 @@ public: _FORCE_INLINE_ bool get_use_pixel_snap() const { return _pixel_snap; } + virtual bool is_joy_known(int p_device); + virtual String get_joy_guid(int p_device)const; + OS(); virtual ~OS(); diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 1b95899729..4a1e437694 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -432,7 +432,7 @@ <method name="convert"> <return type="Object"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> <argument index="1" name="type" type="int"> </argument> @@ -443,9 +443,9 @@ <method name="str"> <return type="String"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> Convert one or more arguments to strings in the best way possible. @@ -454,9 +454,9 @@ <method name="str"> <return type="String"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> Convert one or more arguments to strings in the best way possible. @@ -465,9 +465,9 @@ <method name="print"> <return type="Nil"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> Print one or more arguments to strings in the best way possible to a console line. @@ -476,9 +476,9 @@ <method name="printt"> <return type="Nil"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> Print one or more arguments to the console with a tab between each argument. @@ -487,9 +487,9 @@ <method name="prints"> <return type="Nil"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> </description> @@ -497,9 +497,9 @@ <method name="printerr"> <return type="Nil"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> Print one or more arguments to strings in the best way possible to standard error line. @@ -508,9 +508,9 @@ <method name="printraw"> <return type="Nil"> </return> - <argument index="0" name="what" type="var"> + <argument index="0" name="what" type="Variant"> </argument> - <argument index="1" name="..." type="var"> + <argument index="1" name="..." type="Variant"> </argument> <description> Print one or more arguments to strings in the best way possible to console. No newline is added at the end. @@ -519,25 +519,40 @@ <method name="var2str"> <return type="String"> </return> - <argument index="0" name="var" type="var"> + <argument index="0" name="var" type="Variant"> </argument> <description> Converts the value of a variable to a String. </description> </method> - <method name="str2var:Variant"> - <return type="Nil"> + <method name="str2var"> + <return type="Variant"> </return> <argument index="0" name="string" type="String"> </argument> <description> - Converts the value of a String to a Variant. + </description> + </method> + <method name="var2bytes"> + <return type="RawArray"> + </return> + <argument index="0" name="var" type="Variant"> + </argument> + <description> + </description> + </method> + <method name="bytes2var"> + <return type="Variant"> + </return> + <argument index="0" name="bytes" type="RawArray"> + </argument> + <description> </description> </method> <method name="range"> <return type="Array"> </return> - <argument index="0" name="..." type="var"> + <argument index="0" name="..." type="Variant"> </argument> <description> Return an array with the given range. Range can be 1 argument N (0 to N-1), two arguments (initial, final-1) or three arguments (initial,final-1,increment). @@ -573,12 +588,26 @@ <method name="hash"> <return type="int"> </return> - <argument index="0" name="var:Variant" type="var"> + <argument index="0" name="var:Variant" type="Variant"> </argument> <description> Hashes the variable passed and returns an integer. </description> </method> + <method name="Color8"> + <return type="Color"> + </return> + <argument index="0" name="r8" type="int"> + </argument> + <argument index="1" name="g8" type="int"> + </argument> + <argument index="2" name="b8" type="int"> + </argument> + <argument index="3" name="a8" type="int"> + </argument> + <description> + </description> + </method> <method name="print_stack"> <return type="Nil"> </return> @@ -1371,6 +1400,10 @@ </constant> <constant name="JOY_ANALOG_2_Y" value="5"> </constant> + <constant name="JOY_ANALOG_L2" value="6"> + </constant> + <constant name="JOY_ANALOG_R2" value="7"> + </constant> <constant name="OK" value="0"> Functions that return [Error] return OK when everything went ok. Most functions don't return error anyway and/or just print errors to stdout. </constant> @@ -7561,6 +7594,14 @@ </member> <member name="v" type="float"> </member> + <member name="r8" type="int"> + </member> + <member name="g8" type="int"> + </member> + <member name="b8" type="int"> + </member> + <member name="a8" type="int"> + </member> </members> <constants> </constants> @@ -7968,6 +8009,8 @@ </argument> <argument index="1" name="key" type="String"> </argument> + <argument index="2" name="default" type="var" default="NULL"> + </argument> <description> </description> </method> @@ -13625,6 +13668,7 @@ returns:= "username=user&password=pass" <argument index="1" name="button" type="int"> </argument> <description> + Returns true if the joystick button at the given index is currently pressed. Returns false otherwise. (see JOY_* constans in [InputEvent]) </description> </method> <method name="is_action_pressed"> @@ -13635,6 +13679,31 @@ returns:= "username=user&password=pass" <description> </description> </method> + <method name="add_joy_mapping"> + <argument index="0" name="mapping" type="String"> + </argument> + <argument index="1" name="update_existing" type="bool" default="false"> + </argument> + <description> + Add a new mapping entry (in SDL2 format) to the mapping database. Optionally update already connected devices. + </description> + </method> + <method name="remove_joy_mapping"> + <argument index="0" name="guid" type="String"> + </argument> + <description> + Removes all mappings from the internal db that match the given uid. + </description> + </method> + <method name="is_joy_known"> + <return type="bool"> + </return> + <argument index="0" name="device" type="int"> + </argument> + <description> + Returns true if the specified device is known by the system. This means that it sets all button and axis indices exactly as defined in [InputEvent]. Unknown joysticks are not expected to match these constants, but you can still retrieve events from them. + </description> + </method> <method name="get_joy_axis"> <return type="float"> </return> @@ -13643,6 +13712,7 @@ returns:= "username=user&password=pass" <argument index="1" name="axis" type="int"> </argument> <description> + Returns the current value of the joystick axis at given index (see JOY_* enum in [InputEvent]) </description> </method> <method name="get_joy_name"> @@ -13651,6 +13721,16 @@ returns:= "username=user&password=pass" <argument index="0" name="device" type="int"> </argument> <description> + Returns the name of the joystick at the specified device index + </description> + </method> + <method name="get_joy_guid" qualifiers="const"> + <return type="String"> + </return> + <argument index="0" name="device" type="int"> + </argument> + <description> + Returns a SDL2 compatible device guid on platforms that use gamepad remapping. Returns "Default Gamepad" otherwise. </description> </method> <method name="get_accelerometer"> @@ -15479,7 +15559,7 @@ returns:= "username=user&password=pass" </description> </method> <method name="get_collider_metadata" qualifiers="const"> - <return type="var"> + <return type="Variant"> </return> <description> Return the metadata of the shape that collided with this body. If there is no collision, it will return 0, so collisions must be checked first with [method is_colliding]. Aditionally, this metadata can not be set with [method Object.set_meta], it must be set with [method Physics2DServer.body_set_shape_metadata]. @@ -18971,6 +19051,8 @@ returns:= "username=user&password=pass" </constant> <constant name="NOTIFICATION_UNPAUSED" value="15"> </constant> + <constant name="NOTIFICATION_INSTANCED" value="20"> + </constant> <constant name="PAUSE_MODE_INHERIT" value="0"> </constant> <constant name="PAUSE_MODE_STOP" value="1"> @@ -19138,7 +19220,7 @@ returns:= "username=user&password=pass" <description> </description> </method> - <method name="get_relative_transform" qualifiers="const"> + <method name="get_relative_transform_to_parent" qualifiers="const"> <return type="Matrix32"> </return> <argument index="0" name="parent" type="Object"> @@ -20178,6 +20260,14 @@ returns:= "username=user&password=pass" Return the list of signals as an array of dictionaries. </description> </method> + <method name="get_signal_connection_list" qualifiers="const"> + <return type="Array"> + </return> + <argument index="0" name="signal" type="String"> + </argument> + <description> + </description> + </method> <method name="connect"> <return type="int"> </return> @@ -21601,6 +21691,10 @@ returns:= "username=user&password=pass" <description> </description> </method> + <method name="reset"> + <description> + </description> + </method> <method name="set_use_local_space"> <argument index="0" name="enable" type="bool"> </argument> @@ -29631,6 +29725,14 @@ This method controls whether the position between two cached points is interpola <description> </description> </method> + <method name="has_group" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="name" type="String"> + </argument> + <description> + </description> + </method> <method name="set_auto_accept_quit"> <argument index="0" name="enabled" type="bool"> </argument> @@ -33335,6 +33437,12 @@ This method controls whether the position between two cached points is interpola </description> </method> </methods> + <signals> + <signal name="finished"> + <description> + </description> + </signal> + </signals> <constants> </constants> </class> diff --git a/main/input_default.cpp b/main/input_default.cpp index 68f7434d96..a79199580b 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -781,3 +781,49 @@ void InputDefault::parse_mapping(String p_mapping) { map_db.push_back(mapping); //printf("added mapping with uuid %ls\n", mapping.uid.c_str()); }; + +void InputDefault::add_joy_mapping(String p_mapping, bool p_update_existing) { + parse_mapping(p_mapping); + if (p_update_existing) { + Vector<String> entry = p_mapping.split(","); + String uid = entry[0]; + for (int i=0; i<joy_names.size(); i++) { + if (uid == joy_names[i].uid) { + joy_names[i].mapping = map_db.size() -1; + } + } + } +} + +void InputDefault::remove_joy_mapping(String p_guid) { + for (int i=map_db.size()-1; i >= 0;i--) { + if (p_guid == map_db[i].uid) { + map_db.remove(i); + } + } + for (int i=0; i<joy_names.size(); i++) { + if (joy_names[i].uid == p_guid) { + joy_names[i].mapping = -1; + } + } +} + +//Defaults to simple implementation for platforms with a fixed gamepad layout, like consoles. +bool InputDefault::is_joy_known(int p_device) { + + return OS::get_singleton()->is_joy_known(p_device); +} + +String InputDefault::get_joy_guid(int p_device) const { + return OS::get_singleton()->get_joy_guid(p_device); +} + +//platforms that use the remapping system can override and call to these ones +bool InputDefault::is_joy_mapped(int p_device) { + return joy_names[p_device].mapping != -1 ? true : false; +} + +String InputDefault::get_joy_guid_remapped(int p_device) const { + return joy_names[p_device].uid; +} + diff --git a/main/input_default.h b/main/input_default.h index 6645817b31..bbfd9ced2c 100644 --- a/main/input_default.h +++ b/main/input_default.h @@ -56,6 +56,7 @@ class InputDefault : public Input { } last_hat = HAT_MASK_CENTER; filter = 0.01f; + mapping = -1; } }; @@ -161,6 +162,14 @@ public: uint32_t joy_axis(uint32_t p_last_id, int p_device, int p_axis, const JoyAxis& p_value); uint32_t joy_hat(uint32_t p_last_id, int p_device, int p_val); + virtual void add_joy_mapping(String p_mapping, bool p_update_existing=false); + virtual void remove_joy_mapping(String p_guid); + virtual bool is_joy_known(int p_device); + virtual String get_joy_guid(int p_device) const; + + bool is_joy_mapped(int p_device); + String get_joy_guid_remapped(int p_device) const; + InputDefault(); }; diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 79d8aa1a0c..6f19f8bdfe 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -2104,6 +2104,13 @@ String OS_Windows::get_data_dir() const { } +bool OS_Windows::is_joy_known(int p_device) { + return input->is_joy_mapped(p_device); +} + +String OS_Windows::get_joy_guid(int p_device) const { + return input->get_joy_guid_remapped(p_device); +} OS_Windows::OS_Windows(HINSTANCE _hInstance) { diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 69bdcda278..e433d5cc11 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -270,6 +270,9 @@ public: virtual bool get_swap_ok_cancel() { return true; } + virtual bool is_joy_known(int p_device); + virtual String get_joy_guid(int p_device) const; + OS_Windows(HINSTANCE _hInstance); ~OS_Windows(); diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 437e41eead..82df8dff60 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -1774,6 +1774,14 @@ void OS_X11::run() { main_loop->finish(); } +bool OS_X11::is_joy_known(int p_device) { + return input->is_joy_mapped(p_device); +} + +String OS_X11::get_joy_guid(int p_device) const { + return input->get_joy_guid_remapped(p_device); +} + OS_X11::OS_X11() { #ifdef RTAUDIO_ENABLED diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index a556ba49e3..91dbeac284 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -222,6 +222,10 @@ public: virtual void move_window_to_foreground(); virtual void alert(const String& p_alert,const String& p_title="ALERT!"); + + virtual bool is_joy_known(int p_device); + virtual String get_joy_guid(int p_device) const; + void run(); OS_X11(); |