Repeatedly closing/reopening a window and re-initializing the render system
(single-process unit_test run) crashed because:
- The Vulkan surface/swapchain stayed bound to the destroyed native window.
SDL can hand back the same pointer for a recreated window, so pointer
identity could not detect the stale surface; present() then hit
getSurfaceCapabilitiesKHR: ErrorUnknown.
- The ImGui context and Vulkan present-overlay survived the window, so a
later present() drew into an unrelated window via the stale overlay.
- headlessImGuiWalk destroyed the ImGui context while the UI backend's real
context was still current (CreateContext only auto-switches current when
GImGui is NULL), leaving a dangling context for later present() calls.
Fix:
- Window::close() calls Graphics::onNativeWindowDestroyed(); the Vulkan
backend drops the surface/swapchain and fires registered window-destroyed
callbacks (UI backend tears down its ImGui context here).
- initWithWindow() rebuilds the swapchain synchronously and no longer relies
on pointer identity to detect a stale surface.
- ImGuiBackend owns its ImGui context explicitly and shuts it down via the
window-destroyed hook; shutdown() switches to its own context first.
- headlessImGuiWalk switches to and from its private ImGui context.
Test-only fixes exposed once the suite can run to completion:
- animation_skinned: Animation::create() returns the process-wide singleton;
do not wrap it in unique_ptr (delete left a dangling ModuleManager pointer).
- particles attach tests: emitters live in a process-wide ECS; detach (and
clear skin sources) before local skeletons are destroyed.
- Added methods for file watching, including `watch`, `unwatch`, `unwatchAll`, `getWatchCount`, `pollWatch`, `getLastWatchPath`, and `getLastWatchRealPath`.
- Enhanced the `Filesystem` class to support monitoring file changes, allowing for real-time updates.
- Updated the `physfs` implementation to handle file watch targets and events.
- Improved documentation and added unit tests to validate the new file watching features.
Co-authored-by: Cursor <cursoragent@cursor.com>