From b75e82f81bca483cd3d6b2a41a98ca873afdae37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E9=9D=92=E5=B1=B1?= Date: Fri, 28 Feb 2025 09:27:00 +0800 Subject: [PATCH] Fix RemoteTransform2D causing skew to be lost `set_skew()` seems to be the slowest, avoid calling it if possible. --- scene/2d/remote_transform_2d.cpp | 72 +++++++++++++++----------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp index 1816a3409bf..1b56d51191e 100644 --- a/scene/2d/remote_transform_2d.cpp +++ b/scene/2d/remote_transform_2d.cpp @@ -60,51 +60,45 @@ void RemoteTransform2D::_update_remote() { return; } - if (!(update_remote_position || update_remote_rotation || update_remote_scale)) { + int count = update_remote_position + update_remote_rotation + update_remote_scale; + + if (count == 0) { return; // The transform data of the RemoteTransform2D is not used at all. } //todo make faster + + Transform2D n_trans = use_global_coordinates ? n->get_global_transform() : n->get_transform(); + Transform2D our_trans = use_global_coordinates ? get_global_transform() : get_transform(); + + if (count == 1) { + if (update_remote_position) { + n_trans.set_origin(our_trans.get_origin()); + } else if (update_remote_rotation) { + n_trans.set_rotation(our_trans.get_rotation()); + } else if (update_remote_scale) { + n_trans.set_scale(our_trans.get_scale()); + } + } else if (count == 2) { + if (update_remote_position) { + n_trans.set_origin(our_trans.get_origin()); + if (update_remote_rotation) { + n_trans.set_rotation(our_trans.get_rotation()); + } else if (update_remote_scale) { + n_trans.set_scale(our_trans.get_scale()); + } + } else { + n_trans.set_rotation_and_scale(our_trans.get_rotation(), our_trans.get_scale()); + } + } else if (count == 3) { + n_trans.set_origin(our_trans.get_origin()); + n_trans.set_rotation_and_scale(our_trans.get_rotation(), our_trans.get_scale()); + } + if (use_global_coordinates) { - if (update_remote_position && update_remote_rotation && update_remote_scale) { - n->set_global_transform(get_global_transform()); - return; - } - - Transform2D n_trans = n->get_global_transform(); - Transform2D our_trans = get_global_transform(); - - // There are more steps in the operation of set_rotation, so avoid calling it. - Transform2D trans = update_remote_rotation ? our_trans : n_trans; - - if (update_remote_rotation ^ update_remote_position) { - trans.set_origin(update_remote_position ? our_trans.get_origin() : n_trans.get_origin()); - } - if (update_remote_rotation ^ update_remote_scale) { - trans.set_scale(update_remote_scale ? our_trans.get_scale() : n_trans.get_scale()); - } - - n->set_global_transform(trans); + n->set_global_transform(n_trans); } else { - if (update_remote_position && update_remote_rotation && update_remote_scale) { - n->set_transform(get_transform()); - return; - } - - Transform2D n_trans = n->get_transform(); - Transform2D our_trans = get_transform(); - - // There are more steps in the operation of set_rotation, so avoid calling it. - Transform2D trans = update_remote_rotation ? our_trans : n_trans; - - if (update_remote_rotation ^ update_remote_position) { - trans.set_origin(update_remote_position ? our_trans.get_origin() : n_trans.get_origin()); - } - if (update_remote_rotation ^ update_remote_scale) { - trans.set_scale(update_remote_scale ? our_trans.get_scale() : n_trans.get_scale()); - } - - n->set_transform(trans); + n->set_transform(n_trans); } }