diff options
-rw-r--r-- | core/bind/core_bind.cpp | 4 | ||||
-rw-r--r-- | core/os/input.cpp | 1 | ||||
-rw-r--r-- | core/os/input.h | 2 | ||||
-rw-r--r-- | doc/classes/ARVRServer.xml | 18 | ||||
-rw-r--r-- | doc/classes/Camera.xml | 2 | ||||
-rw-r--r-- | doc/classes/EditorPlugin.xml | 2 | ||||
-rw-r--r-- | doc/classes/ItemList.xml | 7 | ||||
-rw-r--r-- | doc/classes/OS.xml | 75 | ||||
-rw-r--r-- | doc/classes/OptionButton.xml | 1 | ||||
-rw-r--r-- | doc/classes/PopupMenu.xml | 1 | ||||
-rw-r--r-- | doc/classes/Vector2.xml | 2 | ||||
-rw-r--r-- | main/input_default.cpp | 9 | ||||
-rw-r--r-- | main/input_default.h | 3 | ||||
-rw-r--r-- | modules/enet/networked_multiplayer_enet.cpp | 116 | ||||
-rw-r--r-- | modules/enet/networked_multiplayer_enet.h | 2 | ||||
-rw-r--r-- | scene/gui/item_list.cpp | 2 | ||||
-rw-r--r-- | scene/gui/text_edit.cpp | 3 | ||||
-rw-r--r-- | scene/main/viewport.cpp | 2 | ||||
-rw-r--r-- | servers/arvr_server.cpp | 2 |
19 files changed, 173 insertions, 81 deletions
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index 20adf7ff02..a977fd3da4 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -1032,9 +1032,9 @@ void _OS::_bind_methods() { //ClassDB::bind_method(D_METHOD("get_fullscreen_mode_list","screen"),&_OS::get_fullscreen_mode_list,DEFVAL(0)); ClassDB::bind_method(D_METHOD("get_video_driver_count"), &_OS::get_video_driver_count); - ClassDB::bind_method(D_METHOD("get_video_driver_name"), &_OS::get_video_driver_name); + ClassDB::bind_method(D_METHOD("get_video_driver_name", "driver"), &_OS::get_video_driver_name); ClassDB::bind_method(D_METHOD("get_audio_driver_count"), &_OS::get_audio_driver_count); - ClassDB::bind_method(D_METHOD("get_audio_driver_name"), &_OS::get_audio_driver_name); + ClassDB::bind_method(D_METHOD("get_audio_driver_name", "driver"), &_OS::get_audio_driver_name); ClassDB::bind_method(D_METHOD("get_screen_count"), &_OS::get_screen_count); ClassDB::bind_method(D_METHOD("get_current_screen"), &_OS::get_current_screen); diff --git a/core/os/input.cpp b/core/os/input.cpp index 1d7cd7c791..e8a635e1b5 100644 --- a/core/os/input.cpp +++ b/core/os/input.cpp @@ -85,6 +85,7 @@ void Input::_bind_methods() { ClassDB::bind_method(D_METHOD("warp_mouse_position", "to"), &Input::warp_mouse_position); ClassDB::bind_method(D_METHOD("action_press", "action"), &Input::action_press); ClassDB::bind_method(D_METHOD("action_release", "action"), &Input::action_release); + ClassDB::bind_method(D_METHOD("set_default_cursor_shape", "shape"), &Input::set_default_cursor_shape, DEFVAL(CURSOR_ARROW)); ClassDB::bind_method(D_METHOD("set_custom_mouse_cursor", "image", "shape", "hotspot"), &Input::set_custom_mouse_cursor, DEFVAL(CURSOR_ARROW), DEFVAL(Vector2())); ClassDB::bind_method(D_METHOD("parse_input_event", "event"), &Input::parse_input_event); diff --git a/core/os/input.h b/core/os/input.h index 9c7595ff7f..fca68f27b7 100644 --- a/core/os/input.h +++ b/core/os/input.h @@ -119,6 +119,8 @@ public: virtual bool is_emulating_touchscreen() const = 0; + virtual CursorShape get_default_cursor_shape() = 0; + virtual void set_default_cursor_shape(CursorShape p_shape) = 0; virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape = CURSOR_ARROW, const Vector2 &p_hotspot = Vector2()) = 0; virtual void set_mouse_in_window(bool p_in_window) = 0; diff --git a/doc/classes/ARVRServer.xml b/doc/classes/ARVRServer.xml index 3164d0c2c3..a7d3e46684 100644 --- a/doc/classes/ARVRServer.xml +++ b/doc/classes/ARVRServer.xml @@ -40,6 +40,7 @@ <return type="Transform"> </return> <description> + Returns the primary interface's transformation. </description> </method> <method name="get_interface" qualifiers="const"> @@ -83,12 +84,6 @@ <description> </description> </method> - <method name="get_primary_interface" qualifiers="const"> - <return type="ARVRInterface"> - </return> - <description> - </description> - </method> <method name="get_reference_frame" qualifiers="const"> <return type="Transform"> </return> @@ -112,17 +107,10 @@ Get the number of trackers currently registered. </description> </method> - <method name="set_primary_interface"> - <return type="void"> - </return> - <argument index="0" name="interface" type="ARVRInterface"> - </argument> - <description> - Changes the primary interface to the specified interface. Again mostly exposed for GDNative interfaces. - </description> - </method> </methods> <members> + <member name="primary_interface" type="ARVRInterface" setter="set_primary_interface" getter="get_primary_interface"> + </member> <member name="world_scale" type="float" setter="set_world_scale" getter="get_world_scale"> Allows you to adjust the scale to your game's units. Most AR/VR platforms assume a scale of 1 game world unit = 1 meter in the real world. </member> diff --git a/doc/classes/Camera.xml b/doc/classes/Camera.xml index 1260b369f5..7f7f152ae9 100644 --- a/doc/classes/Camera.xml +++ b/doc/classes/Camera.xml @@ -17,7 +17,7 @@ <argument index="0" name="enable_next" type="bool" default="true"> </argument> <description> - If this is the current Camera, remove it from being current. If it is inside the node tree and [code]enabled_next[/code] is [code]true[/true], request to make the next Camera current, if any. + If this is the current Camera, remove it from being current. If [code]enable_next[/code] is true, request to make the next Camera current, if any. </description> </method> <method name="get_camera_transform" qualifiers="const"> diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml index a98cbf0316..846d6f18ff 100644 --- a/doc/classes/EditorPlugin.xml +++ b/doc/classes/EditorPlugin.xml @@ -114,6 +114,7 @@ <argument index="3" name="ud" type="Variant" default="null"> </argument> <description> + Adds a custom menu to 'Project > Tools' as [code]name[/code] that calls [code]callback[/code] on an instance of [code]handler[/code] with a parameter [code]ud[/code] when user activates it. </description> </method> <method name="add_tool_submenu_item"> @@ -367,6 +368,7 @@ <argument index="0" name="name" type="String"> </argument> <description> + Removes a menu [code]name[/code] from 'Project > Tools'. </description> </method> <method name="save_external_data" qualifiers="virtual"> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 4539c31441..bd1d6be4f5 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -148,6 +148,7 @@ <return type="bool"> </return> <description> + Returns [code]true[/code] if one or more items are selected. </description> </method> <method name="is_item_disabled" qualifiers="const"> @@ -189,11 +190,12 @@ <method name="move_item"> <return type="void"> </return> - <argument index="0" name="p_from_idx" type="int"> + <argument index="0" name="from_idx" type="int"> </argument> - <argument index="1" name="p_to_idx" type="int"> + <argument index="1" name="to_idx" type="int"> </argument> <description> + Moves item at index [code]from_idx[/code] to [code]to_idx[/code]. </description> </method> <method name="remove_item"> @@ -346,6 +348,7 @@ <return type="void"> </return> <description> + Ensure there are no items selected. </description> </method> </methods> diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 20e141b4ec..d38a89874c 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -40,6 +40,7 @@ <return type="void"> </return> <description> + Centers the window on the screen if in windowed mode. </description> </method> <method name="delay_msec" qualifiers="const"> @@ -48,7 +49,7 @@ <argument index="0" name="msec" type="int"> </argument> <description> - Delay executing of the current thread by given milliseconds. + Delay execution of the current thread by given milliseconds. </description> </method> <method name="delay_usec" qualifiers="const"> @@ -57,7 +58,7 @@ <argument index="0" name="usec" type="int"> </argument> <description> - Delay executing of the current thread by given microseconds. + Delay execution of the current thread by given microseconds. </description> </method> <method name="dump_memory_to_file"> @@ -67,7 +68,7 @@ </argument> <description> Dumps the memory allocation ringlist to a file (only works in debug). - Entry format per line: "Address - Size - Description" + Entry format per line: "Address - Size - Description". </description> </method> <method name="dump_resources_to_file"> @@ -77,7 +78,7 @@ </argument> <description> Dumps all used resources to file (only works in debug). - Entry format per line: "Resource Type : Resource Location" + Entry format per line: "Resource Type : Resource Location". At the end of the file is a statistic of all used Resource Types. </description> </method> @@ -120,14 +121,16 @@ <return type="int"> </return> <description> + Returns the total number of available audio drivers. </description> </method> <method name="get_audio_driver_name" qualifiers="const"> <return type="String"> </return> - <argument index="0" name="arg0" type="int"> + <argument index="0" name="driver" type="int"> </argument> <description> + Returns the audio driver name for the given index. </description> </method> <method name="get_cmdline_args"> @@ -256,6 +259,7 @@ <return type="Vector2"> </return> <description> + Returns the window size including decorations like window borders. </description> </method> <method name="get_scancode_string" qualifiers="const"> @@ -380,7 +384,7 @@ <return type="int"> </return> <description> - Return the current unix timestamp. + Returns the current unix epoch timestamp. </description> </method> <method name="get_unix_time_from_datetime" qualifiers="const"> @@ -414,7 +418,7 @@ <method name="get_video_driver_name" qualifiers="const"> <return type="String"> </return> - <argument index="0" name="arg0" type="int"> + <argument index="0" name="driver" type="int"> </argument> <description> </description> @@ -423,6 +427,7 @@ <return type="int"> </return> <description> + Returns the on-screen keyboard's height in pixels. Returns 0 if there is no keyboard or it is currently hidden. </description> </method> <method name="has_environment" qualifiers="const"> @@ -440,6 +445,7 @@ <argument index="0" name="tag_name" type="String"> </argument> <description> + Returns [code]true[/code] if the feature for the given feature tag is supported in the currently running instance, depending on platform, build etc. Can be used to check whether you're currently running a debug build, on a certain platform or arch, etc. See feature tags documentation. </description> </method> <method name="has_touchscreen_ui_hint" qualifiers="const"> @@ -506,6 +512,7 @@ <return type="bool"> </return> <description> + Returns [code]true[/code] if the window should always be on top of other windows. </description> </method> <method name="kill"> @@ -642,6 +649,7 @@ <argument index="0" name="enabled" type="bool"> </argument> <description> + Sets whether the window should always be on top. </description> </method> <method name="set_window_title"> @@ -682,27 +690,31 @@ The current screen index (starting from 0). </member> <member name="exit_code" type="int" setter="set_exit_code" getter="get_exit_code"> + The exit code passed to the OS when the main loop exits. </member> <member name="keep_screen_on" type="bool" setter="set_keep_screen_on" getter="is_keep_screen_on"> + If [code]true[/code] the engine tries to keep the screen on while the game is running. Useful on mobile. </member> <member name="low_processor_usage_mode" type="bool" setter="set_low_processor_usage_mode" getter="is_in_low_processor_usage_mode"> + If [code]true[/code] the engine optimizes for low processor usage by only refreshing the screen if needed. Can improve battery consumption on mobile. </member> - <member name="screen_orientation" type="int" setter="set_screen_orientation" getter="get_screen_orientation" enum="_OS.ScreenOrientation"> + <member name="screen_orientation" type="int" setter="set_screen_orientation" getter="get_screen_orientation" enum="OS.ScreenOrientation"> The current screen orientation. </member> <member name="vsync_enabled" type="bool" setter="set_use_vsync" getter="is_vsync_enabled"> + If [code]true[/code] vertical synchronization (Vsync) is enabled. </member> <member name="window_borderless" type="bool" setter="set_borderless_window" getter="get_borderless_window"> - If [code]true[/code], removes the window frame. + If [code]true[/code] removes the window frame. </member> <member name="window_fullscreen" type="bool" setter="set_window_fullscreen" getter="is_window_fullscreen"> - If [code]true[/code], the window is fullscreen. + If [code]true[/code] the window is fullscreen. </member> <member name="window_maximized" type="bool" setter="set_window_maximized" getter="is_window_maximized"> - If [code]true[/code], the window is maximized. + If [code]true[/code] the window is maximized. </member> <member name="window_minimized" type="bool" setter="set_window_minimized" getter="is_window_minimized"> - If [code]true[/code], the window is minimized. + If [code]true[/code] the window is minimized. </member> <member name="window_position" type="Vector2" setter="set_window_position" getter="get_window_position"> The window position relative to the screen, the origin is the top left corner, +Y axis goes to the bottom and +X axis goes to the right. @@ -716,82 +728,121 @@ </members> <constants> <constant name="DAY_SUNDAY" value="0" enum="Weekday"> + Sunday. </constant> <constant name="DAY_MONDAY" value="1" enum="Weekday"> + Monday. </constant> <constant name="DAY_TUESDAY" value="2" enum="Weekday"> + Tuesday. </constant> <constant name="DAY_WEDNESDAY" value="3" enum="Weekday"> + Wednesday. </constant> <constant name="DAY_THURSDAY" value="4" enum="Weekday"> + Thursday. </constant> <constant name="DAY_FRIDAY" value="5" enum="Weekday"> + Friday. </constant> <constant name="DAY_SATURDAY" value="6" enum="Weekday"> + Saturday. </constant> <constant name="MONTH_JANUARY" value="1" enum="Month"> + January. </constant> <constant name="MONTH_FEBRUARY" value="2" enum="Month"> + February. </constant> <constant name="MONTH_MARCH" value="3" enum="Month"> + March. </constant> <constant name="MONTH_APRIL" value="4" enum="Month"> + April. </constant> <constant name="MONTH_MAY" value="5" enum="Month"> + May. </constant> <constant name="MONTH_JUNE" value="6" enum="Month"> + June. </constant> <constant name="MONTH_JULY" value="7" enum="Month"> + July. </constant> <constant name="MONTH_AUGUST" value="8" enum="Month"> + August. </constant> <constant name="MONTH_SEPTEMBER" value="9" enum="Month"> + September. </constant> <constant name="MONTH_OCTOBER" value="10" enum="Month"> + October. </constant> <constant name="MONTH_NOVEMBER" value="11" enum="Month"> + November. </constant> <constant name="MONTH_DECEMBER" value="12" enum="Month"> + December. </constant> <constant name="SCREEN_ORIENTATION_LANDSCAPE" value="0" enum="ScreenOrientation"> + Landscape screen orientation. </constant> <constant name="SCREEN_ORIENTATION_PORTRAIT" value="1" enum="ScreenOrientation"> + Portrait screen orientation. </constant> <constant name="SCREEN_ORIENTATION_REVERSE_LANDSCAPE" value="2" enum="ScreenOrientation"> + Reverse landscape screen orientation. </constant> <constant name="SCREEN_ORIENTATION_REVERSE_PORTRAIT" value="3" enum="ScreenOrientation"> + Reverse portrait screen orientation. </constant> <constant name="SCREEN_ORIENTATION_SENSOR_LANDSCAPE" value="4" enum="ScreenOrientation"> + Uses landscape or reverse landscape based on the hardware sensor. </constant> <constant name="SCREEN_ORIENTATION_SENSOR_PORTRAIT" value="5" enum="ScreenOrientation"> + Uses portrait or reverse portrait based on the hardware sensor. </constant> <constant name="SCREEN_ORIENTATION_SENSOR" value="6" enum="ScreenOrientation"> + Uses most suitable orientation based on the hardware sensor. </constant> <constant name="SYSTEM_DIR_DESKTOP" value="0" enum="SystemDir"> + Desktop directory path. </constant> <constant name="SYSTEM_DIR_DCIM" value="1" enum="SystemDir"> + DCIM (Digital Camera Images) directory path. </constant> <constant name="SYSTEM_DIR_DOCUMENTS" value="2" enum="SystemDir"> + Documents directory path. </constant> <constant name="SYSTEM_DIR_DOWNLOADS" value="3" enum="SystemDir"> + Downloads directory path. </constant> <constant name="SYSTEM_DIR_MOVIES" value="4" enum="SystemDir"> + Movies directory path. </constant> <constant name="SYSTEM_DIR_MUSIC" value="5" enum="SystemDir"> + Music directory path. </constant> <constant name="SYSTEM_DIR_PICTURES" value="6" enum="SystemDir"> + Pictures directory path. </constant> <constant name="SYSTEM_DIR_RINGTONES" value="7" enum="SystemDir"> + Ringtones directory path. </constant> <constant name="POWERSTATE_UNKNOWN" value="0" enum="PowerState"> + Unknown powerstate. </constant> <constant name="POWERSTATE_ON_BATTERY" value="1" enum="PowerState"> + Unplugged, running on battery. </constant> <constant name="POWERSTATE_NO_BATTERY" value="2" enum="PowerState"> + Plugged in, no battery available. </constant> <constant name="POWERSTATE_CHARGING" value="3" enum="PowerState"> + Plugged in, battery charging. </constant> <constant name="POWERSTATE_CHARGED" value="4" enum="PowerState"> + Plugged in, battery fully charged. </constant> </constants> </class> diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index 9957106177..8cb53dd98e 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -198,6 +198,7 @@ <argument index="0" name="ID" type="int"> </argument> <description> + This signal is emitted when user navigated to an item using [code]ui_up[/code] or [code]ui_down[/code] action. ID of the item selected is passed as argument (if no IDs were added, ID will be just the item index). </description> </signal> <signal name="item_selected"> diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml index 12bff45291..166a4be2b0 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -495,6 +495,7 @@ <argument index="0" name="ID" type="int"> </argument> <description> + This event is emitted when user navigated to an item of some id using [code]ui_up[/code] or [code]ui_down[/code] action. </description> </signal> <signal name="id_pressed"> diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml index c9fc7d3fb5..5ffe807606 100644 --- a/doc/classes/Vector2.xml +++ b/doc/classes/Vector2.xml @@ -87,7 +87,7 @@ <argument index="0" name="with" type="Vector2"> </argument> <description> - Returns the 2-dimensional analog of the cross product with [code]b[/code]. + Returns the 2-dimensional analog of the cross product with the given Vector2. </description> </method> <method name="cubic_interpolate"> diff --git a/main/input_default.cpp b/main/input_default.cpp index ae33057959..1c73ecf2d2 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -495,6 +495,15 @@ bool InputDefault::is_emulating_touchscreen() const { return emulate_touch; } +Input::CursorShape InputDefault::get_default_cursor_shape() { + return default_shape; +} + +void InputDefault::set_default_cursor_shape(CursorShape p_shape) { + default_shape = p_shape; + OS::get_singleton()->set_cursor_shape((OS::CursorShape)p_shape); +} + void InputDefault::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { if (Engine::get_singleton()->is_editor_hint()) return; diff --git a/main/input_default.h b/main/input_default.h index 7de6d3eca0..384b04cf41 100644 --- a/main/input_default.h +++ b/main/input_default.h @@ -115,6 +115,7 @@ class InputDefault : public Input { SpeedTrack mouse_speed_track; Map<int, Joypad> joy_names; int fallback_mapping; + CursorShape default_shape = CURSOR_ARROW; public: enum HatMask { @@ -225,6 +226,8 @@ public: void set_emulate_touch(bool p_emulate); virtual bool is_emulating_touchscreen() const; + virtual CursorShape get_default_cursor_shape(); + virtual void set_default_cursor_shape(CursorShape p_shape); virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape = Input::CURSOR_ARROW, const Vector2 &p_hotspot = Vector2()); virtual void set_mouse_in_window(bool p_in_window); diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp index f3f4acd768..0f62714440 100644 --- a/modules/enet/networked_multiplayer_enet.cpp +++ b/modules/enet/networked_multiplayer_enet.cpp @@ -115,9 +115,6 @@ Error NetworkedMultiplayerENet::create_client(const IP_Address &p_ip, int p_port #endif address.port = p_port; - //enet_address_set_host (& address, "localhost"); - //address.port = p_port; - unique_id = _gen_unique_id(); /* Initiate the connection, allocating the enough channels */ @@ -128,7 +125,7 @@ Error NetworkedMultiplayerENet::create_client(const IP_Address &p_ip, int p_port ERR_FAIL_COND_V(!peer, ERR_CANT_CREATE); } - //technically safe to ignore the peer or anything else. + // Technically safe to ignore the peer or anything else. connection_status = CONNECTION_CONNECTING; active = true; @@ -148,13 +145,13 @@ void NetworkedMultiplayerENet::poll() { /* Wait up to 1000 milliseconds for an event. */ while (true) { - if (!host || !active) //might have been disconnected while emitting a notification + if (!host || !active) // Might have been disconnected while emitting a notification return; int ret = enet_host_service(host, &event, 1); if (ret < 0) { - //error, do something? + // Error, do something? break; } else if (ret == 0) { break; @@ -172,7 +169,7 @@ void NetworkedMultiplayerENet::poll() { int *new_id = memnew(int); *new_id = event.data; - if (*new_id == 0) { //data zero is sent by server (enet won't let you configure this). Server is always 1 + if (*new_id == 0) { // Data zero is sent by server (enet won't let you configure this). Server is always 1 *new_id = 1; } @@ -180,22 +177,22 @@ void NetworkedMultiplayerENet::poll() { peer_map[*new_id] = event.peer; - connection_status = CONNECTION_CONNECTED; //if connecting, this means it connected t something! + connection_status = CONNECTION_CONNECTED; // If connecting, this means it connected to something! emit_signal("peer_connected", *new_id); if (server) { - //someone connected, let it know of all the peers available + // Someone connected, notify all the peers available for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { if (E->key() == *new_id) continue; - //send existing peers to new peer + // Send existing peers to new peer ENetPacket *packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_ADD_PEER, &packet->data[0]); encode_uint32(E->key(), &packet->data[4]); enet_peer_send(event.peer, SYSCH_CONFIG, packet); - //send the new peer to existing peers + // Send the new peer to existing peers packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_ADD_PEER, &packet->data[0]); encode_uint32(*new_id, &packet->data[4]); @@ -220,12 +217,12 @@ void NetworkedMultiplayerENet::poll() { } else { if (server) { - //someone disconnected, let it know to everyone else + // Someone disconnected, notify everyone else for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { if (E->key() == *id) continue; - //send the new peer to existing peers + ENetPacket *packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); encode_uint32(SYSMSG_REMOVE_PEER, &packet->data[0]); encode_uint32(*id, &packet->data[4]); @@ -246,7 +243,7 @@ void NetworkedMultiplayerENet::poll() { case ENET_EVENT_TYPE_RECEIVE: { if (event.channelID == SYSCH_CONFIG) { - //some config message + // Some config message ERR_CONTINUE(event.packet->dataLength < 8); // Only server can send config messages @@ -292,13 +289,13 @@ void NetworkedMultiplayerENet::poll() { packet.from = *id; if (target == 0) { - //re-send the everyone but sender :| + // Re-send to everyone but sender :| incoming_packets.push_back(packet); - //and make copies for sending + // And make copies for sending for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { - if (uint32_t(E->key()) == source) //do not resend to self + if (uint32_t(E->key()) == source) // Do not resend to self continue; ENetPacket *packet2 = enet_packet_create(packet.packet->data, packet.packet->dataLength, flags); @@ -307,12 +304,12 @@ void NetworkedMultiplayerENet::poll() { } } else if (target < 0) { - //to all but one + // To all but one - //and make copies for sending + // And make copies for sending for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { - if (uint32_t(E->key()) == source || E->key() == -target) //do not resend to self, also do not send to excluded + if (uint32_t(E->key()) == source || E->key() == -target) // Do not resend to self, also do not send to excluded continue; ENetPacket *packet2 = enet_packet_create(packet.packet->data, packet.packet->dataLength, flags); @@ -321,18 +318,18 @@ void NetworkedMultiplayerENet::poll() { } if (-target != 1) { - //server is not excluded + // Server is not excluded incoming_packets.push_back(packet); } else { - //server is excluded, erase packet + // Server is excluded, erase packet enet_packet_destroy(packet.packet); } } else if (target == 1) { - //to myself and only myself + // To myself and only myself incoming_packets.push_back(packet); } else { - //to someone else, specifically + // To someone else, specifically ERR_CONTINUE(!peer_map.has(target)); enet_peer_send(peer_map[target], event.channelID, packet.packet); } @@ -341,14 +338,14 @@ void NetworkedMultiplayerENet::poll() { incoming_packets.push_back(packet); } - //destroy packet later.. + // Destroy packet later.. } else { ERR_CONTINUE(true); } } break; case ENET_EVENT_TYPE_NONE: { - //do nothing + // Do nothing } break; } } @@ -377,16 +374,46 @@ void NetworkedMultiplayerENet::close_connection() { if (peers_disconnected) { enet_host_flush(host); - OS::get_singleton()->delay_usec(100); //wait 100ms for disconnection packets to send + OS::get_singleton()->delay_usec(100); // Wait 100ms for disconnection packets to send } enet_host_destroy(host); active = false; incoming_packets.clear(); - unique_id = 1; //server is 1 + unique_id = 1; // Server is 1 connection_status = CONNECTION_DISCONNECTED; } +void NetworkedMultiplayerENet::disconnect_peer(int p_peer, bool now) { + + ERR_FAIL_COND(!active); + ERR_FAIL_COND(!is_server()); + ERR_FAIL_COND(!peer_map.has(p_peer)) + + if (now) { + enet_peer_disconnect_now(peer_map[p_peer], 0); + + // enet_peer_disconnect_now doesn't generate ENET_EVENT_TYPE_DISCONNECT, + // notify everyone else, send disconnect signal & remove from peer_map like in poll() + + for (Map<int, ENetPeer *>::Element *E = peer_map.front(); E; E = E->next()) { + + if (E->key() == p_peer) + continue; + + ENetPacket *packet = enet_packet_create(NULL, 8, ENET_PACKET_FLAG_RELIABLE); + encode_uint32(SYSMSG_REMOVE_PEER, &packet->data[0]); + encode_uint32(p_peer, &packet->data[4]); + enet_peer_send(E->get(), SYSCH_CONFIG, packet); + } + + emit_signal("peer_disconnected", p_peer); + peer_map.erase(p_peer); + } else { + enet_peer_disconnect_later(peer_map[p_peer], 0); + } +} + int NetworkedMultiplayerENet::get_available_packet_count() const { return incoming_packets.size(); @@ -440,9 +467,9 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer } ENetPacket *packet = enet_packet_create(NULL, p_buffer_size + 12, packet_flags); - encode_uint32(unique_id, &packet->data[0]); //source ID - encode_uint32(target_peer, &packet->data[4]); //dest ID - encode_uint32(packet_flags, &packet->data[8]); //dest ID + encode_uint32(unique_id, &packet->data[0]); // Source ID + encode_uint32(target_peer, &packet->data[4]); // Dest ID + encode_uint32(packet_flags, &packet->data[8]); // Dest ID copymem(&packet->data[12], p_buffer, p_buffer_size); if (server) { @@ -450,14 +477,14 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer if (target_peer == 0) { enet_host_broadcast(host, channel, packet); } else if (target_peer < 0) { - //send to all but one - //and make copies for sending + // Send to all but one + // and make copies for sending int exclude = -target_peer; for (Map<int, ENetPeer *>::Element *F = peer_map.front(); F; F = F->next()) { - if (F->key() == exclude) // exclude packet + if (F->key() == exclude) // Exclude packet continue; ENetPacket *packet2 = enet_packet_create(packet->data, packet->dataLength, packet_flags); @@ -465,14 +492,14 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer enet_peer_send(F->get(), channel, packet2); } - enet_packet_destroy(packet); //original packet no longer needed + enet_packet_destroy(packet); // Original packet no longer needed } else { enet_peer_send(E->get(), channel, packet); } } else { ERR_FAIL_COND_V(!peer_map.has(1), ERR_BUG); - enet_peer_send(peer_map[1], channel, packet); //send to server for broadcast.. + enet_peer_send(peer_map[1], channel, packet); // Send to server for broadcast.. } enet_host_flush(host); @@ -482,7 +509,7 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer, int p_buffer int NetworkedMultiplayerENet::get_max_packet_size() const { - return 1 << 24; //anything is good + return 1 << 24; // Anything is good } void NetworkedMultiplayerENet::_pop_current_packet() { @@ -511,16 +538,12 @@ uint32_t NetworkedMultiplayerENet::_gen_unique_id() const { (uint32_t)OS::get_singleton()->get_unix_time(), hash); hash = hash_djb2_one_32( (uint32_t)OS::get_singleton()->get_user_data_dir().hash64(), hash); - /* - hash = hash_djb2_one_32( - (uint32_t)OS::get_singleton()->get_unique_id().hash64(), hash ); - */ hash = hash_djb2_one_32( - (uint32_t)((uint64_t)this), hash); //rely on aslr heap + (uint32_t)((uint64_t)this), hash); // Rely on ASLR heap hash = hash_djb2_one_32( - (uint32_t)((uint64_t)&hash), hash); //rely on aslr stack + (uint32_t)((uint64_t)&hash), hash); // Rely on ASLR stack - hash = hash & 0x7FFFFFFF; // make it compatible with unsigned, since negatie id is used for exclusion + hash = hash & 0x7FFFFFFF; // Make it compatible with unsigned, since negative ID is used for exclusion } return hash; @@ -596,7 +619,7 @@ size_t NetworkedMultiplayerENet::enet_compress(void *context, const ENetBuffer * return 0; if (ret > int(outLimit)) - return 0; //do not bother + return 0; // Do not bother copymem(outData, enet->dst_compressor_mem.ptr(), ret); @@ -659,6 +682,7 @@ void NetworkedMultiplayerENet::_bind_methods() { ClassDB::bind_method(D_METHOD("create_server", "port", "max_clients", "in_bandwidth", "out_bandwidth"), &NetworkedMultiplayerENet::create_server, DEFVAL(32), DEFVAL(0), DEFVAL(0)); ClassDB::bind_method(D_METHOD("create_client", "ip", "port", "in_bandwidth", "out_bandwidth"), &NetworkedMultiplayerENet::create_client, DEFVAL(0), DEFVAL(0)); ClassDB::bind_method(D_METHOD("close_connection"), &NetworkedMultiplayerENet::close_connection); + ClassDB::bind_method(D_METHOD("disconnect_peer", "id", "now"), &NetworkedMultiplayerENet::disconnect_peer, DEFVAL(false)); ClassDB::bind_method(D_METHOD("set_compression_mode", "mode"), &NetworkedMultiplayerENet::set_compression_mode); ClassDB::bind_method(D_METHOD("get_compression_mode"), &NetworkedMultiplayerENet::get_compression_mode); ClassDB::bind_method(D_METHOD("set_bind_ip", "ip"), &NetworkedMultiplayerENet::set_bind_ip); @@ -696,7 +720,7 @@ NetworkedMultiplayerENet::~NetworkedMultiplayerENet() { close_connection(); } -// sets IP for ENet to bind when using create_server +// Sets IP for ENet to bind when using create_server // if no IP is set, then ENet bind to ENET_HOST_ANY void NetworkedMultiplayerENet::set_bind_ip(const IP_Address &p_ip) { ERR_FAIL_COND(!p_ip.is_valid() && !p_ip.is_wildcard()); diff --git a/modules/enet/networked_multiplayer_enet.h b/modules/enet/networked_multiplayer_enet.h index 440e9b5400..f93f24fd49 100644 --- a/modules/enet/networked_multiplayer_enet.h +++ b/modules/enet/networked_multiplayer_enet.h @@ -120,6 +120,8 @@ public: void close_connection(); + void disconnect_peer(int p_peer, bool now = false); + virtual void poll(); virtual bool is_server() const; diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index fa7c9e091e..ecd98f054d 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -1434,7 +1434,7 @@ void ItemList::_bind_methods() { ClassDB::bind_method(D_METHOD("is_selected", "idx"), &ItemList::is_selected); ClassDB::bind_method(D_METHOD("get_selected_items"), &ItemList::get_selected_items); - ClassDB::bind_method(D_METHOD("move_item", "p_from_idx", "p_to_idx"), &ItemList::move_item); + ClassDB::bind_method(D_METHOD("move_item", "from_idx", "to_idx"), &ItemList::move_item); ClassDB::bind_method(D_METHOD("get_item_count"), &ItemList::get_item_count); ClassDB::bind_method(D_METHOD("remove_item", "idx"), &ItemList::remove_item); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index cc6a677ec8..633ffedd04 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -4023,6 +4023,9 @@ int TextEdit::_is_line_in_region(int p_line) { // calculate up to line we need and update the cache along the way. int in_region = color_region_cache[previous_line]; + if (previous_line == -1) { + in_region = -1; + } for (int i = previous_line; i < p_line; i++) { const Map<int, Text::ColorRegionInfo> &cri_map = _get_line_color_region_info(i); for (const Map<int, Text::ColorRegionInfo>::Element *E = cri_map.front(); E; E = E->next()) { diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 45a969eeda..568a765420 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1814,7 +1814,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { } if (!over) { - OS::get_singleton()->set_cursor_shape(OS::CURSOR_ARROW); + OS::get_singleton()->set_cursor_shape((OS::CursorShape)Input::get_singleton()->get_default_cursor_shape()); return; } diff --git a/servers/arvr_server.cpp b/servers/arvr_server.cpp index f9d402fe7b..f48bedbdac 100644 --- a/servers/arvr_server.cpp +++ b/servers/arvr_server.cpp @@ -58,6 +58,8 @@ void ARVRServer::_bind_methods() { ClassDB::bind_method(D_METHOD("get_primary_interface"), &ARVRServer::get_primary_interface); ClassDB::bind_method(D_METHOD("set_primary_interface", "interface"), &ARVRServer::set_primary_interface); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "primary_interface"), "set_primary_interface", "get_primary_interface"); + ClassDB::bind_method(D_METHOD("get_last_process_usec"), &ARVRServer::get_last_process_usec); ClassDB::bind_method(D_METHOD("get_last_commit_usec"), &ARVRServer::get_last_commit_usec); ClassDB::bind_method(D_METHOD("get_last_frame_usec"), &ARVRServer::get_last_frame_usec); |