Merge pull request #3272 from Hinsbart/joy-binding
Add some joystick functions to input. Enables manipulation of mapping…
This commit is contained in:
commit
7393e40452
11 changed files with 226 additions and 24 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue