summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuri Sizov <yuris@humnom.net>2024-01-24 14:08:40 +0100
committerYuri Sizov <yuris@humnom.net>2024-01-24 14:08:40 +0100
commit9c9a00f3a827343b3b0ff04ea9c4cbf7195b527b (patch)
treee70f60eb2e4f4c1d6d58b12ef9b472d048082e73
parenta32a2eaedc5eb8b3e9a01f0458bdd37485037ce9 (diff)
parent0c6b6fe74959bf812de8d5f7b019c621bf62df9c (diff)
downloadredot-engine-9c9a00f3a827343b3b0ff04ea9c4cbf7195b527b.tar.gz
Merge pull request #87432 from Rindbee/fix-set_global_position-in-control
Fix issue where `set_global_position(global_position)` in `Control` resulted in a different result than `global_position`
-rw-r--r--scene/gui/control.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index 349102fafb..a7be5c9af0 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -1419,13 +1419,15 @@ void Control::_set_global_position(const Point2 &p_point) {
void Control::set_global_position(const Point2 &p_point, bool p_keep_offsets) {
ERR_MAIN_THREAD_GUARD;
- Transform2D inv;
- if (data.parent_canvas_item) {
- inv = data.parent_canvas_item->get_global_transform().affine_inverse();
+ Transform2D global_transform_cache = get_global_transform();
+ if (p_point == global_transform_cache.get_origin()) {
+ return; // Edge case, but avoids calculation.
}
- set_position(inv.xform(p_point), p_keep_offsets);
+ Point2 internal_position = global_transform_cache.affine_inverse().xform(p_point);
+
+ set_position(internal_position + data.pos_cache, p_keep_offsets);
}
Point2 Control::get_global_position() const {