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:
- [method Node._input]
- [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 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>
</method>
<method name="push_text_input">

View file

@ -262,7 +262,7 @@ void EditorCommandPalette::register_shortcuts_as_command() {
ev.instantiate();
ev->set_shortcut(shortcut);
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();
@ -283,7 +283,7 @@ Ref<Shortcut> EditorCommandPalette::add_shortcut_command(const String &p_command
ev.instantiate();
ev->set_shortcut(p_shortcut);
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 {
const String key_name = String(p_key);
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;
}
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) {
if (Object::cast_to<SubViewport>(p_child)) {
queue_redraw();
@ -290,5 +263,4 @@ void SubViewportContainer::_bind_methods() {
SubViewportContainer::SubViewportContainer() {
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 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);
int get_stretch_shrink() const;
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);
}
if (!is_input_handled()) {
push_unhandled_input(ev, true);
}
event_count++;
}

View file

@ -1384,10 +1384,6 @@ void Window::_window_input(const Ref<InputEvent> &p_ev) {
if (is_inside_tree()) {
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) {