Preserve Z scale and apply correct offset when Ctrl‑dragging XY corner (#13840)

This commit is contained in:
Calcousin55
2026-05-31 09:16:06 -07:00
committed by GitHub
parent 30e83d790c
commit 86ad4d141a

View File

@@ -448,7 +448,29 @@ void GLGizmoScale3D::do_scale_uniform(const UpdateData& data)
if (ratio > 0.0)
{
m_scale = m_starting.scale * ratio;
m_offset = Vec3d::Zero();
if (m_starting.ctrl_down && abs(ratio-1.0f)>0.001) {
m_scale.z() = m_starting.scale.z();
double local_offset_x = 0.5 * (m_scale.x() - m_starting.scale.x()) * m_starting.box.size().x();
double local_offset_y = 0.5 * (m_scale.y() - m_starting.scale.y()) * m_starting.box.size().y();
Vec3d local_offset_vec = Vec3d::Zero();
switch (m_hover_id)
{
case 6: { local_offset_vec = Vec3d(-local_offset_x, -local_offset_y, 0.0); break; }
case 7: { local_offset_vec = Vec3d( local_offset_x, -local_offset_y, 0.0); break; }
case 8: { local_offset_vec = Vec3d( local_offset_x, local_offset_y, 0.0); break; }
case 9: { local_offset_vec = Vec3d(-local_offset_x, local_offset_y, 0.0); break; }
default: break;
}
if (m_object_manipulation->is_world_coordinates()) {
m_offset = local_offset_vec;
} else {
m_offset = m_grabbers_tran.get_matrix_no_offset() * local_offset_vec;
}
} else {
m_offset = Vec3d::Zero();
}
}
}