From d4061386ecaa094cde7dfdf1a0c5666e1104d03f Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Fri, 3 Apr 2026 18:43:54 +0300 Subject: [PATCH] Fixed crashes --- src/features/editScene/gizmo/Gizmo.cpp | 30 ++++++++++++++++--- .../editScene/systems/EditorUISystem.cpp | 8 +++++ .../editScene/systems/PhysicsSystem.hpp | 6 ++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/features/editScene/gizmo/Gizmo.cpp b/src/features/editScene/gizmo/Gizmo.cpp index 3243ed1..08dde42 100644 --- a/src/features/editScene/gizmo/Gizmo.cpp +++ b/src/features/editScene/gizmo/Gizmo.cpp @@ -42,10 +42,32 @@ Gizmo::Gizmo(Ogre::SceneManager *sceneMgr) Gizmo::~Gizmo() { - if (m_axisX) m_sceneMgr->destroyManualObject(m_axisX); - if (m_axisY) m_sceneMgr->destroyManualObject(m_axisY); - if (m_axisZ) m_sceneMgr->destroyManualObject(m_axisZ); - if (m_gizmoNode) m_sceneMgr->destroySceneNode(m_gizmoNode); + // Detach objects from node first to avoid double-delete + if (m_gizmoNode) { + if (m_axisX) m_gizmoNode->detachObject(m_axisX); + if (m_axisY) m_gizmoNode->detachObject(m_axisY); + if (m_axisZ) m_gizmoNode->detachObject(m_axisZ); + } + + // Now destroy the manual objects + if (m_axisX) { + m_sceneMgr->destroyManualObject(m_axisX); + m_axisX = nullptr; + } + if (m_axisY) { + m_sceneMgr->destroyManualObject(m_axisY); + m_axisY = nullptr; + } + if (m_axisZ) { + m_sceneMgr->destroyManualObject(m_axisZ); + m_axisZ = nullptr; + } + + // Finally destroy the node + if (m_gizmoNode) { + m_sceneMgr->destroySceneNode(m_gizmoNode); + m_gizmoNode = nullptr; + } } void Gizmo::attachTo(flecs::entity entity) diff --git a/src/features/editScene/systems/EditorUISystem.cpp b/src/features/editScene/systems/EditorUISystem.cpp index f6a48f5..7a14d3f 100644 --- a/src/features/editScene/systems/EditorUISystem.cpp +++ b/src/features/editScene/systems/EditorUISystem.cpp @@ -648,6 +648,14 @@ void EditorUISystem::deleteEntity(flecs::entity entity) deleteEntity(child); } + // Clean up physics body before removing component + if (entity.has()) { + auto &rigidBody = entity.get_mut(); + if (m_physicsSystem && rigidBody.bodyCreated) { + m_physicsSystem->removeRigidBody(rigidBody); + } + } + // Clean up transform node if (entity.has()) { auto &transform = entity.get_mut(); diff --git a/src/features/editScene/systems/PhysicsSystem.hpp b/src/features/editScene/systems/PhysicsSystem.hpp index 4b659c3..317fdb7 100644 --- a/src/features/editScene/systems/PhysicsSystem.hpp +++ b/src/features/editScene/systems/PhysicsSystem.hpp @@ -33,6 +33,9 @@ public: bool isInitialized() const { return m_initialized; } + // Remove a rigid body (public for external cleanup) + void removeRigidBody(RigidBodyComponent& rigidBody); + private: // Create a shape from collider component JPH::ShapeRefC createShape(PhysicsColliderComponent& collider); @@ -44,9 +47,6 @@ private: void updateRigidBody(flecs::entity entity, RigidBodyComponent& rigidBody, class TransformComponent& transform); - // Remove a rigid body - void removeRigidBody(RigidBodyComponent& rigidBody); - flecs::world& m_world; Ogre::SceneManager* m_sceneMgr;