diff options
Diffstat (limited to 'scene/debugger/scene_debugger.cpp')
| -rw-r--r-- | scene/debugger/scene_debugger.cpp | 329 |
1 files changed, 193 insertions, 136 deletions
diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index 22ff0611a7..f57c8e58db 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/scene/debugger/scene_debugger.cpp @@ -30,36 +30,45 @@ #include "scene_debugger.h" +#include "core/debugger/engine_debugger.h" #include "core/io/marshalls.h" -#include "core/script_debugger_remote.h" +#include "core/script_language.h" #include "scene/main/scene_tree.h" -#include "scene/main/viewport.h" +#include "scene/main/window.h" #include "scene/resources/packed_scene.h" void SceneDebugger::initialize() { #ifdef DEBUG_ENABLED LiveEditor::singleton = memnew(LiveEditor); - ScriptDebuggerRemote::scene_tree_parse_func = SceneDebugger::parse_message; + EngineDebugger::register_message_capture("scene", EngineDebugger::Capture(nullptr, SceneDebugger::parse_message)); #endif } void SceneDebugger::deinitialize() { #ifdef DEBUG_ENABLED if (LiveEditor::singleton) { + // Should be removed automatically when deiniting debugger, but just in case + if (EngineDebugger::has_capture("scene")) { + EngineDebugger::unregister_message_capture("scene"); + } memdelete(LiveEditor::singleton); - LiveEditor::singleton = NULL; + LiveEditor::singleton = nullptr; } #endif } #ifdef DEBUG_ENABLED -Error SceneDebugger::parse_message(const String &p_msg, const Array &p_args) { +Error SceneDebugger::parse_message(void *p_user, const String &p_msg, const Array &p_args, bool &r_captured) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return ERR_UNCONFIGURED; + } LiveEditor *live_editor = LiveEditor::get_singleton(); - if (!live_editor) + if (!live_editor) { return ERR_UNCONFIGURED; + } + + r_captured = true; if (p_msg == "request_scene_tree") { // Scene tree live_editor->_send_tree(); @@ -171,7 +180,7 @@ Error SceneDebugger::parse_message(const String &p_msg, const Array &p_args) { ERR_FAIL_COND_V(p_args.size() < 4, ERR_INVALID_DATA); live_editor->_reparent_node_func(p_args[0], p_args[1], p_args[2], p_args[3]); } else { - return ERR_SKIP; + r_captured = false; } return OK; } @@ -180,7 +189,6 @@ void SceneDebugger::_save_node(ObjectID id, const String &p_path) { Node *node = Object::cast_to<Node>(ObjectDB::get_instance(id)); ERR_FAIL_COND(!node); - WARN_PRINT("SAVING " + itos(id) + " TO " + p_path); Ref<PackedScene> ps = memnew(PackedScene); ps->pack(node); ResourceSaver::save(p_path, ps); @@ -188,19 +196,20 @@ void SceneDebugger::_save_node(ObjectID id, const String &p_path) { void SceneDebugger::_send_object_id(ObjectID p_id, int p_max_size) { SceneDebuggerObject obj(p_id); - if (obj.id.is_null()) + if (obj.id.is_null()) { return; + } Array arr; obj.serialize(arr); - ScriptDebugger::get_singleton()->send_message("inspect_object", arr); + EngineDebugger::get_singleton()->send_message("scene:inspect_object", arr); } void SceneDebugger::_set_object_property(ObjectID p_id, const String &p_property, const Variant &p_value) { - Object *obj = ObjectDB::get_instance(p_id); - if (!obj) + if (!obj) { return; + } String prop_name = p_property; if (p_property.begins_with("Members/")) { @@ -213,20 +222,23 @@ void SceneDebugger::_set_object_property(ObjectID p_id, const String &p_property void SceneDebugger::add_to_cache(const String &p_filename, Node *p_node) { LiveEditor *debugger = LiveEditor::get_singleton(); - if (!debugger) + if (!debugger) { return; + } - if (ScriptDebugger::get_singleton() && p_filename != String()) { + if (EngineDebugger::get_script_debugger() && p_filename != String()) { debugger->live_scene_edit_cache[p_filename].insert(p_node); } } + void SceneDebugger::remove_from_cache(const String &p_filename, Node *p_node) { LiveEditor *debugger = LiveEditor::get_singleton(); - if (!debugger) + if (!debugger) { return; + } - Map<String, Set<Node *> > &edit_cache = debugger->live_scene_edit_cache; - Map<String, Set<Node *> >::Element *E = edit_cache.find(p_filename); + Map<String, Set<Node *>> &edit_cache = debugger->live_scene_edit_cache; + Map<String, Set<Node *>>::Element *E = edit_cache.find(p_filename); if (E) { E->get().erase(p_node); if (E->get().size() == 0) { @@ -234,11 +246,10 @@ void SceneDebugger::remove_from_cache(const String &p_filename, Node *p_node) { } } - Map<Node *, Map<ObjectID, Node *> > &remove_list = debugger->live_edit_remove_list; - Map<Node *, Map<ObjectID, Node *> >::Element *F = remove_list.find(p_node); + Map<Node *, Map<ObjectID, Node *>> &remove_list = debugger->live_edit_remove_list; + Map<Node *, Map<ObjectID, Node *>>::Element *F = remove_list.find(p_node); if (F) { for (Map<ObjectID, Node *>::Element *G = F->get().front(); G; G = G->next()) { - memdelete(G->get()); } remove_list.erase(F); @@ -249,8 +260,9 @@ void SceneDebugger::remove_from_cache(const String &p_filename, Node *p_node) { SceneDebuggerObject::SceneDebuggerObject(ObjectID p_id) { id = ObjectID(); Object *obj = ObjectDB::get_instance(p_id); - if (!obj) + if (!obj) { return; + } id = p_id; class_name = obj->get_class(); @@ -274,7 +286,7 @@ SceneDebuggerObject::SceneDebuggerObject(ObjectID p_id) { } } else if (Script *s = Object::cast_to<Script>(obj)) { // Add script constants (no instance). - _parse_script_properties(s, NULL); + _parse_script_properties(s, nullptr); } // Add base object properties. @@ -288,8 +300,8 @@ SceneDebuggerObject::SceneDebuggerObject(ObjectID p_id) { } void SceneDebuggerObject::_parse_script_properties(Script *p_script, ScriptInstance *p_instance) { - typedef Map<const Script *, Set<StringName> > ScriptMemberMap; - typedef Map<const Script *, Map<StringName, Variant> > ScriptConstantsMap; + typedef Map<const Script *, Set<StringName>> ScriptMemberMap; + typedef Map<const Script *, Map<StringName, Variant>> ScriptConstantsMap; ScriptMemberMap members; if (p_instance) { @@ -349,15 +361,6 @@ void SceneDebuggerObject::serialize(Array &r_arr, int p_max_size) { RES res = var; - if (var.get_type() == Variant::OBJECT && var.is_ref()) { - REF r = var; - if (r.is_valid()) { - res = *r; - } else { - res = RES(); - } - } - Array prop; prop.push_back(pi.name); prop.push_back(pi.type); @@ -368,7 +371,7 @@ void SceneDebuggerObject::serialize(Array &r_arr, int p_max_size) { var = res->get_path(); } else { //only send information that can be sent.. int len = 0; //test how big is this to encode - encode_variant(var, NULL, len); + encode_variant(var, nullptr, len); if (len > p_max_size) { //limit to max size hint = PROPERTY_HINT_OBJECT_TOO_BIG; hint_string = ""; @@ -398,7 +401,6 @@ void SceneDebuggerObject::deserialize(const Array &p_arr) { Array props = p_arr[2]; for (int i = 0; i < props.size(); i++) { - CHECK_TYPE(props[i], ARRAY); Array prop = props[i]; @@ -473,60 +475,63 @@ void SceneDebuggerTree::deserialize(const Array &p_arr) { } /// LiveEditor -LiveEditor *LiveEditor::singleton = NULL; +LiveEditor *LiveEditor::singleton = nullptr; LiveEditor *LiveEditor::get_singleton() { return singleton; } void LiveEditor::_send_tree() { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Array arr; // Encoded as a flat list depth fist. SceneDebuggerTree tree(scene_tree->root); tree.serialize(arr); - ScriptDebugger::get_singleton()->send_message("scene_tree", arr); + EngineDebugger::get_singleton()->send_message("scene:scene_tree", arr); } void LiveEditor::_node_path_func(const NodePath &p_path, int p_id) { - live_edit_node_path_cache[p_id] = p_path; } void LiveEditor::_res_path_func(const String &p_path, int p_id) { - live_edit_resource_cache[p_id] = p_path; } void LiveEditor::_node_set_func(int p_id, const StringName &p_prop, const Variant &p_value) { - SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - if (!live_edit_node_path_cache.has(p_id)) + if (!live_edit_node_path_cache.has(p_id)) { return; + } NodePath np = live_edit_node_path_cache[p_id]; - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(np)) + if (!n->has_node(np)) { continue; + } Node *n2 = n->get_node(np); n2->set(p_prop, p_value); @@ -534,110 +539,126 @@ void LiveEditor::_node_set_func(int p_id, const StringName &p_prop, const Varian } void LiveEditor::_node_set_res_func(int p_id, const StringName &p_prop, const String &p_value) { - RES r = ResourceLoader::load(p_value); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } _node_set_func(p_id, p_prop, r); } + void LiveEditor::_node_call_func(int p_id, const StringName &p_method, VARIANT_ARG_DECLARE) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; - if (!live_edit_node_path_cache.has(p_id)) + } + if (!live_edit_node_path_cache.has(p_id)) { return; + } NodePath np = live_edit_node_path_cache[p_id]; - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(np)) + if (!n->has_node(np)) { continue; + } Node *n2 = n->get_node(np); n2->call(p_method, VARIANT_ARG_PASS); } } -void LiveEditor::_res_set_func(int p_id, const StringName &p_prop, const Variant &p_value) { - if (!live_edit_resource_cache.has(p_id)) +void LiveEditor::_res_set_func(int p_id, const StringName &p_prop, const Variant &p_value) { + if (!live_edit_resource_cache.has(p_id)) { return; + } String resp = live_edit_resource_cache[p_id]; - if (!ResourceCache::has(resp)) + if (!ResourceCache::has(resp)) { return; + } RES r = ResourceCache::get(resp); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } r->set(p_prop, p_value); } -void LiveEditor::_res_set_res_func(int p_id, const StringName &p_prop, const String &p_value) { +void LiveEditor::_res_set_res_func(int p_id, const StringName &p_prop, const String &p_value) { RES r = ResourceLoader::load(p_value); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } _res_set_func(p_id, p_prop, r); } -void LiveEditor::_res_call_func(int p_id, const StringName &p_method, VARIANT_ARG_DECLARE) { - if (!live_edit_resource_cache.has(p_id)) +void LiveEditor::_res_call_func(int p_id, const StringName &p_method, VARIANT_ARG_DECLARE) { + if (!live_edit_resource_cache.has(p_id)) { return; + } String resp = live_edit_resource_cache[p_id]; - if (!ResourceCache::has(resp)) + if (!ResourceCache::has(resp)) { return; + } RES r = ResourceCache::get(resp); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } r->call(p_method, VARIANT_ARG_PASS); } void LiveEditor::_root_func(const NodePath &p_scene_path, const String &p_scene_from) { - live_edit_root = p_scene_path; live_edit_scene = p_scene_from; } void LiveEditor::_create_node_func(const NodePath &p_parent, const String &p_type, const String &p_name) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_parent)) + if (!n->has_node(p_parent)) { continue; + } Node *n2 = n->get_node(p_parent); Node *no = Object::cast_to<Node>(ClassDB::instance(p_type)); @@ -649,33 +670,39 @@ void LiveEditor::_create_node_func(const NodePath &p_parent, const String &p_typ n2->add_child(no); } } + void LiveEditor::_instance_node_func(const NodePath &p_parent, const String &p_path, const String &p_name) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Ref<PackedScene> ps = ResourceLoader::load(p_path); - if (!ps.is_valid()) + if (!ps.is_valid()) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_parent)) + if (!n->has_node(p_parent)) { continue; + } Node *n2 = n->get_node(p_parent); Node *no = ps->instance(); @@ -687,30 +714,35 @@ void LiveEditor::_instance_node_func(const NodePath &p_parent, const String &p_p n2->add_child(no); } } + void LiveEditor::_remove_node_func(const NodePath &p_at) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F;) { - Set<Node *>::Element *N = F->next(); Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); memdelete(n2); @@ -718,30 +750,35 @@ void LiveEditor::_remove_node_func(const NodePath &p_at) { F = N; } } + void LiveEditor::_remove_and_keep_node_func(const NodePath &p_at, ObjectID p_keep_id) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F;) { - Set<Node *>::Element *N = F->next(); Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); @@ -752,41 +789,48 @@ void LiveEditor::_remove_and_keep_node_func(const NodePath &p_at, ObjectID p_kee F = N; } } + void LiveEditor::_restore_node_func(ObjectID p_id, const NodePath &p_at, int p_at_pos) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F;) { - Set<Node *>::Element *N = F->next(); Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); - Map<Node *, Map<ObjectID, Node *> >::Element *EN = live_edit_remove_list.find(n); + Map<Node *, Map<ObjectID, Node *>>::Element *EN = live_edit_remove_list.find(n); - if (!EN) + if (!EN) { continue; + } Map<ObjectID, Node *>::Element *FN = EN->get().find(p_id); - if (!FN) + if (!FN) { continue; + } n2->add_child(FN->get()); EN->get().erase(FN); @@ -798,73 +842,86 @@ void LiveEditor::_restore_node_func(ObjectID p_id, const NodePath &p_at, int p_a F = N; } } + void LiveEditor::_duplicate_node_func(const NodePath &p_at, const String &p_new_name) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); Node *dup = n2->duplicate(Node::DUPLICATE_SIGNALS | Node::DUPLICATE_GROUPS | Node::DUPLICATE_SCRIPTS); - if (!dup) + if (!dup) { continue; + } dup->set_name(p_new_name); n2->get_parent()->add_child(dup); } } + void LiveEditor::_reparent_node_func(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - Node *base = NULL; - if (scene_tree->root->has_node(live_edit_root)) + Node *base = nullptr; + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } - Map<String, Set<Node *> >::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *nfrom = n->get_node(p_at); - if (!n->has_node(p_new_place)) + if (!n->has_node(p_new_place)) { continue; + } Node *nto = n->get_node(p_new_place); nfrom->get_parent()->remove_child(nfrom); nfrom->set_name(p_new_name); nto->add_child(nfrom); - if (p_at_pos >= 0) + if (p_at_pos >= 0) { nto->move_child(nfrom, p_at_pos); + } } } |