Merge pull request #77923 from Sauermann/fix-mouse-position-with-screen-transform

Fix mouse position with screen transform
This commit is contained in:
Rémi Verschelde 2023-06-09 12:15:56 +02:00
commit 0cee1e0d4f
No known key found for this signature in database
GPG Key ID: C3336907360768E1
4 changed files with 21 additions and 1 deletions

View File

@ -1368,7 +1368,11 @@ Ref<InputEvent> Viewport::_make_input_local(const Ref<InputEvent> &ev) {
Vector2 Viewport::get_mouse_position() const {
ERR_READ_THREAD_GUARD_V(Vector2());
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_MOUSE)) {
if (!is_directly_attached_to_screen()) {
// Rely on the most recent mouse coordinate from an InputEventMouse in push_input.
// In this case get_screen_transform is not applicable, because it is ambiguous.
return gui.last_mouse_pos;
} else if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_MOUSE)) {
return get_screen_transform_internal(true).affine_inverse().xform(DisplayServer::get_singleton()->mouse_get_position());
} else {
// Fallback to Input for getting mouse position in case of emulated mouse.
@ -4605,6 +4609,11 @@ Transform2D SubViewport::get_popup_base_transform() const {
return c->get_screen_transform() * container_transform * get_final_transform();
}
bool SubViewport::is_directly_attached_to_screen() const {
// SubViewports, that are used as Textures are not considered to be directly attached to screen.
return Object::cast_to<SubViewportContainer>(get_parent()) && get_parent()->get_viewport() && get_parent()->get_viewport()->is_directly_attached_to_screen();
}
void SubViewport::_notification(int p_what) {
ERR_MAIN_THREAD_GUARD;
switch (p_what) {

View File

@ -670,6 +670,7 @@ public:
Transform2D get_screen_transform() const;
virtual Transform2D get_screen_transform_internal(bool p_absolute_position = false) const;
virtual Transform2D get_popup_base_transform() const { return Transform2D(); }
virtual bool is_directly_attached_to_screen() const { return false; };
#ifndef _3D_DISABLED
bool use_xr = false;
@ -801,6 +802,7 @@ public:
virtual Transform2D get_screen_transform_internal(bool p_absolute_position = false) const override;
virtual Transform2D get_popup_base_transform() const override;
virtual bool is_directly_attached_to_screen() const override;
void _validate_property(PropertyInfo &p_property) const;
SubViewport();

View File

@ -2481,6 +2481,14 @@ Transform2D Window::get_popup_base_transform() const {
return popup_base_transform;
}
bool Window::is_directly_attached_to_screen() const {
if (get_embedder()) {
return get_embedder()->is_directly_attached_to_screen();
}
// Distinguish between the case that this is a native Window and not inside the tree.
return is_inside_tree();
}
void Window::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_title", "title"), &Window::set_title);
ClassDB::bind_method(D_METHOD("get_title"), &Window::get_title);

View File

@ -401,6 +401,7 @@ public:
virtual Transform2D get_final_transform() const override;
virtual Transform2D get_screen_transform_internal(bool p_absolute_position = false) const override;
virtual Transform2D get_popup_base_transform() const override;
virtual bool is_directly_attached_to_screen() const override;
Rect2i get_parent_rect() const;
virtual DisplayServer::WindowID get_window_id() const override;