Explorar o código

Merge pull request #15712 from Faless/viewport_input

ViewportContainer passes input down to children viewports
Rémi Verschelde %!s(int64=7) %!d(string=hai) anos
pai
achega
b68a972971
Modificáronse 2 ficheiros con 29 adicións e 0 borrados
  1. 28 0
      scene/gui/viewport_container.cpp
  2. 1 0
      scene/gui/viewport_container.h

+ 28 - 0
scene/gui/viewport_container.cpp

@@ -30,6 +30,7 @@
 
 #include "viewport_container.h"
 
+#include "core/engine.h"
 #include "scene/main/viewport.h"
 
 Size2 ViewportContainer::get_minimum_size() const {
@@ -139,8 +140,34 @@ void ViewportContainer::_notification(int p_what) {
 	}
 }
 
+void ViewportContainer::_input(const Ref<InputEvent> &p_event) {
+
+	if (Engine::get_singleton()->is_editor_hint())
+		return;
+
+	Transform2D xform = get_global_transform();
+
+	if (stretch) {
+		Transform2D scale_xf;
+		scale_xf.scale(Vector2(shrink, shrink));
+		xform *= scale_xf;
+	}
+
+	Ref<InputEvent> ev = p_event->xformed_by(xform.affine_inverse());
+
+	for (int i = 0; i < get_child_count(); i++) {
+
+		Viewport *c = Object::cast_to<Viewport>(get_child(i));
+		if (!c || c->is_input_disabled())
+			continue;
+
+		c->input(ev);
+	}
+}
+
 void ViewportContainer::_bind_methods() {
 
+	ClassDB::bind_method(D_METHOD("_input", "event"), &ViewportContainer::_input);
 	ClassDB::bind_method(D_METHOD("set_stretch", "enable"), &ViewportContainer::set_stretch);
 	ClassDB::bind_method(D_METHOD("is_stretch_enabled"), &ViewportContainer::is_stretch_enabled);
 
@@ -155,4 +182,5 @@ ViewportContainer::ViewportContainer() {
 
 	stretch = false;
 	shrink = 1;
+	set_process_input(true);
 }

+ 1 - 0
scene/gui/viewport_container.h

@@ -48,6 +48,7 @@ public:
 	void set_stretch(bool p_enable);
 	bool is_stretch_enabled() const;
 
+	void _input(const Ref<InputEvent> &p_event);
 	void set_stretch_shrink(int p_shrink);
 	int get_stretch_shrink() const;