From 2c52e83907ca1785f55cf543949e5bd795a4d5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= <49535803+damacaa@users.noreply.github.com> Date: Sun, 5 Jul 2026 18:01:20 +0200 Subject: [PATCH 1/4] Moved all the audio-playing logic and camera dependency out of the physics thread --- src/weird-engine/Scene.cpp | 53 ++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/src/weird-engine/Scene.cpp b/src/weird-engine/Scene.cpp index 4aead6f..851c2a6 100644 --- a/src/weird-engine/Scene.cpp +++ b/src/weird-engine/Scene.cpp @@ -208,7 +208,32 @@ namespace WeirdEngine { EntityShapeCollisionEvent entityEvent{ev, getEntityForSimulationId(ev.body)}; onEntityShapeCollision(m_ecs, entityEvent); + + const float m_soundFalloff = 0.1f; + bool spatialAudio = false; + auto camPosition = getCamera().position; + float speed = glm::length2(ev.velocity); + float distanceMultiplier = + 1.0f / (1.0f + (m_soundFalloff * glm::distance2(camPosition, vec3(ev.position, 0.0f)))); + float frictionSample = ev.friction * 0.01f * speed * (spatialAudio ? distanceMultiplier : 1.0f); + + m_frictionSoundLevel = std::max(frictionSample, m_frictionSoundLevel); + + if (ev.state == CollisionState::START) + { + float penetrationFactor = std::sqrt((std::min)(2.0f * ev.penetration, 1.0f)); + float volume = penetrationFactor; + + float freqFactor = std::abs(glm::dot(ev.normal, (ev.velocity))); + freqFactor *= 0.01f; + float frequency = 200.0f + (freqFactor * 300.0f); + + playSound(WeirdRenderer::SimpleAudioRequest{volume, frequency, false, vec3(ev.position, 0.0f)}); + } } + + m_frictionSoundLevelRead.store(m_frictionSoundLevel, std::memory_order_release); + m_frictionSoundLevel = 0.0f; onUpdate(delta, m_ecs); } @@ -230,9 +255,6 @@ namespace WeirdEngine { Scene* self = static_cast(userData); self->onPhysicsStep(self->m_simulation2D); - - self->m_frictionSoundLevelRead.store(self->m_frictionSoundLevel, std::memory_order_release); - self->m_frictionSoundLevel = 0.0f; } void Scene::handleCollision(CollisionEvent& event, void* userData) @@ -253,31 +275,6 @@ namespace WeirdEngine std::lock_guard lock(self->m_collisionQueueMutex); self->m_queuedShapeCollisions.push_back(event); } - - const float m_soundFalloff = 0.1f; - bool spatialAudio = false; - auto camPosition = self->getCamera().position; // Mutex? - float speed = glm::length2(event.velocity); - float distanceMultiplier = - 1.0f / (1.0f + (m_soundFalloff * glm::distance2(camPosition, vec3(event.position, 0.0f)))); - float frictionSample = event.friction * 0.01f * speed * (spatialAudio ? distanceMultiplier : 1.0f); - - self->m_frictionSoundLevel = std::max(frictionSample, self->m_frictionSoundLevel); - - if (event.state == CollisionState::START) - { - // float speedFactor = std::sqrt((std::min)(0.001f * speed, 1.0f)); - float penetrationFactor = std::sqrt((std::min)(2.0f * event.penetration, 1.0f)); - float volume = penetrationFactor; - - float freqFactor = std::abs(glm::dot(event.normal, (event.velocity))); - freqFactor *= 0.01f; - // freqFactor = freqFactor * freqFactor; - float frequency = 200.0f + (freqFactor * 300.0f); - - self->m_audioQueue.push( - WeirdRenderer::SimpleAudioRequest{volume, frequency, false, vec3(event.position, 0.0f)}); - } } // RENDER From 05c6ee2b39d6331c6c10d8df35eefd8fca77c128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= <49535803+damacaa@users.noreply.github.com> Date: Sun, 5 Jul 2026 18:11:48 +0200 Subject: [PATCH 2/4] Checkbox to disable couts --- include/weird-engine/Logger.h | 1 + src/weird-engine/Logger.cpp | 13 ++++++++++--- src/weird-renderer/core/Renderer.cpp | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/weird-engine/Logger.h b/include/weird-engine/Logger.h index 2ba8746..e1a622b 100644 --- a/include/weird-engine/Logger.h +++ b/include/weird-engine/Logger.h @@ -26,6 +26,7 @@ namespace WeirdEngine static void warning(const std::string& message); static void error(const std::string& message); + static bool s_enableConsoleOutput; static void drawImGuiConsole(); private: diff --git a/src/weird-engine/Logger.cpp b/src/weird-engine/Logger.cpp index ffe26be..e2d360d 100644 --- a/src/weird-engine/Logger.cpp +++ b/src/weird-engine/Logger.cpp @@ -6,26 +6,33 @@ namespace WeirdEngine { std::vector Logger::s_messages; std::mutex Logger::s_mutex; + bool Logger::s_enableConsoleOutput = true; void Logger::log(const std::string& message) { std::lock_guard lock(s_mutex); s_messages.push_back({LogLevel::Info, message}); - std::cout << "[INFO] " << message << std::endl; + if (s_messages.size() > 1000) s_messages.erase(s_messages.begin()); + if (s_enableConsoleOutput) + std::cout << "[INFO] " << message << std::endl; } void Logger::warning(const std::string& message) { std::lock_guard lock(s_mutex); s_messages.push_back({LogLevel::Warning, message}); - std::cout << "[WARN] " << message << std::endl; + if (s_messages.size() > 1000) s_messages.erase(s_messages.begin()); + if (s_enableConsoleOutput) + std::cout << "[WARN] " << message << std::endl; } void Logger::error(const std::string& message) { std::lock_guard lock(s_mutex); s_messages.push_back({LogLevel::Error, message}); - std::cerr << "[ERROR] " << message << std::endl; + if (s_messages.size() > 1000) s_messages.erase(s_messages.begin()); + if (s_enableConsoleOutput) + std::cerr << "[ERROR] " << message << std::endl; } void Logger::drawImGuiConsole() diff --git a/src/weird-renderer/core/Renderer.cpp b/src/weird-renderer/core/Renderer.cpp index 362c7bb..8f69616 100644 --- a/src/weird-renderer/core/Renderer.cpp +++ b/src/weird-renderer/core/Renderer.cpp @@ -253,6 +253,7 @@ namespace WeirdEngine if (ImGui::BeginTabItem("Console")) { + ImGui::Checkbox("Print to std::cout", &Logger::s_enableConsoleOutput); Logger::drawImGuiConsole(); ImGui::EndTabItem(); } From bd4df619367baeaa1bcaa9c19a1902b381c3ce43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= <49535803+damacaa@users.noreply.github.com> Date: Sun, 5 Jul 2026 18:35:57 +0200 Subject: [PATCH 3/4] Fixed a couple of memory leaks --- examples/sample-scenes/include/DestroyScene.h | 2 +- include/weird-engine/SceneManager.h | 4 ++-- src/weird-physics/Simulation2D.cpp | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/sample-scenes/include/DestroyScene.h b/examples/sample-scenes/include/DestroyScene.h index b0c6f90..b055cc2 100644 --- a/examples/sample-scenes/include/DestroyScene.h +++ b/examples/sample-scenes/include/DestroyScene.h @@ -78,7 +78,7 @@ class DestroyScene : public Scene2D float y = (std::rand() % 100) - 50.0f; float w = (float)(std::rand() % 4 + 1); float h = (float)(std::rand() % 4 + 1); - float variables[4]{w, y, x, h}; + float variables[8]{w, y, x, h, 0.0f, 0.0f, 0.0f, 0.0f}; uint16_t material = std::rand() % 16; Entity shape = addShape(DefaultShapes::BOX, variables, material, CombinationType::Addition); m_testShapes.push_back(shape); diff --git a/include/weird-engine/SceneManager.h b/include/weird-engine/SceneManager.h index 772a3ad..6c555ec 100644 --- a/include/weird-engine/SceneManager.h +++ b/include/weird-engine/SceneManager.h @@ -31,8 +31,8 @@ namespace WeirdEngine static SceneManager& getInstance() { - static SceneManager* _instance = new SceneManager(); - return *_instance; + static SceneManager _instance; + return _instance; }; void loadNextScene(); diff --git a/src/weird-physics/Simulation2D.cpp b/src/weird-physics/Simulation2D.cpp index 5963001..8d98823 100644 --- a/src/weird-physics/Simulation2D.cpp +++ b/src/weird-physics/Simulation2D.cpp @@ -79,6 +79,7 @@ namespace WeirdEngine delete[] m_velocitiesRead; delete[] m_velocitiesAux; delete[] m_forces; + delete[] m_externalForces; delete[] m_mass; delete[] m_invMass; } From 835b4ea6133f2cfa5167eb5a93b330729f4317c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= <49535803+damacaa@users.noreply.github.com> Date: Sun, 5 Jul 2026 18:37:54 +0200 Subject: [PATCH 4/4] Added the option to run AddressSanitizer to find leaks --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index fefb28a..91965a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,14 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Ensure strictly standard C++ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +option(WEIRD_ENGINE_ENABLE_ASAN "Enable AddressSanitizer for memory leak detection" OFF) +if(WEIRD_ENGINE_ENABLE_ASAN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") +endif() + message(STATUS "WeirdEngine path: ${CMAKE_CURRENT_SOURCE_DIR}")