From 9d68559962740573302060cec9f5ca290ac1e760 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Fri, 19 Jun 2026 16:23:03 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20reset=20scene=20crash=20=E2=80=94=20remo?= =?UTF-8?q?ve=20physics=20bodies=20before=20entity=20destruct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: after Destruct(), physics world still references dead entities in its internal dictionary. SyncTransforms iterates dead entity IDs → Flecs assert ecs_is_alive. Fix: - Pause physics during reset - For each deleted entity: check Has, call physicsWorld.RemoveBody to clean up Jolt body + dictionary entries BEFORE Destruct - Resume physics after CreateObjects - New objects get IsInitialized=false, physics bodies created next frame --- imgui.ini | 2 +- src/CortexEngine.App/Program.cs | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/imgui.ini b/imgui.ini index f0c7bfc..bce0f71 100644 --- a/imgui.ini +++ b/imgui.ini @@ -29,7 +29,7 @@ Size=507,263 Collapsed=0 [Window][Shadow & Light Parameters] -Pos=2,200 +Pos=22,191 Size=223,506 Collapsed=0 diff --git a/src/CortexEngine.App/Program.cs b/src/CortexEngine.App/Program.cs index 6f8e8c2..e384be4 100644 --- a/src/CortexEngine.App/Program.cs +++ b/src/CortexEngine.App/Program.cs @@ -228,6 +228,9 @@ class Program ImGui.SameLine(); if (ImGui.Button("Reset Scene")) { + // Pause physics during reset + physicsEnabled = false; + // Delete all entities except Camera, lights, Floor var toDelete = new List(); world.Each((Entity e, ref Transform t) => @@ -236,11 +239,20 @@ class Program if (name != "Camera" && name != "MainLight" && name != "SecondLight" && name != "ThirdLight" && name != "Floor") toDelete.Add(e); }); + + // Remove RigidBody from physics before destructing foreach (var ent in toDelete) { - if (ent.IsAlive()) ent.Destruct(); + if (ent.IsAlive()) + { + if (ent.Has()) + physicsWorld.RemoveBody(ent); + ent.Destruct(); + } } + CreateObjects(world); + physicsEnabled = true; Console.WriteLine($"[App] Scene reset: {toDelete.Count} entities deleted"); } ImGui.End();