aboutsummaryrefslogtreecommitdiff
path: root/scene/main/node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/main/node.cpp')
-rw-r--r--scene/main/node.cpp67
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() {