From 361cb914f3712e3a7ec94705b952d7a51e8bf553 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 10 Jan 2024 11:42:49 -0600 Subject: [PATCH 1/3] Keep local orientation on collider spawn. Add option to keep orientation when resizing collider. --- Source/Editor/SceneGraph/Actors/BoxColliderNode.cs | 8 ++++++-- Source/Engine/Physics/Colliders/BoxCollider.cpp | 5 +++-- Source/Engine/Physics/Colliders/BoxCollider.h | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs b/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs index 0f6670feb..cc3bcbe42 100644 --- a/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs +++ b/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs @@ -19,12 +19,16 @@ namespace FlaxEditor.SceneGraph.Actors [CustomEditor(typeof(BoxCollider)), DefaultEditor] public class BoxColliderEditor : ActorEditor { + private bool _keepLocalOrientation = false; /// public override void Initialize(LayoutElementsContainer layout) { base.Initialize(layout); layout.Space(20f); + var checkbox = layout.Checkbox("Keep Local Orientation", "Keeps the local orientation when resizing.").CheckBox; + checkbox.Checked = _keepLocalOrientation; + checkbox.StateChanged += box => _keepLocalOrientation = box.Checked; layout.Button("Resize to Fit", Editor.Instance.CodeDocs.GetTooltip(new ScriptMemberInfo(typeof(BoxCollider).GetMethod("AutoResize")))).Button.Clicked += OnResizeClicked; } @@ -33,7 +37,7 @@ namespace FlaxEditor.SceneGraph.Actors foreach (var value in Values) { if (value is BoxCollider collider) - collider.AutoResize(); + collider.AutoResize(!_keepLocalOrientation); } } } @@ -76,7 +80,7 @@ namespace FlaxEditor.SceneGraph.Actors return; } - ((BoxCollider)Actor).AutoResize(); + ((BoxCollider)Actor).AutoResize(false); } } } diff --git a/Source/Engine/Physics/Colliders/BoxCollider.cpp b/Source/Engine/Physics/Colliders/BoxCollider.cpp index d74b3efba..d82b94d28 100644 --- a/Source/Engine/Physics/Colliders/BoxCollider.cpp +++ b/Source/Engine/Physics/Colliders/BoxCollider.cpp @@ -20,7 +20,7 @@ void BoxCollider::SetSize(const Float3& value) UpdateBounds(); } -void BoxCollider::AutoResize() +void BoxCollider::AutoResize(bool globalOrientation = true) { Actor* parent = GetParent(); if (Cast(parent)) @@ -43,7 +43,8 @@ void BoxCollider::AutoResize() SetLocalPosition(Vector3::Zero); SetSize(parentSize / parentScale); SetCenter(parentCenter / parentScale); - SetOrientation(GetOrientation() * Quaternion::Invert(GetOrientation())); + if (globalOrientation) + SetOrientation(GetOrientation() * Quaternion::Invert(GetOrientation())); } #if USE_EDITOR diff --git a/Source/Engine/Physics/Colliders/BoxCollider.h b/Source/Engine/Physics/Colliders/BoxCollider.h index 3c15ce640..3c6759ee9 100644 --- a/Source/Engine/Physics/Colliders/BoxCollider.h +++ b/Source/Engine/Physics/Colliders/BoxCollider.h @@ -46,7 +46,7 @@ public: /// /// Resizes the collider based on the bounds of it's parent to contain it whole (including any siblings). /// - API_FUNCTION() void AutoResize(); + API_FUNCTION() void AutoResize(bool globalOrientation); public: // [Collider] From f1d6d71f6c5d15c2ff6b3ebbdae5f05f42e972f2 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 10 Jan 2024 13:53:22 -0600 Subject: [PATCH 2/3] Get unrotated bounded box to rotate. --- Source/Engine/Physics/Colliders/BoxCollider.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/Engine/Physics/Colliders/BoxCollider.cpp b/Source/Engine/Physics/Colliders/BoxCollider.cpp index d82b94d28..a174b2c11 100644 --- a/Source/Engine/Physics/Colliders/BoxCollider.cpp +++ b/Source/Engine/Physics/Colliders/BoxCollider.cpp @@ -30,7 +30,13 @@ void BoxCollider::AutoResize(bool globalOrientation = true) const Vector3 parentScale = parent->GetScale(); if (parentScale.IsAnyZero()) return; // Avoid division by zero + + // Hacky way to get unrotated bounded box of parent. + const Quaternion parentOrientation = parent->GetOrientation(); + parent->SetOrientation(Quaternion::Identity); BoundingBox parentBox = parent->GetBox(); + parent->SetOrientation(parentOrientation); + for (const Actor* sibling : parent->Children) { if (sibling != this) @@ -45,6 +51,8 @@ void BoxCollider::AutoResize(bool globalOrientation = true) SetCenter(parentCenter / parentScale); if (globalOrientation) SetOrientation(GetOrientation() * Quaternion::Invert(GetOrientation())); + else + SetOrientation(parentOrientation); } #if USE_EDITOR From cae9ddfa36ee3af1e579ee0968ae80ffdade7cc6 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 10 Jan 2024 13:56:38 -0600 Subject: [PATCH 3/3] Default to keep local orientation. --- Source/Editor/SceneGraph/Actors/BoxColliderNode.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs b/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs index cc3bcbe42..64ab104c5 100644 --- a/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs +++ b/Source/Editor/SceneGraph/Actors/BoxColliderNode.cs @@ -19,7 +19,8 @@ namespace FlaxEditor.SceneGraph.Actors [CustomEditor(typeof(BoxCollider)), DefaultEditor] public class BoxColliderEditor : ActorEditor { - private bool _keepLocalOrientation = false; + private bool _keepLocalOrientation = true; + /// public override void Initialize(LayoutElementsContainer layout) {