summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2020-02-24 06:21:15 +0100
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2020-03-08 12:16:09 +0100
commit540ca05a80e23daafa191cdf24c07b3f8e37b47a (patch)
treeaa4fda23fcc0d8e4ce5bef10df0a7f7ae4ca04ea
parent74051c77dc3ec1548f8efedfd892a0b2ad3537ad (diff)
Threaded networking for editor debugger.
-rw-r--r--editor/debugger/editor_debugger_node.cpp44
-rw-r--r--editor/debugger/editor_debugger_node.h39
-rw-r--r--editor/debugger/editor_debugger_server.cpp216
-rw-r--r--editor/debugger/editor_debugger_server.h59
-rw-r--r--editor/debugger/script_editor_debugger.cpp74
-rw-r--r--editor/debugger/script_editor_debugger.h34
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp6
-rw-r--r--editor/plugins/script_editor_plugin.cpp1
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp10
-rw-r--r--modules/mono/mono_gd/gd_mono_utils.cpp2
10 files changed, 385 insertions, 100 deletions
diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp
index fba86f2954..825883cffe 100644
--- a/editor/debugger/editor_debugger_node.cpp
+++ b/editor/debugger/editor_debugger_node.cpp
@@ -31,9 +31,12 @@
#include "editor_debugger_node.h"
#include "editor/debugger/editor_debugger_tree.h"
+#include "editor/debugger/script_editor_debugger.h"
#include "editor/editor_log.h"
#include "editor/editor_node.h"
#include "editor/plugins/script_editor_plugin.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/tab_container.h"
template <typename Func>
void _for_all(TabContainer *p_node, const Func &p_func) {
@@ -49,7 +52,6 @@ EditorDebuggerNode *EditorDebuggerNode::singleton = NULL;
EditorDebuggerNode::EditorDebuggerNode() {
if (!singleton)
singleton = this;
- server.instance();
add_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT));
add_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT));
@@ -179,10 +181,9 @@ Error EditorDebuggerNode::start() {
EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
}
- int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
- const Error err = server->listen(remote_port);
+ server = Ref<EditorDebuggerServer>(EditorDebuggerServer::create_default());
+ const Error err = server->start();
if (err != OK) {
- EditorNode::get_log()->add_message(String("Error listening on port ") + itos(remote_port), EditorLog::MSG_TYPE_ERROR);
return err;
}
set_process(true);
@@ -191,9 +192,10 @@ Error EditorDebuggerNode::start() {
}
void EditorDebuggerNode::stop() {
- if (server->is_listening()) {
+ if (server.is_valid()) {
server->stop();
EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
+ server.unref();
}
// Also close all debugging sessions.
_for_all(tabs, [&](ScriptEditorDebugger *dbg) {
@@ -231,9 +233,14 @@ void EditorDebuggerNode::_notification(int p_what) {
break;
}
- if (p_what != NOTIFICATION_PROCESS || !server->is_listening())
+ if (p_what != NOTIFICATION_PROCESS || !server.is_valid())
return;
+ if (!server.is_valid() || !server->is_active()) {
+ stop();
+ return;
+ }
+
// Errors and warnings
int error_count = 0;
int warning_count = 0;
@@ -293,9 +300,8 @@ void EditorDebuggerNode::_notification(int p_what) {
if (tabs->get_tab_count() <= 4) { // Max 4 debugging sessions active.
debugger = _add_debugger();
} else {
- // We already have too many sessions, disconnecting new clients to prevent it from hanging.
- // (Not keeping a reference to the connection will disconnect it)
- server->take_connection();
+ // We already have too many sessions, disconnecting new clients to prevent them from hanging.
+ server->take_connection()->close();
return; // Can't add, stop here.
}
}
@@ -462,6 +468,26 @@ void EditorDebuggerNode::reload_scripts() {
});
}
+void EditorDebuggerNode::debug_next() {
+ get_default_debugger()->debug_next();
+}
+
+void EditorDebuggerNode::debug_step() {
+ get_default_debugger()->debug_step();
+}
+
+void EditorDebuggerNode::debug_break() {
+ get_default_debugger()->debug_break();
+}
+
+void EditorDebuggerNode::debug_continue() {
+ get_default_debugger()->debug_continue();
+}
+
+String EditorDebuggerNode::get_var_value(const String &p_var) const {
+ return get_default_debugger()->get_var_value(p_var);
+}
+
// LiveEdit/Inspector
void EditorDebuggerNode::request_remote_tree() {
get_current_debugger()->request_remote_tree();
diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h
index 13a1d6dcb3..6181ccdb5f 100644
--- a/editor/debugger/editor_debugger_node.h
+++ b/editor/debugger/editor_debugger_node.h
@@ -31,17 +31,30 @@
#ifndef EDITOR_DEBUGGER_NODE_H
#define EDITOR_DEBUGGER_NODE_H
-#include "core/io/tcp_server.h"
-#include "editor/debugger/script_editor_debugger.h"
-#include "scene/gui/button.h"
-#include "scene/gui/tab_container.h"
+#include "editor/debugger/editor_debugger_server.h"
+#include "scene/gui/margin_container.h"
+class Button;
class EditorDebuggerTree;
+class EditorDebuggerRemoteObject;
+class MenuButton;
+class ScriptEditorDebugger;
+class TabContainer;
class EditorDebuggerNode : public MarginContainer {
GDCLASS(EditorDebuggerNode, MarginContainer);
+public:
+ enum CameraOverride {
+ OVERRIDE_NONE,
+ OVERRIDE_2D,
+ OVERRIDE_3D_1, // 3D Viewport 1
+ OVERRIDE_3D_2, // 3D Viewport 2
+ OVERRIDE_3D_3, // 3D Viewport 3
+ OVERRIDE_3D_4 // 3D Viewport 4
+ };
+
private:
enum Options {
DEBUG_NEXT,
@@ -71,7 +84,7 @@ private:
}
};
- Ref<TCP_Server> server = NULL;
+ Ref<EditorDebuggerServer> server;
TabContainer *tabs = NULL;
Button *debugger_button = NULL;
MenuButton *script_menu = NULL;
@@ -87,7 +100,7 @@ private:
bool auto_switch_remote_scene_tree = false;
bool debug_with_external_editor = false;
bool hide_on_stop = true;
- ScriptEditorDebugger::CameraOverride camera_override = ScriptEditorDebugger::OVERRIDE_NONE;
+ CameraOverride camera_override = OVERRIDE_NONE;
Map<Breakpoint, bool> breakpoints;
ScriptEditorDebugger *_add_debugger();
@@ -130,10 +143,10 @@ public:
ScriptEditorDebugger *get_default_debugger() const;
ScriptEditorDebugger *get_debugger(int p_debugger) const;
- void debug_next() { get_default_debugger()->debug_next(); }
- void debug_step() { get_default_debugger()->debug_step(); }
- void debug_break() { get_default_debugger()->debug_break(); }
- void debug_continue() { get_default_debugger()->debug_continue(); }
+ void debug_next();
+ void debug_step();
+ void debug_break();
+ void debug_continue();
void set_script_debug_button(MenuButton *p_button);
@@ -141,7 +154,7 @@ public:
debugger_button = p_button;
}
- String get_var_value(const String &p_var) const { return get_default_debugger()->get_var_value(p_var); }
+ String get_var_value(const String &p_var) const;
Ref<Script> get_dump_stack_script() const { return stack_script; } // Why do we need this?
bool get_debug_with_external_editor() { return debug_with_external_editor; }
@@ -167,8 +180,8 @@ public:
void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos);
// Camera
- void set_camera_override(ScriptEditorDebugger::CameraOverride p_override) { camera_override = p_override; }
- ScriptEditorDebugger::CameraOverride get_camera_override() { return camera_override; }
+ void set_camera_override(CameraOverride p_override) { camera_override = p_override; }
+ CameraOverride get_camera_override() { return camera_override; }
Error start();
diff --git a/editor/debugger/editor_debugger_server.cpp b/editor/debugger/editor_debugger_server.cpp
new file mode 100644
index 0000000000..bde0921ced
--- /dev/null
+++ b/editor/debugger/editor_debugger_server.cpp
@@ -0,0 +1,216 @@
+/*************************************************************************/
+/* editor_debugger_server.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_debugger_server.h"
+
+#include "core/io/packet_peer.h"
+#include "core/io/tcp_server.h"
+#include "core/os/mutex.h"
+#include "core/os/thread.h"
+#include "editor/editor_log.h"
+#include "editor/editor_node.h"
+#include "editor/editor_settings.h"
+
+class EditorDebuggerPeerTCP : public EditorDebuggerPeer {
+
+private:
+ enum {
+ QUEUE_MAX = 2048,
+ POLL_USEC_MAX = 100,
+ };
+ Ref<StreamPeerTCP> tcp;
+ Ref<PacketPeerStream> packet_peer;
+ List<Array> out_queue;
+ List<Array> in_queue;
+ Mutex mutex;
+ bool connected = false;
+
+public:
+ Error poll() {
+ MutexLock lock(mutex);
+ connected = tcp->get_status() == StreamPeerTCP::STATUS_CONNECTED;
+ Error err = OK;
+ uint64_t ticks = OS::get_singleton()->get_ticks_usec();
+ while (connected && packet_peer->get_available_packet_count() > 0 && in_queue.size() < QUEUE_MAX && OS::get_singleton()->get_ticks_usec() - ticks < POLL_USEC_MAX) {
+ Variant var;
+ err = packet_peer->get_var(var);
+ connected = tcp->get_status() == StreamPeerTCP::STATUS_CONNECTED;
+ if (err != OK) {
+ ERR_PRINT("Error reading variant from peer");
+ break;
+ }
+ ERR_CONTINUE_MSG(var.get_type() != Variant::ARRAY, "Malformed packet received, not an Array.");
+ in_queue.push_back(var);
+ }
+ ticks = OS::get_singleton()->get_ticks_usec();
+ while (connected && out_queue.size() > 0 && OS::get_singleton()->get_ticks_usec() - ticks < POLL_USEC_MAX) {
+ Array arr = out_queue[0];
+ out_queue.pop_front();
+ packet_peer->put_var(arr);
+ connected = tcp->get_status() == StreamPeerTCP::STATUS_CONNECTED;
+ }
+ return err;
+ }
+
+ bool has_message() {
+ return in_queue.size() > 0;
+ }
+
+ Array get_message() {
+ MutexLock lock(mutex);
+ ERR_FAIL_COND_V(!has_message(), Array());
+ Array out = in_queue[0];
+ in_queue.pop_front();
+ return out;
+ }
+
+ Error put_message(const Array p_arr) {
+ MutexLock lock(mutex);
+ if (out_queue.size() > QUEUE_MAX) {
+ return ERR_OUT_OF_MEMORY;
+ }
+ out_queue.push_back(p_arr);
+ return OK;
+ }
+
+ int get_max_message_size() const {
+ return 8 << 20; // 8 MiB
+ }
+
+ bool is_peer_connected() {
+ return connected;
+ }
+
+ void close() {
+ MutexLock lock(mutex);
+ connected = false;
+ tcp->disconnect_from_host();
+ }
+
+ EditorDebuggerPeerTCP(Ref<StreamPeerTCP> p_stream) {
+ packet_peer.instance();
+ tcp = p_stream;
+ if (tcp.is_null()) {
+ tcp.instance(); // Bug?
+ }
+ packet_peer->set_stream_peer(tcp);
+ }
+
+ ~EditorDebuggerPeerTCP() {
+ close();
+ packet_peer->set_stream_peer(Ref<StreamPeer>());
+ }
+};
+
+class EditorDebuggerServerTCP : public EditorDebuggerServer {
+
+private:
+ Ref<TCP_Server> server;
+ List<Ref<EditorDebuggerPeer> > peers;
+ Thread *thread = NULL;
+ Mutex mutex;
+ bool running = false;
+
+ static void _poll_func(void *p_ud);
+
+public:
+ virtual Error start();
+ virtual void stop();
+ virtual bool is_active() const;
+ virtual bool is_connection_available() const;
+ virtual Ref<EditorDebuggerPeer> take_connection();
+
+ EditorDebuggerServerTCP();
+};
+
+EditorDebuggerServerTCP::EditorDebuggerServerTCP() {
+ server.instance();
+}
+
+Error EditorDebuggerServerTCP::start() {
+ int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
+ const Error err = server->listen(remote_port);
+ if (err != OK) {
+ EditorNode::get_log()->add_message(String("Error listening on port ") + itos(remote_port), EditorLog::MSG_TYPE_ERROR);
+ return err;
+ }
+ running = true;
+ thread = Thread::create(_poll_func, this);
+ return err;
+}
+
+void EditorDebuggerServerTCP::stop() {
+ server->stop();
+ if (thread != NULL) {
+ running = false;
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ thread = NULL;
+ }
+}
+
+bool EditorDebuggerServerTCP::is_active() const {
+ return server->is_listening();
+}
+
+bool EditorDebuggerServerTCP::is_connection_available() const {
+ return server->is_listening() && server->is_connection_available();
+}
+
+Ref<EditorDebuggerPeer> EditorDebuggerServerTCP::take_connection() {
+ ERR_FAIL_COND_V(!is_connection_available(), Ref<EditorDebuggerPeer>());
+ MutexLock lock(mutex);
+ Ref<EditorDebuggerPeerTCP> peer = memnew(EditorDebuggerPeerTCP(server->take_connection()));
+ peers.push_back(peer);
+ return peer;
+}
+
+void EditorDebuggerServerTCP::_poll_func(void *p_ud) {
+ EditorDebuggerServerTCP *me = (EditorDebuggerServerTCP *)p_ud;
+ while (me->running) {
+ me->mutex.lock();
+ List<Ref<EditorDebuggerPeer> > remove;
+ for (int i = 0; i < me->peers.size(); i++) {
+ Ref<EditorDebuggerPeer> peer = me->peers[i];
+ Error err = ((EditorDebuggerPeerTCP *)peer.ptr())->poll();
+ if (err != OK || !peer->is_peer_connected())
+ remove.push_back(peer);
+ }
+ for (List<Ref<EditorDebuggerPeer> >::Element *E = remove.front(); E; E = E->next()) {
+ me->peers.erase(E->get());
+ }
+ me->mutex.unlock();
+ OS::get_singleton()->delay_usec(50);
+ }
+}
+
+EditorDebuggerServer *EditorDebuggerServer::create_default() {
+ return memnew(EditorDebuggerServerTCP);
+}
diff --git a/editor/debugger/editor_debugger_server.h b/editor/debugger/editor_debugger_server.h
new file mode 100644
index 0000000000..4594a8decf
--- /dev/null
+++ b/editor/debugger/editor_debugger_server.h
@@ -0,0 +1,59 @@
+/*************************************************************************/
+/* editor_debugger_server.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_DEBUGGER_CONNECTION_H
+#define EDITOR_DEBUGGER_CONNECTION_H
+
+#include "core/reference.h"
+
+class EditorDebuggerPeer : public Reference {
+
+public:
+ virtual bool has_message() = 0;
+ virtual Array get_message() = 0;
+ virtual Error put_message(const Array p_arr) = 0;
+
+ virtual int get_max_message_size() const = 0;
+ virtual bool is_peer_connected() = 0;
+ virtual void close() = 0;
+};
+
+class EditorDebuggerServer : public Reference {
+
+public:
+ static EditorDebuggerServer *create_default();
+ virtual Error start() = 0;
+ virtual void stop() = 0;
+ virtual bool is_active() const = 0;
+ virtual bool is_connection_available() const = 0;
+ virtual Ref<EditorDebuggerPeer> take_connection() = 0;
+};
+
+#endif // EDITOR_DEBUGGER_CONNECTION_H
diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp
index 169ff61e71..299f504f1e 100644
--- a/editor/debugger/script_editor_debugger.cpp
+++ b/editor/debugger/script_editor_debugger.cpp
@@ -45,6 +45,7 @@
#include "editor/plugins/spatial_editor_plugin.h"
#include "editor/property_editor.h"
#include "main/performance.h"
+#include "scene/3d/camera.h"
#include "scene/debugger/scene_debugger.h"
#include "scene/gui/dialogs.h"
#include "scene/gui/label.h"
@@ -58,12 +59,14 @@
#include "scene/gui/tree.h"
#include "scene/resources/packed_scene.h"
+using CameraOverride = EditorDebuggerNode::CameraOverride;
+
void ScriptEditorDebugger::_put_msg(String p_message, Array p_data) {
if (is_session_active()) {
Array msg;
msg.push_back(p_message);
msg.push_back(p_data);
- ppeer->put_var(msg);
+ peer->put_message(msg);
}
}
@@ -776,7 +779,7 @@ void ScriptEditorDebugger::_notification(int p_what) {
if (is_session_active()) {
- if (camera_override == OVERRIDE_2D) {
+ if (camera_override == CameraOverride::OVERRIDE_2D) {
CanvasItemEditor *editor = CanvasItemEditor::get_singleton();
Dictionary state = editor->get_state();
@@ -791,8 +794,8 @@ void ScriptEditorDebugger::_notification(int p_what) {
msg.push_back(transform);
_put_msg("override_camera_2D:transform", msg);
- } else if (camera_override >= OVERRIDE_3D_1) {
- int viewport_idx = camera_override - OVERRIDE_3D_1;
+ } else if (camera_override >= CameraOverride::OVERRIDE_3D_1) {
+ int viewport_idx = camera_override - CameraOverride::OVERRIDE_3D_1;
SpatialEditorViewport *viewport = SpatialEditor::get_singleton()->get_editor_viewport(viewport_idx);
Camera *const cam = viewport->get_camera();
@@ -811,30 +814,11 @@ void ScriptEditorDebugger::_notification(int p_what) {
}
}
- if (!is_session_active()) {
- _stop_and_notify();
- break;
- };
-
- if (ppeer->get_available_packet_count() <= 0) {
- break;
- };
-
const uint64_t until = OS::get_singleton()->get_ticks_msec() + 20;
- while (ppeer->get_available_packet_count() > 0) {
+ while (peer->has_message()) {
- Variant cmd;
- Error ret = ppeer->get_var(cmd);
- if (ret != OK) {
- _stop_and_notify();
- ERR_FAIL_MSG("Error decoding variant from peer");
- }
- if (cmd.get_type() != Variant::ARRAY) {
- _stop_and_notify();
- ERR_FAIL_MSG("Invalid message format received from peer");
- }
- Array arr = cmd;
+ Array arr = peer->get_message();
if (arr.size() != 2 || arr[0].get_type() != Variant::STRING || arr[1].get_type() != Variant::ARRAY) {
_stop_and_notify();
ERR_FAIL_MSG("Invalid message format received from peer");
@@ -844,6 +828,10 @@ void ScriptEditorDebugger::_notification(int p_what) {
if (OS::get_singleton()->get_ticks_msec() > until)
break;
}
+ if (!is_session_active()) {
+ _stop_and_notify();
+ break;
+ };
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
@@ -875,14 +863,13 @@ void ScriptEditorDebugger::_clear_execution() {
inspector->clear_stack_variables();
}
-void ScriptEditorDebugger::start(Ref<StreamPeerTCP> p_connection) {
+void ScriptEditorDebugger::start(Ref<EditorDebuggerPeer> p_peer) {
error_count = 0;
warning_count = 0;
stop();
- connection = p_connection;
- ppeer->set_stream_peer(connection);
+ peer = p_peer;
perf_history.clear();
for (int i = 0; i < Performance::MONITOR_MAX; i++) {
@@ -893,7 +880,7 @@ void ScriptEditorDebugger::start(Ref<StreamPeerTCP> p_connection) {
set_process(true);
breaked = false;
can_debug = true;
- camera_override = OVERRIDE_NONE;
+ camera_override = CameraOverride::OVERRIDE_NONE;
tabs->set_current_tab(0);
_set_reason_text(TTR("Debug session started."), MESSAGE_SUCCESS);
@@ -936,10 +923,10 @@ void ScriptEditorDebugger::stop() {
_clear_execution();
inspector->clear_cache();
- ppeer->set_stream_peer(Ref<StreamPeer>());
- if (connection.is_valid()) {
- connection.unref();
+ if (peer.is_valid()) {
+ peer->close();
+ peer.unref();
reason->set_text("");
reason->set_tooltip("");
}
@@ -971,9 +958,6 @@ void ScriptEditorDebugger::_profiler_activate(bool p_enable) {
void ScriptEditorDebugger::_visual_profiler_activate(bool p_enable) {
- if (!connection.is_valid())
- return;
-
if (p_enable) {
profiler_signature.clear();
_put_msg("start_visual_profiling", Array());
@@ -1328,25 +1312,25 @@ void ScriptEditorDebugger::live_debug_reparent_node(const NodePath &p_at, const
}
}
-ScriptEditorDebugger::CameraOverride ScriptEditorDebugger::get_camera_override() const {
+CameraOverride ScriptEditorDebugger::get_camera_override() const {
return camera_override;
}
void ScriptEditorDebugger::set_camera_override(CameraOverride p_override) {
- if (p_override == OVERRIDE_2D && camera_override != OVERRIDE_2D) {
+ if (p_override == CameraOverride::OVERRIDE_2D && camera_override != CameraOverride::OVERRIDE_2D) {
Array msg;
msg.push_back(true);
_put_msg("override_camera_2D:set", msg);
- } else if (p_override != OVERRIDE_2D && camera_override == OVERRIDE_2D) {
+ } else if (p_override != CameraOverride::OVERRIDE_2D && camera_override == CameraOverride::OVERRIDE_2D) {
Array msg;
msg.push_back(false);
_put_msg("override_camera_2D:set", msg);
- } else if (p_override >= OVERRIDE_3D_1 && camera_override < OVERRIDE_3D_1) {
+ } else if (p_override >= CameraOverride::OVERRIDE_3D_1 && camera_override < CameraOverride::OVERRIDE_3D_1) {
Array msg;
msg.push_back(true);
_put_msg("override_camera_3D:set", msg);
- } else if (p_override < OVERRIDE_3D_1 && camera_override >= OVERRIDE_3D_1) {
+ } else if (p_override < CameraOverride::OVERRIDE_3D_1 && camera_override >= CameraOverride::OVERRIDE_3D_1) {
Array msg;
msg.push_back(false);
_put_msg("override_camera_3D:set", msg);
@@ -1423,7 +1407,6 @@ void ScriptEditorDebugger::_clear_errors_list() {
error_tree->clear();
error_count = 0;
warning_count = 0;
- update_tabs();
}
// Right click on specific file(s) or folder(s).
@@ -1502,8 +1485,6 @@ void ScriptEditorDebugger::_bind_methods() {
ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
- ppeer = Ref<PacketPeerStream>(memnew(PacketPeerStream));
- ppeer->set_input_buffer_max_size((1024 * 1024 * 8) - 4); // 8 MiB should be enough, minus 4 bytes for separator.
editor = p_editor;
tabs = memnew(TabContainer);
@@ -1824,7 +1805,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
add_child(msgdialog);
live_debug = true;
- camera_override = OVERRIDE_NONE;
+ camera_override = CameraOverride::OVERRIDE_NONE;
last_path_id = false;
error_count = 0;
warning_count = 0;
@@ -1833,6 +1814,9 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
ScriptEditorDebugger::~ScriptEditorDebugger() {
- ppeer->set_stream_peer(Ref<StreamPeer>());
+ if (peer.is_valid()) {
+ peer->close();
+ peer.unref();
+ }
memdelete(scene_tree);
}
diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h
index fd034ba983..1fd0713fe5 100644
--- a/editor/debugger/script_editor_debugger.h
+++ b/editor/debugger/script_editor_debugger.h
@@ -31,14 +31,13 @@
#ifndef SCRIPT_EDITOR_DEBUGGER_H
#define SCRIPT_EDITOR_DEBUGGER_H
-#include "core/io/packet_peer.h"
-#include "core/io/stream_peer_tcp.h"
+#include "core/os/os.h"
#include "editor/debugger/editor_debugger_inspector.h"
-#include "editor/editor_inspector.h"
-#include "editor/property_editor.h"
-#include "scene/3d/camera.h"
-#include "scene/gui/box_container.h"
+#include "editor/debugger/editor_debugger_node.h"
+#include "editor/debugger/editor_debugger_server.h"
+#include "editor/editor_file_dialog.h"
#include "scene/gui/button.h"
+#include "scene/gui/margin_container.h"
class Tree;
class EditorNode;
@@ -61,16 +60,6 @@ class ScriptEditorDebugger : public MarginContainer {
friend class EditorDebuggerNode;
-public:
- enum CameraOverride {
- OVERRIDE_NONE,
- OVERRIDE_2D,
- OVERRIDE_3D_1, // 3D Viewport 1
- OVERRIDE_3D_2, // 3D Viewport 2
- OVERRIDE_3D_3, // 3D Viewport 3
- OVERRIDE_3D_4 // 3D Viewport 4
- };
-
private:
enum MessageType {
MESSAGE_ERROR,
@@ -132,8 +121,7 @@ private:
EditorDebuggerInspector *inspector;
SceneDebuggerTree *scene_tree;
- Ref<StreamPeerTCP> connection;
- Ref<PacketPeerStream> ppeer;
+ Ref<EditorDebuggerPeer> peer;
HashMap<NodePath, int> node_path_cache;
int last_path_id;
@@ -151,7 +139,7 @@ private:
bool live_debug;
- CameraOverride camera_override;
+ EditorDebuggerNode::CameraOverride camera_override;
void _performance_draw();
void _performance_select();
@@ -216,7 +204,7 @@ public:
void request_remote_tree();
const SceneDebuggerTree *get_remote_tree();
- void start(Ref<StreamPeerTCP> p_connection);
+ void start(Ref<EditorDebuggerPeer> p_peer);
void stop();
void debug_skip_breakpoints();
@@ -228,7 +216,7 @@ public:
void debug_continue();
bool is_breaked() const { return breaked; }
bool is_debuggable() const { return can_debug; }
- bool is_session_active() { return connection.is_valid() && connection->is_connected_to_host(); };
+ bool is_session_active() { return peer.is_valid() && peer->is_peer_connected(); };
int get_remote_pid() const { return remote_pid; }
int get_error_count() const { return error_count; }
@@ -252,8 +240,8 @@ public:
void live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name);
void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos);
- CameraOverride get_camera_override() const;
- void set_camera_override(CameraOverride p_override);
+ EditorDebuggerNode::CameraOverride get_camera_override() const;
+ void set_camera_override(EditorDebuggerNode::CameraOverride p_override);
void set_breakpoint(const String &p_path, int p_line, bool p_enabled);
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index af7f8cf5d6..4bfe633494 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -3992,7 +3992,7 @@ void CanvasItemEditor::_notification(int p_what) {
if (!is_visible() && override_camera_button->is_pressed()) {
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
override_camera_button->set_pressed(false);
}
}
@@ -4348,9 +4348,9 @@ void CanvasItemEditor::_button_override_camera(bool p_pressed) {
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
if (p_pressed) {
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_2D);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_2D);
} else {
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
}
}
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 60bed10351..bb03cad285 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -37,7 +37,6 @@
#include "core/os/os.h"
#include "core/project_settings.h"
#include "editor/debugger/editor_debugger_node.h"
-#include "editor/debugger/script_editor_debugger.h"
#include "editor/editor_node.h"
#include "editor/editor_run_script.h"
#include "editor/editor_scale.h"
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
index 0bbcbb0080..85863d8c29 100644
--- a/editor/plugins/spatial_editor_plugin.cpp
+++ b/editor/plugins/spatial_editor_plugin.cpp
@@ -4487,12 +4487,12 @@ void SpatialEditor::_menu_item_toggled(bool pressed, int p_option) {
case MENU_TOOL_OVERRIDE_CAMERA: {
EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
+ using Override = EditorDebuggerNode::CameraOverride;
if (pressed) {
- using Override = ScriptEditorDebugger::CameraOverride;
debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
} else {
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
+ debugger->set_camera_override(Override::OVERRIDE_NONE);
}
} break;
@@ -4545,8 +4545,8 @@ void SpatialEditor::_update_camera_override_viewport(Object *p_viewport) {
EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
camera_override_viewport_id = current_viewport->index;
- if (debugger->get_camera_override() >= ScriptEditorDebugger::OVERRIDE_3D_1) {
- using Override = ScriptEditorDebugger::CameraOverride;
+ if (debugger->get_camera_override() >= EditorDebuggerNode::OVERRIDE_3D_1) {
+ using Override = EditorDebuggerNode::CameraOverride;
debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
}
@@ -5503,7 +5503,7 @@ void SpatialEditor::_notification(int p_what) {
if (!is_visible() && tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->is_pressed()) {
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
- debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
+ debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_pressed(false);
}
}
diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp
index 41f49d8ac9..b3a573bcd4 100644
--- a/modules/mono/mono_gd/gd_mono_utils.cpp
+++ b/modules/mono/mono_gd/gd_mono_utils.cpp
@@ -39,7 +39,7 @@
#include "core/reference.h"
#ifdef TOOLS_ENABLED
-#include "editor/debugger/script_editor_debugger.h"
+#include "editor/debugger/editor_debugger_node.h"
#endif
#include "../csharp_script.h"