2
0
Эх сурвалжийг харах

Merge pull request #3272 from Hinsbart/joy-binding

Add some joystick functions to input. Enables manipulation of mapping…
punto- 9 жил өмнө
parent
commit
7393e40452

+ 4 - 0
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);

+ 4 - 1
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;

+ 7 - 0
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;

+ 3 - 0
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();
 

+ 131 - 23
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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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&amp;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>

+ 46 - 0
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;
+}
+

+ 9 - 0
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();
 };
 

+ 7 - 0
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) {
 

+ 3 - 0
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();
 

+ 8 - 0
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

+ 4 - 0
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();