You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Fix scaled_orthogonal() & subgizmo global scaling
This commit is contained in:
@@ -239,13 +239,18 @@ void Basis::scale_orthogonal(const Vector3 &p_scale) {
|
|||||||
Basis Basis::scaled_orthogonal(const Vector3 &p_scale) const {
|
Basis Basis::scaled_orthogonal(const Vector3 &p_scale) const {
|
||||||
Basis m = *this;
|
Basis m = *this;
|
||||||
Vector3 s = Vector3(-1, -1, -1) + p_scale;
|
Vector3 s = Vector3(-1, -1, -1) + p_scale;
|
||||||
|
bool sign = signbit(s.x + s.y + s.z);
|
||||||
|
Basis b = m.orthonormalized();
|
||||||
|
s = b.xform_inv(s);
|
||||||
Vector3 dots;
|
Vector3 dots;
|
||||||
Basis b;
|
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
for (int j = 0; j < 3; j++) {
|
for (int j = 0; j < 3; j++) {
|
||||||
dots[j] += s[i] * abs(m.get_column(i).normalized().dot(b.get_column(j)));
|
dots[j] += s[i] * abs(m.get_column(i).normalized().dot(b.get_column(j)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (sign != signbit(dots.x + dots.y + dots.z)) {
|
||||||
|
dots = -dots;
|
||||||
|
}
|
||||||
m.scale_local(Vector3(1, 1, 1) + dots);
|
m.scale_local(Vector3(1, 1, 1) + dots);
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1415,9 +1415,6 @@ Transform3D Node3DEditorViewport::_compute_transform(TransformMode p_mode, const
|
|||||||
// Recalculate orthogonalized scale without moving origin.
|
// Recalculate orthogonalized scale without moving origin.
|
||||||
if (p_orthogonal) {
|
if (p_orthogonal) {
|
||||||
s.basis = p_original.basis.scaled_orthogonal(p_motion + Vector3(1, 1, 1));
|
s.basis = p_original.basis.scaled_orthogonal(p_motion + Vector3(1, 1, 1));
|
||||||
// The scaled_orthogonal() does not require orthogonal Basis,
|
|
||||||
// but it may make a bit skew by precision problems.
|
|
||||||
s.basis.orthogonalize();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4634,7 +4631,7 @@ void Node3DEditorViewport::update_transform(Point2 p_mousepos, bool p_shift) {
|
|||||||
if (se->gizmo.is_valid()) {
|
if (se->gizmo.is_valid()) {
|
||||||
for (KeyValue<int, Transform3D> &GE : se->subgizmos) {
|
for (KeyValue<int, Transform3D> &GE : se->subgizmos) {
|
||||||
Transform3D xform = GE.value;
|
Transform3D xform = GE.value;
|
||||||
Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo.
|
Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords, _edit.plane != TRANSFORM_VIEW); // Force orthogonal with subgizmo.
|
||||||
if (!local_coords) {
|
if (!local_coords) {
|
||||||
new_xform = se->original.affine_inverse() * new_xform;
|
new_xform = se->original.affine_inverse() * new_xform;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1301,7 +1301,7 @@ void Skeleton3DGizmoPlugin::set_subgizmo_transform(const EditorNode3DGizmo *p_gi
|
|||||||
Transform3D original_to_local;
|
Transform3D original_to_local;
|
||||||
int parent_idx = skeleton->get_bone_parent(p_id);
|
int parent_idx = skeleton->get_bone_parent(p_id);
|
||||||
if (parent_idx >= 0) {
|
if (parent_idx >= 0) {
|
||||||
original_to_local = original_to_local * skeleton->get_bone_global_pose(parent_idx);
|
original_to_local = skeleton->get_bone_global_pose(parent_idx);
|
||||||
}
|
}
|
||||||
Basis to_local = original_to_local.get_basis().inverse();
|
Basis to_local = original_to_local.get_basis().inverse();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user