diff options
author | Yuri Sizov <yuris@humnom.net> | 2023-07-26 18:40:14 +0200 |
---|---|---|
committer | Yuri Sizov <yuris@humnom.net> | 2023-07-26 18:40:14 +0200 |
commit | 1de9171c324741b1e50f2da2b3ffaeabae8ba36a (patch) | |
tree | 81bd15f918bbc1d369b8a05a77df1db02bb2a69e | |
parent | e25a3681335d4bc1534d0b6d90910d7f4a132675 (diff) | |
parent | b408b05d7d26ec47638b6c6353ebfc4dc164c3e2 (diff) | |
download | redot-engine-1de9171c324741b1e50f2da2b3ffaeabae8ba36a.tar.gz |
Merge pull request #79443 from Sauermann/fix-ingore-hovering
Fix physics passive hovering with `MOUSE_FILTER_IGNORE`
-rw-r--r-- | scene/main/viewport.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 1cde463df4..9f05d62d9c 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -688,17 +688,26 @@ void Viewport::_process_picking() { PhysicsDirectSpaceState2D *ss2d = PhysicsServer2D::get_singleton()->space_get_direct_state(find_world_2d()->get_space()); - bool has_mouse_event = false; - for (const Ref<InputEvent> &e : physics_picking_events) { - Ref<InputEventMouse> m = e; - if (m.is_valid()) { - has_mouse_event = true; - break; + SubViewportContainer *parent_svc = Object::cast_to<SubViewportContainer>(get_parent()); + bool parent_ignore_mouse = (parent_svc && parent_svc->get_mouse_filter() == Control::MOUSE_FILTER_IGNORE); + bool create_passive_hover_event = true; + if (gui.mouse_over || parent_ignore_mouse) { + // When the mouse is over a Control node, passive hovering would cause input events for Colliders, that are behind Control nodes. + // When parent SubViewportContainer ignores mouse, that setting should be respected. + create_passive_hover_event = false; + } else { + for (const Ref<InputEvent> &e : physics_picking_events) { + Ref<InputEventMouse> m = e; + if (m.is_valid()) { + // A mouse event exists, so passive hovering isn't necessary. + create_passive_hover_event = false; + break; + } } } - if (!has_mouse_event) { - // If no mouse event exists, create a motion one. This is necessary because objects or camera may have moved. + if (create_passive_hover_event) { + // Create a mouse motion event. This is necessary because objects or camera may have moved. // While this extra event is sent, it is checked if both camera and last object and last ID did not move. // If nothing changed, the event is discarded to avoid flooding with unnecessary motion events every frame. Ref<InputEventMouseMotion> mm; |