Merge pull request #57894 from Sauermann/fix-subviewport-1

Fix unrestricted mouse-event propagation to SubViewports for Physics-Picking
This commit is contained in:
Rémi Verschelde 2023-05-09 10:43:49 +02:00
commit 72323a57d0
No known key found for this signature in database
GPG Key ID: C3336907360768E1
6 changed files with 10 additions and 35 deletions

View File

@ -159,7 +159,11 @@
Calling this method will propagate calls to child nodes for following methods in the given order: Calling this method will propagate calls to child nodes for following methods in the given order:
- [method Node._input] - [method Node._input]
- [method Control._gui_input] for [Control] nodes - [method Control._gui_input] for [Control] nodes
- [method Node._shortcut_input]
- [method Node._unhandled_input]
- [method Node._unhandled_key_input]
If an earlier method marks the input as handled via [method set_input_as_handled], any later method in this list will not be called. If an earlier method marks the input as handled via [method set_input_as_handled], any later method in this list will not be called.
If none of the methods handle the event and [member physics_object_picking] is [code]true[/code], the event is used for physics object picking.
</description> </description>
</method> </method>
<method name="push_text_input"> <method name="push_text_input">

View File

@ -262,7 +262,7 @@ void EditorCommandPalette::register_shortcuts_as_command() {
ev.instantiate(); ev.instantiate();
ev->set_shortcut(shortcut); ev->set_shortcut(shortcut);
String shortcut_text = String(shortcut->get_as_text()); String shortcut_text = String(shortcut->get_as_text());
add_command(command_name, E.key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_unhandled_input), varray(ev, false), shortcut_text); add_command(command_name, E.key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_input), varray(ev, false), shortcut_text);
} }
unregistered_shortcuts.clear(); unregistered_shortcuts.clear();
@ -283,7 +283,7 @@ Ref<Shortcut> EditorCommandPalette::add_shortcut_command(const String &p_command
ev.instantiate(); ev.instantiate();
ev->set_shortcut(p_shortcut); ev->set_shortcut(p_shortcut);
String shortcut_text = String(p_shortcut->get_as_text()); String shortcut_text = String(p_shortcut->get_as_text());
add_command(p_command, p_key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_unhandled_input), varray(ev, false), shortcut_text); add_command(p_command, p_key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_input), varray(ev, false), shortcut_text);
} else { } else {
const String key_name = String(p_key); const String key_name = String(p_key);
const String command_name = String(p_command); const String command_name = String(p_command);

View File

@ -221,33 +221,6 @@ bool SubViewportContainer::_is_propagated_in_gui_input(const Ref<InputEvent> &p_
return false; return false;
} }
void SubViewportContainer::unhandled_input(const Ref<InputEvent> &p_event) {
ERR_FAIL_COND(p_event.is_null());
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
Transform2D xform = get_global_transform_with_canvas();
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++) {
SubViewport *c = Object::cast_to<SubViewport>(get_child(i));
if (!c || c->is_input_disabled()) {
continue;
}
c->push_unhandled_input(ev);
}
}
void SubViewportContainer::add_child_notify(Node *p_child) { void SubViewportContainer::add_child_notify(Node *p_child) {
if (Object::cast_to<SubViewport>(p_child)) { if (Object::cast_to<SubViewport>(p_child)) {
queue_redraw(); queue_redraw();
@ -290,5 +263,4 @@ void SubViewportContainer::_bind_methods() {
SubViewportContainer::SubViewportContainer() { SubViewportContainer::SubViewportContainer() {
set_process_input(true); set_process_input(true);
set_process_unhandled_input(true);
} }

View File

@ -55,7 +55,6 @@ public:
virtual void input(const Ref<InputEvent> &p_event) override; virtual void input(const Ref<InputEvent> &p_event) override;
virtual void gui_input(const Ref<InputEvent> &p_event) override; virtual void gui_input(const Ref<InputEvent> &p_event) override;
virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
void set_stretch_shrink(int p_shrink); void set_stretch_shrink(int p_shrink);
int get_stretch_shrink() const; int get_stretch_shrink() const;
void recalc_force_viewport_sizes(); void recalc_force_viewport_sizes();

View File

@ -2907,6 +2907,10 @@ void Viewport::push_input(const Ref<InputEvent> &p_event, bool p_local_coords) {
_gui_cleanup_internal_state(ev); _gui_cleanup_internal_state(ev);
} }
if (!is_input_handled()) {
push_unhandled_input(ev, true);
}
event_count++; event_count++;
} }

View File

@ -1384,10 +1384,6 @@ void Window::_window_input(const Ref<InputEvent> &p_ev) {
if (is_inside_tree()) { if (is_inside_tree()) {
push_input(p_ev); push_input(p_ev);
} }
if (!is_input_handled() && is_inside_tree()) {
push_unhandled_input(p_ev);
}
} }
void Window::_window_input_text(const String &p_text) { void Window::_window_input_text(const String &p_text) {