mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 14:11:15 +00:00
Threaded networking for editor debugger.
This commit is contained in:
parent
74051c77dc
commit
540ca05a80
10 changed files with 385 additions and 100 deletions
|
|
@ -31,9 +31,12 @@
|
||||||
#include "editor_debugger_node.h"
|
#include "editor_debugger_node.h"
|
||||||
|
|
||||||
#include "editor/debugger/editor_debugger_tree.h"
|
#include "editor/debugger/editor_debugger_tree.h"
|
||||||
|
#include "editor/debugger/script_editor_debugger.h"
|
||||||
#include "editor/editor_log.h"
|
#include "editor/editor_log.h"
|
||||||
#include "editor/editor_node.h"
|
#include "editor/editor_node.h"
|
||||||
#include "editor/plugins/script_editor_plugin.h"
|
#include "editor/plugins/script_editor_plugin.h"
|
||||||
|
#include "scene/gui/menu_button.h"
|
||||||
|
#include "scene/gui/tab_container.h"
|
||||||
|
|
||||||
template <typename Func>
|
template <typename Func>
|
||||||
void _for_all(TabContainer *p_node, const Func &p_func) {
|
void _for_all(TabContainer *p_node, const Func &p_func) {
|
||||||
|
|
@ -49,7 +52,6 @@ EditorDebuggerNode *EditorDebuggerNode::singleton = NULL;
|
||||||
EditorDebuggerNode::EditorDebuggerNode() {
|
EditorDebuggerNode::EditorDebuggerNode() {
|
||||||
if (!singleton)
|
if (!singleton)
|
||||||
singleton = this;
|
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_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));
|
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);
|
EditorNode::get_singleton()->make_bottom_panel_item_visible(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
|
server = Ref<EditorDebuggerServer>(EditorDebuggerServer::create_default());
|
||||||
const Error err = server->listen(remote_port);
|
const Error err = server->start();
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
EditorNode::get_log()->add_message(String("Error listening on port ") + itos(remote_port), EditorLog::MSG_TYPE_ERROR);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
set_process(true);
|
set_process(true);
|
||||||
|
|
@ -191,9 +192,10 @@ Error EditorDebuggerNode::start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorDebuggerNode::stop() {
|
void EditorDebuggerNode::stop() {
|
||||||
if (server->is_listening()) {
|
if (server.is_valid()) {
|
||||||
server->stop();
|
server->stop();
|
||||||
EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
|
EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
|
||||||
|
server.unref();
|
||||||
}
|
}
|
||||||
// Also close all debugging sessions.
|
// Also close all debugging sessions.
|
||||||
_for_all(tabs, [&](ScriptEditorDebugger *dbg) {
|
_for_all(tabs, [&](ScriptEditorDebugger *dbg) {
|
||||||
|
|
@ -231,9 +233,14 @@ void EditorDebuggerNode::_notification(int p_what) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_what != NOTIFICATION_PROCESS || !server->is_listening())
|
if (p_what != NOTIFICATION_PROCESS || !server.is_valid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!server.is_valid() || !server->is_active()) {
|
||||||
|
stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Errors and warnings
|
// Errors and warnings
|
||||||
int error_count = 0;
|
int error_count = 0;
|
||||||
int warning_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.
|
if (tabs->get_tab_count() <= 4) { // Max 4 debugging sessions active.
|
||||||
debugger = _add_debugger();
|
debugger = _add_debugger();
|
||||||
} else {
|
} else {
|
||||||
// We already have too many sessions, disconnecting new clients to prevent it from hanging.
|
// We already have too many sessions, disconnecting new clients to prevent them from hanging.
|
||||||
// (Not keeping a reference to the connection will disconnect it)
|
server->take_connection()->close();
|
||||||
server->take_connection();
|
|
||||||
return; // Can't add, stop here.
|
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
|
// LiveEdit/Inspector
|
||||||
void EditorDebuggerNode::request_remote_tree() {
|
void EditorDebuggerNode::request_remote_tree() {
|
||||||
get_current_debugger()->request_remote_tree();
|
get_current_debugger()->request_remote_tree();
|
||||||
|
|
|
||||||
|
|
@ -31,17 +31,30 @@
|
||||||
#ifndef EDITOR_DEBUGGER_NODE_H
|
#ifndef EDITOR_DEBUGGER_NODE_H
|
||||||
#define EDITOR_DEBUGGER_NODE_H
|
#define EDITOR_DEBUGGER_NODE_H
|
||||||
|
|
||||||
#include "core/io/tcp_server.h"
|
#include "editor/debugger/editor_debugger_server.h"
|
||||||
#include "editor/debugger/script_editor_debugger.h"
|
#include "scene/gui/margin_container.h"
|
||||||
#include "scene/gui/button.h"
|
|
||||||
#include "scene/gui/tab_container.h"
|
|
||||||
|
|
||||||
|
class Button;
|
||||||
class EditorDebuggerTree;
|
class EditorDebuggerTree;
|
||||||
|
class EditorDebuggerRemoteObject;
|
||||||
|
class MenuButton;
|
||||||
|
class ScriptEditorDebugger;
|
||||||
|
class TabContainer;
|
||||||
|
|
||||||
class EditorDebuggerNode : public MarginContainer {
|
class EditorDebuggerNode : public MarginContainer {
|
||||||
|
|
||||||
GDCLASS(EditorDebuggerNode, 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:
|
private:
|
||||||
enum Options {
|
enum Options {
|
||||||
DEBUG_NEXT,
|
DEBUG_NEXT,
|
||||||
|
|
@ -71,7 +84,7 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Ref<TCP_Server> server = NULL;
|
Ref<EditorDebuggerServer> server;
|
||||||
TabContainer *tabs = NULL;
|
TabContainer *tabs = NULL;
|
||||||
Button *debugger_button = NULL;
|
Button *debugger_button = NULL;
|
||||||
MenuButton *script_menu = NULL;
|
MenuButton *script_menu = NULL;
|
||||||
|
|
@ -87,7 +100,7 @@ private:
|
||||||
bool auto_switch_remote_scene_tree = false;
|
bool auto_switch_remote_scene_tree = false;
|
||||||
bool debug_with_external_editor = false;
|
bool debug_with_external_editor = false;
|
||||||
bool hide_on_stop = true;
|
bool hide_on_stop = true;
|
||||||
ScriptEditorDebugger::CameraOverride camera_override = ScriptEditorDebugger::OVERRIDE_NONE;
|
CameraOverride camera_override = OVERRIDE_NONE;
|
||||||
Map<Breakpoint, bool> breakpoints;
|
Map<Breakpoint, bool> breakpoints;
|
||||||
|
|
||||||
ScriptEditorDebugger *_add_debugger();
|
ScriptEditorDebugger *_add_debugger();
|
||||||
|
|
@ -130,10 +143,10 @@ public:
|
||||||
ScriptEditorDebugger *get_default_debugger() const;
|
ScriptEditorDebugger *get_default_debugger() const;
|
||||||
ScriptEditorDebugger *get_debugger(int p_debugger) const;
|
ScriptEditorDebugger *get_debugger(int p_debugger) const;
|
||||||
|
|
||||||
void debug_next() { get_default_debugger()->debug_next(); }
|
void debug_next();
|
||||||
void debug_step() { get_default_debugger()->debug_step(); }
|
void debug_step();
|
||||||
void debug_break() { get_default_debugger()->debug_break(); }
|
void debug_break();
|
||||||
void debug_continue() { get_default_debugger()->debug_continue(); }
|
void debug_continue();
|
||||||
|
|
||||||
void set_script_debug_button(MenuButton *p_button);
|
void set_script_debug_button(MenuButton *p_button);
|
||||||
|
|
||||||
|
|
@ -141,7 +154,7 @@ public:
|
||||||
debugger_button = p_button;
|
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?
|
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; }
|
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);
|
void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos);
|
||||||
|
|
||||||
// Camera
|
// Camera
|
||||||
void set_camera_override(ScriptEditorDebugger::CameraOverride p_override) { camera_override = p_override; }
|
void set_camera_override(CameraOverride p_override) { camera_override = p_override; }
|
||||||
ScriptEditorDebugger::CameraOverride get_camera_override() { return camera_override; }
|
CameraOverride get_camera_override() { return camera_override; }
|
||||||
|
|
||||||
Error start();
|
Error start();
|
||||||
|
|
||||||
|
|
|
||||||
216
editor/debugger/editor_debugger_server.cpp
Normal file
216
editor/debugger/editor_debugger_server.cpp
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
59
editor/debugger/editor_debugger_server.h
Normal file
59
editor/debugger/editor_debugger_server.h
Normal file
|
|
@ -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
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
#include "editor/plugins/spatial_editor_plugin.h"
|
#include "editor/plugins/spatial_editor_plugin.h"
|
||||||
#include "editor/property_editor.h"
|
#include "editor/property_editor.h"
|
||||||
#include "main/performance.h"
|
#include "main/performance.h"
|
||||||
|
#include "scene/3d/camera.h"
|
||||||
#include "scene/debugger/scene_debugger.h"
|
#include "scene/debugger/scene_debugger.h"
|
||||||
#include "scene/gui/dialogs.h"
|
#include "scene/gui/dialogs.h"
|
||||||
#include "scene/gui/label.h"
|
#include "scene/gui/label.h"
|
||||||
|
|
@ -58,12 +59,14 @@
|
||||||
#include "scene/gui/tree.h"
|
#include "scene/gui/tree.h"
|
||||||
#include "scene/resources/packed_scene.h"
|
#include "scene/resources/packed_scene.h"
|
||||||
|
|
||||||
|
using CameraOverride = EditorDebuggerNode::CameraOverride;
|
||||||
|
|
||||||
void ScriptEditorDebugger::_put_msg(String p_message, Array p_data) {
|
void ScriptEditorDebugger::_put_msg(String p_message, Array p_data) {
|
||||||
if (is_session_active()) {
|
if (is_session_active()) {
|
||||||
Array msg;
|
Array msg;
|
||||||
msg.push_back(p_message);
|
msg.push_back(p_message);
|
||||||
msg.push_back(p_data);
|
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 (is_session_active()) {
|
||||||
|
|
||||||
if (camera_override == OVERRIDE_2D) {
|
if (camera_override == CameraOverride::OVERRIDE_2D) {
|
||||||
CanvasItemEditor *editor = CanvasItemEditor::get_singleton();
|
CanvasItemEditor *editor = CanvasItemEditor::get_singleton();
|
||||||
|
|
||||||
Dictionary state = editor->get_state();
|
Dictionary state = editor->get_state();
|
||||||
|
|
@ -791,8 +794,8 @@ void ScriptEditorDebugger::_notification(int p_what) {
|
||||||
msg.push_back(transform);
|
msg.push_back(transform);
|
||||||
_put_msg("override_camera_2D:transform", msg);
|
_put_msg("override_camera_2D:transform", msg);
|
||||||
|
|
||||||
} else if (camera_override >= OVERRIDE_3D_1) {
|
} else if (camera_override >= CameraOverride::OVERRIDE_3D_1) {
|
||||||
int viewport_idx = camera_override - OVERRIDE_3D_1;
|
int viewport_idx = camera_override - CameraOverride::OVERRIDE_3D_1;
|
||||||
SpatialEditorViewport *viewport = SpatialEditor::get_singleton()->get_editor_viewport(viewport_idx);
|
SpatialEditorViewport *viewport = SpatialEditor::get_singleton()->get_editor_viewport(viewport_idx);
|
||||||
Camera *const cam = viewport->get_camera();
|
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;
|
const uint64_t until = OS::get_singleton()->get_ticks_msec() + 20;
|
||||||
|
|
||||||
while (ppeer->get_available_packet_count() > 0) {
|
while (peer->has_message()) {
|
||||||
|
|
||||||
Variant cmd;
|
Array arr = peer->get_message();
|
||||||
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;
|
|
||||||
if (arr.size() != 2 || arr[0].get_type() != Variant::STRING || arr[1].get_type() != Variant::ARRAY) {
|
if (arr.size() != 2 || arr[0].get_type() != Variant::STRING || arr[1].get_type() != Variant::ARRAY) {
|
||||||
_stop_and_notify();
|
_stop_and_notify();
|
||||||
ERR_FAIL_MSG("Invalid message format received from peer");
|
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)
|
if (OS::get_singleton()->get_ticks_msec() > until)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!is_session_active()) {
|
||||||
|
_stop_and_notify();
|
||||||
|
break;
|
||||||
|
};
|
||||||
} break;
|
} break;
|
||||||
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
|
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
|
||||||
|
|
||||||
|
|
@ -875,14 +863,13 @@ void ScriptEditorDebugger::_clear_execution() {
|
||||||
inspector->clear_stack_variables();
|
inspector->clear_stack_variables();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptEditorDebugger::start(Ref<StreamPeerTCP> p_connection) {
|
void ScriptEditorDebugger::start(Ref<EditorDebuggerPeer> p_peer) {
|
||||||
|
|
||||||
error_count = 0;
|
error_count = 0;
|
||||||
warning_count = 0;
|
warning_count = 0;
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
connection = p_connection;
|
peer = p_peer;
|
||||||
ppeer->set_stream_peer(connection);
|
|
||||||
|
|
||||||
perf_history.clear();
|
perf_history.clear();
|
||||||
for (int i = 0; i < Performance::MONITOR_MAX; i++) {
|
for (int i = 0; i < Performance::MONITOR_MAX; i++) {
|
||||||
|
|
@ -893,7 +880,7 @@ void ScriptEditorDebugger::start(Ref<StreamPeerTCP> p_connection) {
|
||||||
set_process(true);
|
set_process(true);
|
||||||
breaked = false;
|
breaked = false;
|
||||||
can_debug = true;
|
can_debug = true;
|
||||||
camera_override = OVERRIDE_NONE;
|
camera_override = CameraOverride::OVERRIDE_NONE;
|
||||||
|
|
||||||
tabs->set_current_tab(0);
|
tabs->set_current_tab(0);
|
||||||
_set_reason_text(TTR("Debug session started."), MESSAGE_SUCCESS);
|
_set_reason_text(TTR("Debug session started."), MESSAGE_SUCCESS);
|
||||||
|
|
@ -936,10 +923,10 @@ void ScriptEditorDebugger::stop() {
|
||||||
_clear_execution();
|
_clear_execution();
|
||||||
|
|
||||||
inspector->clear_cache();
|
inspector->clear_cache();
|
||||||
ppeer->set_stream_peer(Ref<StreamPeer>());
|
|
||||||
|
|
||||||
if (connection.is_valid()) {
|
if (peer.is_valid()) {
|
||||||
connection.unref();
|
peer->close();
|
||||||
|
peer.unref();
|
||||||
reason->set_text("");
|
reason->set_text("");
|
||||||
reason->set_tooltip("");
|
reason->set_tooltip("");
|
||||||
}
|
}
|
||||||
|
|
@ -971,9 +958,6 @@ void ScriptEditorDebugger::_profiler_activate(bool p_enable) {
|
||||||
|
|
||||||
void ScriptEditorDebugger::_visual_profiler_activate(bool p_enable) {
|
void ScriptEditorDebugger::_visual_profiler_activate(bool p_enable) {
|
||||||
|
|
||||||
if (!connection.is_valid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_enable) {
|
if (p_enable) {
|
||||||
profiler_signature.clear();
|
profiler_signature.clear();
|
||||||
_put_msg("start_visual_profiling", Array());
|
_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;
|
return camera_override;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptEditorDebugger::set_camera_override(CameraOverride p_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;
|
Array msg;
|
||||||
msg.push_back(true);
|
msg.push_back(true);
|
||||||
_put_msg("override_camera_2D:set", msg);
|
_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;
|
Array msg;
|
||||||
msg.push_back(false);
|
msg.push_back(false);
|
||||||
_put_msg("override_camera_2D:set", msg);
|
_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;
|
Array msg;
|
||||||
msg.push_back(true);
|
msg.push_back(true);
|
||||||
_put_msg("override_camera_3D:set", msg);
|
_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;
|
Array msg;
|
||||||
msg.push_back(false);
|
msg.push_back(false);
|
||||||
_put_msg("override_camera_3D:set", msg);
|
_put_msg("override_camera_3D:set", msg);
|
||||||
|
|
@ -1423,7 +1407,6 @@ void ScriptEditorDebugger::_clear_errors_list() {
|
||||||
error_tree->clear();
|
error_tree->clear();
|
||||||
error_count = 0;
|
error_count = 0;
|
||||||
warning_count = 0;
|
warning_count = 0;
|
||||||
update_tabs();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right click on specific file(s) or folder(s).
|
// Right click on specific file(s) or folder(s).
|
||||||
|
|
@ -1502,8 +1485,6 @@ void ScriptEditorDebugger::_bind_methods() {
|
||||||
|
|
||||||
ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
|
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;
|
editor = p_editor;
|
||||||
|
|
||||||
tabs = memnew(TabContainer);
|
tabs = memnew(TabContainer);
|
||||||
|
|
@ -1824,7 +1805,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
|
||||||
add_child(msgdialog);
|
add_child(msgdialog);
|
||||||
|
|
||||||
live_debug = true;
|
live_debug = true;
|
||||||
camera_override = OVERRIDE_NONE;
|
camera_override = CameraOverride::OVERRIDE_NONE;
|
||||||
last_path_id = false;
|
last_path_id = false;
|
||||||
error_count = 0;
|
error_count = 0;
|
||||||
warning_count = 0;
|
warning_count = 0;
|
||||||
|
|
@ -1833,6 +1814,9 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
|
||||||
|
|
||||||
ScriptEditorDebugger::~ScriptEditorDebugger() {
|
ScriptEditorDebugger::~ScriptEditorDebugger() {
|
||||||
|
|
||||||
ppeer->set_stream_peer(Ref<StreamPeer>());
|
if (peer.is_valid()) {
|
||||||
|
peer->close();
|
||||||
|
peer.unref();
|
||||||
|
}
|
||||||
memdelete(scene_tree);
|
memdelete(scene_tree);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,14 +31,13 @@
|
||||||
#ifndef SCRIPT_EDITOR_DEBUGGER_H
|
#ifndef SCRIPT_EDITOR_DEBUGGER_H
|
||||||
#define SCRIPT_EDITOR_DEBUGGER_H
|
#define SCRIPT_EDITOR_DEBUGGER_H
|
||||||
|
|
||||||
#include "core/io/packet_peer.h"
|
#include "core/os/os.h"
|
||||||
#include "core/io/stream_peer_tcp.h"
|
|
||||||
#include "editor/debugger/editor_debugger_inspector.h"
|
#include "editor/debugger/editor_debugger_inspector.h"
|
||||||
#include "editor/editor_inspector.h"
|
#include "editor/debugger/editor_debugger_node.h"
|
||||||
#include "editor/property_editor.h"
|
#include "editor/debugger/editor_debugger_server.h"
|
||||||
#include "scene/3d/camera.h"
|
#include "editor/editor_file_dialog.h"
|
||||||
#include "scene/gui/box_container.h"
|
|
||||||
#include "scene/gui/button.h"
|
#include "scene/gui/button.h"
|
||||||
|
#include "scene/gui/margin_container.h"
|
||||||
|
|
||||||
class Tree;
|
class Tree;
|
||||||
class EditorNode;
|
class EditorNode;
|
||||||
|
|
@ -61,16 +60,6 @@ class ScriptEditorDebugger : public MarginContainer {
|
||||||
|
|
||||||
friend class EditorDebuggerNode;
|
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:
|
private:
|
||||||
enum MessageType {
|
enum MessageType {
|
||||||
MESSAGE_ERROR,
|
MESSAGE_ERROR,
|
||||||
|
|
@ -132,8 +121,7 @@ private:
|
||||||
EditorDebuggerInspector *inspector;
|
EditorDebuggerInspector *inspector;
|
||||||
SceneDebuggerTree *scene_tree;
|
SceneDebuggerTree *scene_tree;
|
||||||
|
|
||||||
Ref<StreamPeerTCP> connection;
|
Ref<EditorDebuggerPeer> peer;
|
||||||
Ref<PacketPeerStream> ppeer;
|
|
||||||
|
|
||||||
HashMap<NodePath, int> node_path_cache;
|
HashMap<NodePath, int> node_path_cache;
|
||||||
int last_path_id;
|
int last_path_id;
|
||||||
|
|
@ -151,7 +139,7 @@ private:
|
||||||
|
|
||||||
bool live_debug;
|
bool live_debug;
|
||||||
|
|
||||||
CameraOverride camera_override;
|
EditorDebuggerNode::CameraOverride camera_override;
|
||||||
|
|
||||||
void _performance_draw();
|
void _performance_draw();
|
||||||
void _performance_select();
|
void _performance_select();
|
||||||
|
|
@ -216,7 +204,7 @@ public:
|
||||||
void request_remote_tree();
|
void request_remote_tree();
|
||||||
const SceneDebuggerTree *get_remote_tree();
|
const SceneDebuggerTree *get_remote_tree();
|
||||||
|
|
||||||
void start(Ref<StreamPeerTCP> p_connection);
|
void start(Ref<EditorDebuggerPeer> p_peer);
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
void debug_skip_breakpoints();
|
void debug_skip_breakpoints();
|
||||||
|
|
@ -228,7 +216,7 @@ public:
|
||||||
void debug_continue();
|
void debug_continue();
|
||||||
bool is_breaked() const { return breaked; }
|
bool is_breaked() const { return breaked; }
|
||||||
bool is_debuggable() const { return can_debug; }
|
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_remote_pid() const { return remote_pid; }
|
||||||
|
|
||||||
int get_error_count() const { return error_count; }
|
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_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);
|
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;
|
EditorDebuggerNode::CameraOverride get_camera_override() const;
|
||||||
void set_camera_override(CameraOverride p_override);
|
void set_camera_override(EditorDebuggerNode::CameraOverride p_override);
|
||||||
|
|
||||||
void set_breakpoint(const String &p_path, int p_line, bool p_enabled);
|
void set_breakpoint(const String &p_path, int p_line, bool p_enabled);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3992,7 +3992,7 @@ void CanvasItemEditor::_notification(int p_what) {
|
||||||
if (!is_visible() && override_camera_button->is_pressed()) {
|
if (!is_visible() && override_camera_button->is_pressed()) {
|
||||||
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
|
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);
|
override_camera_button->set_pressed(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4348,9 +4348,9 @@ void CanvasItemEditor::_button_override_camera(bool p_pressed) {
|
||||||
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
|
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
|
||||||
|
|
||||||
if (p_pressed) {
|
if (p_pressed) {
|
||||||
debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_2D);
|
debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_2D);
|
||||||
} else {
|
} else {
|
||||||
debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
|
debugger->set_camera_override(EditorDebuggerNode::OVERRIDE_NONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
#include "core/project_settings.h"
|
#include "core/project_settings.h"
|
||||||
#include "editor/debugger/editor_debugger_node.h"
|
#include "editor/debugger/editor_debugger_node.h"
|
||||||
#include "editor/debugger/script_editor_debugger.h"
|
|
||||||
#include "editor/editor_node.h"
|
#include "editor/editor_node.h"
|
||||||
#include "editor/editor_run_script.h"
|
#include "editor/editor_run_script.h"
|
||||||
#include "editor/editor_scale.h"
|
#include "editor/editor_scale.h"
|
||||||
|
|
|
||||||
|
|
@ -4487,12 +4487,12 @@ void SpatialEditor::_menu_item_toggled(bool pressed, int p_option) {
|
||||||
case MENU_TOOL_OVERRIDE_CAMERA: {
|
case MENU_TOOL_OVERRIDE_CAMERA: {
|
||||||
EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
|
EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
|
||||||
|
|
||||||
|
using Override = EditorDebuggerNode::CameraOverride;
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
using Override = ScriptEditorDebugger::CameraOverride;
|
|
||||||
|
|
||||||
debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
|
debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
|
||||||
} else {
|
} else {
|
||||||
debugger->set_camera_override(ScriptEditorDebugger::OVERRIDE_NONE);
|
debugger->set_camera_override(Override::OVERRIDE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
@ -4545,8 +4545,8 @@ void SpatialEditor::_update_camera_override_viewport(Object *p_viewport) {
|
||||||
EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
|
EditorDebuggerNode *const debugger = EditorDebuggerNode::get_singleton();
|
||||||
|
|
||||||
camera_override_viewport_id = current_viewport->index;
|
camera_override_viewport_id = current_viewport->index;
|
||||||
if (debugger->get_camera_override() >= ScriptEditorDebugger::OVERRIDE_3D_1) {
|
if (debugger->get_camera_override() >= EditorDebuggerNode::OVERRIDE_3D_1) {
|
||||||
using Override = ScriptEditorDebugger::CameraOverride;
|
using Override = EditorDebuggerNode::CameraOverride;
|
||||||
|
|
||||||
debugger->set_camera_override((Override)(Override::OVERRIDE_3D_1 + camera_override_viewport_id));
|
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()) {
|
if (!is_visible() && tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->is_pressed()) {
|
||||||
EditorDebuggerNode *debugger = EditorDebuggerNode::get_singleton();
|
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);
|
tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_pressed(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
#include "core/reference.h"
|
#include "core/reference.h"
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
#include "editor/debugger/script_editor_debugger.h"
|
#include "editor/debugger/editor_debugger_node.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../csharp_script.h"
|
#include "../csharp_script.h"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue