diff options
Diffstat (limited to 'scene/main/node.cpp')
| -rw-r--r-- | scene/main/node.cpp | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 9b592a77d..d4f043c53 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -33,6 +33,7 @@ #include "scene/scene_string_names.h" #include "scene/resources/packed_scene.h" #include "io/resource_loader.h" +#include "viewport.h" VARIANT_ENUM_CAST(Node::PauseMode); @@ -76,12 +77,25 @@ void Node::_notification(int p_notification) { data.pause_owner=this; } + if (data.input) + add_to_group("_vp_input"+itos(get_viewport()->get_instance_ID())); + if (data.unhandled_input) + add_to_group("_vp_unhandled_input"+itos(get_viewport()->get_instance_ID())); + if (data.unhandled_key_input) + add_to_group("_vp_unhandled_key_input"+itos(get_viewport()->get_instance_ID())); + get_scene()->node_count++; } break; case NOTIFICATION_EXIT_SCENE: { get_scene()->node_count--; + if (data.input) + remove_from_group("_vp_input"+itos(get_viewport()->get_instance_ID())); + if (data.unhandled_input) + remove_from_group("_vp_unhandled_input"+itos(get_viewport()->get_instance_ID())); + if (data.unhandled_key_input) + remove_from_group("_vp_unhandled_key_input"+itos(get_viewport()->get_instance_ID())); } break; case NOTIFICATION_READY: { @@ -148,6 +162,9 @@ void Node::_propagate_enter_scene() { data.depth=1; } + data.viewport = cast_to<Viewport>(); + if (!data.viewport) + data.viewport = data.parent->data.viewport; data.inside_scene=true; @@ -158,6 +175,7 @@ void Node::_propagate_enter_scene() { data.scene->add_to_group(*K,this); } + notification(NOTIFICATION_ENTER_SCENE); if (get_script_instance()) { @@ -216,6 +234,8 @@ void Node::_propagate_exit_scene() { data.scene->remove_from_group(*K,this); } + data.viewport = NULL; + if (data.scene) data.scene->tree_changed(); @@ -324,7 +344,7 @@ void Node::set_pause_mode(PauseMode p_mode) { if (data.pause_mode==PAUSE_MODE_INHERIT) { if (data.parent) - data.parent->data.pause_owner; + owner=data.parent->data.pause_owner; } else { owner=this; } @@ -421,11 +441,17 @@ void Node::set_process_input(bool p_enable) { if (p_enable==data.input) return; + data.input=p_enable; + if (!is_inside_scene()) + return; + if (p_enable) - add_to_group("input"); + add_to_group("_vp_input"+itos(get_viewport()->get_instance_ID())); else - remove_from_group("input"); + remove_from_group("_vp_input"+itos(get_viewport()->get_instance_ID())); + + } bool Node::is_processing_input() const { @@ -437,18 +463,41 @@ void Node::set_process_unhandled_input(bool p_enable) { if (p_enable==data.unhandled_input) return; data.unhandled_input=p_enable; + if (!is_inside_scene()) + return; if (p_enable) - add_to_group("unhandled_input"); + add_to_group("_vp_unhandled_input"+itos(get_viewport()->get_instance_ID())); else - remove_from_group("unhandled_input"); + remove_from_group("_vp_unhandled_input"+itos(get_viewport()->get_instance_ID())); } + bool Node::is_processing_unhandled_input() const { return data.unhandled_input; } +void Node::set_process_unhandled_key_input(bool p_enable) { + + if (p_enable==data.unhandled_key_input) + return; + data.unhandled_key_input=p_enable; + if (!is_inside_scene()) + return; + + if (p_enable) + add_to_group("_vp_unhandled_key_input"+itos(get_viewport()->get_instance_ID())); + else + remove_from_group("_vp_unhandled_key_input"+itos(get_viewport()->get_instance_ID())); +} + + +bool Node::is_processing_unhandled_key_input() const { + return data.unhandled_key_input; +} + + StringName Node::get_name() const { return data.name; @@ -1682,6 +1731,8 @@ void Node::_bind_methods() { ObjectTypeDB::bind_method(_MD("is_processing_input"),&Node::is_processing_input); ObjectTypeDB::bind_method(_MD("set_process_unhandled_input","enable"),&Node::set_process_unhandled_input); ObjectTypeDB::bind_method(_MD("is_processing_unhandled_input"),&Node::is_processing_unhandled_input); + ObjectTypeDB::bind_method(_MD("set_process_unhandled_key_input","enable"),&Node::set_process_unhandled_key_input); + ObjectTypeDB::bind_method(_MD("is_processing_unhandled_key_input"),&Node::is_processing_unhandled_key_input); ObjectTypeDB::bind_method(_MD("set_pause_mode","mode"),&Node::set_pause_mode); ObjectTypeDB::bind_method(_MD("get_pause_mode"),&Node::get_pause_mode); ObjectTypeDB::bind_method(_MD("can_process"),&Node::can_process); @@ -1693,6 +1744,8 @@ void Node::_bind_methods() { ObjectTypeDB::bind_method(_MD("duplicate:Node"),&Node::duplicate); ObjectTypeDB::bind_method(_MD("replace_by","node:Node","keep_data"),&Node::replace_by,DEFVAL(false)); + ObjectTypeDB::bind_method(_MD("get_viewport"),&Node::get_viewport); + ObjectTypeDB::bind_method(_MD("queue_free"),&Node::queue_delete); BIND_CONSTANT( NOTIFICATION_ENTER_SCENE ); @@ -1748,13 +1801,15 @@ Node::Node() { data.inside_scene=false; data.owner=NULL; - data.OW=false; + data.OW=NULL; data.input=false; data.unhandled_input=false; + data.unhandled_key_input=false; data.pause_mode=PAUSE_MODE_INHERIT; data.pause_owner=NULL; data.parent_owned=false; data.in_constructor=true; + data.viewport=NULL; } Node::~Node() { |
