From 7a73dbd49d19ec2c7917eee41ae43bee2a408bc2 Mon Sep 17 00:00:00 2001 From: Stanislav Denisov Date: Tue, 10 Mar 2026 16:29:18 +0100 Subject: [PATCH] Implement mesh recenter to top (#1585) * Implement mesh recenter to top * Fix downstream error --- Editor/MeshWindow.cpp | 9 +++++++++ Editor/MeshWindow.h | 1 + WickedEngine/wiScene_Components.cpp | 14 ++++++++++++++ WickedEngine/wiScene_Components.h | 1 + 4 files changed, 25 insertions(+) diff --git a/Editor/MeshWindow.cpp b/Editor/MeshWindow.cpp index f1d61769a..72f78989f 100644 --- a/Editor/MeshWindow.cpp +++ b/Editor/MeshWindow.cpp @@ -327,6 +327,14 @@ void MeshWindow::Create(EditorComponent* _editor) })); AddWidget(&recenterButton); + recenterToTopButton.Create("Recenter to Top"); + recenterToTopButton.SetTooltip("Recenter mesh to AABB top."); + recenterToTopButton.OnClick(changeSelectedMesh([this] (auto mesh) { + mesh->RecenterToTop(); + UpdateRecenterInputs(mesh->aabb.getCenter()); + })); + AddWidget(&recenterToTopButton); + recenterToBottomButton.Create("Recenter to Bottom"); recenterToBottomButton.SetTooltip("Recenter mesh to AABB bottom."); recenterToBottomButton.OnClick(changeSelectedMesh([this] (auto mesh) { @@ -1196,6 +1204,7 @@ void MeshWindow::ResizeLayout() layout.add_fullwidth(computeNormalsSmoothButton); layout.add_fullwidth(computeNormalsHardButton); layout.add_fullwidth(recenterButton); + layout.add_fullwidth(recenterToTopButton); layout.add_fullwidth(recenterToBottomButton); const float safe_width = layout.width - 100 - layout.padding; diff --git a/Editor/MeshWindow.h b/Editor/MeshWindow.h index 5f3f7c8df..cf0ff3c74 100644 --- a/Editor/MeshWindow.h +++ b/Editor/MeshWindow.h @@ -30,6 +30,7 @@ public: wi::gui::Button computeNormalsSmoothButton; wi::gui::Button computeNormalsHardButton; wi::gui::Button recenterButton; + wi::gui::Button recenterToTopButton; wi::gui::Button recenterToBottomButton; wi::gui::TextInputField recenterToXInput; wi::gui::TextInputField recenterToYInput; diff --git a/WickedEngine/wiScene_Components.cpp b/WickedEngine/wiScene_Components.cpp index 1dd80e5dc..f6b63a363 100644 --- a/WickedEngine/wiScene_Components.cpp +++ b/WickedEngine/wiScene_Components.cpp @@ -1962,6 +1962,20 @@ namespace wi::scene CreateRenderData(); } + void MeshComponent::RecenterToTop() + { + XMFLOAT3 center = aabb.getCenter(); + center.y += aabb.getHalfWidth().y; + + for (auto& pos : vertex_positions) + { + pos.x -= center.x; + pos.y -= center.y; + pos.z -= center.z; + } + + CreateRenderData(); + } void MeshComponent::RecenterToBottom() { XMFLOAT3 center = aabb.getCenter(); diff --git a/WickedEngine/wiScene_Components.h b/WickedEngine/wiScene_Components.h index 4632ad753..22e9e096b 100644 --- a/WickedEngine/wiScene_Components.h +++ b/WickedEngine/wiScene_Components.h @@ -870,6 +870,7 @@ namespace wi::scene void FlipCulling(); void FlipNormals(); void Recenter(); + void RecenterToTop(); void RecenterToBottom(); void RecenterTo(float x, float y, float z); wi::primitive::Sphere GetBoundingSphere() const;