From 0f7a9ebfbae9a6eeb3bffd718ba2fd148a6ce16e Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 2 Apr 2025 13:19:30 -0400 Subject: [PATCH 1/6] Added widget drawer for module settings --- .../ProjectSettings/ProjectSettingsWindow.cpp | 55 ++---------- .../Modules/ExampleModule/ExampleModule.cpp | 4 +- Nuake/Source/Nuake/Modules/ModuleDB.h | 16 +++- Nuake/Source/Nuake/Modules/Modules.cpp | 54 ++++++++++++ Nuake/Source/Nuake/UI/WidgetDrawer.h | 88 +++++++++++++++++++ 5 files changed, 164 insertions(+), 53 deletions(-) create mode 100644 Nuake/Source/Nuake/UI/WidgetDrawer.h diff --git a/Editor/Source/Editor/Windows/ProjectSettings/ProjectSettingsWindow.cpp b/Editor/Source/Editor/Windows/ProjectSettings/ProjectSettingsWindow.cpp index cc7909c8..89d2e991 100644 --- a/Editor/Source/Editor/Windows/ProjectSettings/ProjectSettingsWindow.cpp +++ b/Editor/Source/Editor/Windows/ProjectSettings/ProjectSettingsWindow.cpp @@ -7,6 +7,7 @@ #include "../../Commands/Commands/Commands.h" #include #include +#include "Nuake/UI/WidgetDrawer.h" ProjectSettingsCategoryWindowGeneral::ProjectSettingsCategoryWindowGeneral(Ref project) : m_Project(project) @@ -212,6 +213,7 @@ ProjectSettingsModuleWindow::ProjectSettingsModuleWindow(const std::string& inMo void ProjectSettingsModuleWindow::Draw() { auto meta = entt::resolve(entt::hashed_string(Name.c_str())); + auto instance = ModuleDB::Get().GetBaseImpl(Name).instance; for (auto [id, data] : meta.data()) { auto propDisplayName = data.prop(HashedName::DisplayName); @@ -220,59 +222,12 @@ void ProjectSettingsModuleWindow::Draw() auto propVal = propDisplayName.value(); const char* settingName = *propVal.try_cast(); + auto& drawer = WidgetDrawer::Get(); + drawer.DrawWidget(data, instance); + ImGui::Text(settingName); } } - - for (auto [id, func] : meta.func()) - { - auto propDisplayName = func.prop(HashedName::DisplayName); - - if (propDisplayName) - { - auto propVal = propDisplayName.value(); - const char* settingName = *propVal.try_cast(); - - ImGui::Text(settingName); - } - - - // Setting - //std::string funcName = "UnknownFunc"; - //if (propDisplayName) - //{ - // funcName = std::string(*propDisplayName.value().try_cast()); - //} - // - //std::string msg = std::string(returnType) + " " + std::string(funcName) + "("; - //std::vector args; - // - //if (func.arity() > 0) - //{ - // auto propArgsName = func.prop(HashedName::ArgsName); - // if (propArgsName) - // { - // std::vector argsName = *propArgsName.value().try_cast>(); - // for (int i = 0; i < func.arity(); i++) - // { - // const std::string argType = std::string(func.arg(i).info().name()); - // args.push_back(argType); - // - // msg += argType + " " + argsName[i]; - // - // if (i < func.arity() - 1) - // { - // msg += ", "; - // } - // } - // } - //} - // - // - //msg += ")"; - // - //Logger::Log(msg, "", VERBOSE); - } } void ProjectSettingsCategoryAudio::Draw() diff --git a/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp b/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp index 5aad6999..79609f1b 100644 --- a/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp +++ b/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp @@ -62,7 +62,7 @@ void ExampleModuleLog(const std::string& hi) Nuake::Logger::Log(hi, "ExampleModule", Nuake::VERBOSE); } -float mySetting = 1.0f; +float mySetting = 8.0f; NUAKEMODULE(ExampleModule) void ExampleModule_Startup() @@ -76,7 +76,7 @@ void ExampleModule_Startup() module.Description = "This is an example module"; - module.RegisterSetting<&mySetting>("Hello World!"); + module.RegisterSetting<&mySetting>("mySetting"); // This is to expose functions to the rest of the engine module.BindFunction("ExampleFunction"); diff --git a/Nuake/Source/Nuake/Modules/ModuleDB.h b/Nuake/Source/Nuake/Modules/ModuleDB.h index 8fa2c966..16a7210a 100644 --- a/Nuake/Source/Nuake/Modules/ModuleDB.h +++ b/Nuake/Source/Nuake/Modules/ModuleDB.h @@ -185,7 +185,9 @@ namespace Nuake template T& RegisterModule() { - Modules[typeid(T).name()] = (ModuleInstance*)(new T()); + T* newInstance = new T(); + newInstance->instance = entt::resolve().construct(); + Modules[typeid(T).name()] = (ModuleInstance*)newInstance; return *(T*)std::any_cast(Modules[typeid(T).name()]); } @@ -202,6 +204,18 @@ namespace Nuake return *(T*)std::any_cast(Modules[typeName]); } + ModuleInstance& GetBaseImpl(const std::string& moduleName) + { + for (auto& [name, _] : Modules) + { + if (name == moduleName) + { + return *std::any_cast(Modules[name]); + } + } + + assert(false && "Module not found."); + } entt::meta_type GetModuleMeta(const std::string& moduleName) { diff --git a/Nuake/Source/Nuake/Modules/Modules.cpp b/Nuake/Source/Nuake/Modules/Modules.cpp index 8e9d7f0b..fddd2ed9 100644 --- a/Nuake/Source/Nuake/Modules/Modules.cpp +++ b/Nuake/Source/Nuake/Modules/Modules.cpp @@ -5,10 +5,64 @@ #include "AudioModule/AudioModule.h" #include "ExampleModule/ExampleModule.h" +#include "Nuake/UI/WidgetDrawer.h" + +#include "Nuake/Core/Object/Object.h" #include "Nuake/Core/Logger.h" +void DrawFloatWidget(entt::meta_data& type, entt::meta_any& instance) +{ + using namespace Nuake; + + float stepSize = 1.f; + if (auto prop = type.prop(HashedFieldPropName::FloatStep)) + stepSize = *prop.value().try_cast(); + + float min = 0.f; + if (auto prop = type.prop(HashedFieldPropName::FloatMin)) + min = *prop.value().try_cast(); + + float max = 0.f; + if (auto prop = type.prop(HashedFieldPropName::FloatMax)) + max = *prop.value().try_cast(); + + auto propDisplayName = type.prop(HashedName::DisplayName); + const char* displayName = *propDisplayName.value().try_cast(); + if (displayName != nullptr) + { + ImGui::Text(displayName); + ImGui::TableNextColumn(); + + auto fieldVal = type.get(instance); + float* floatPtr = fieldVal.try_cast(); + if (floatPtr != nullptr) + { + float floatProxy = *floatPtr; + const std::string controlId = std::string("##") + displayName; + if (ImGui::DragFloat(controlId.c_str(), &floatProxy, stepSize, min, max)) + { + type.set(instance, floatProxy); + } + } + else + { + ImGui::Text("ERR"); + } + } +} + +void DrawBoolWidget(entt::meta_type& type, entt::meta_any& instance) +{ + +} + void Nuake::Modules::StartupModules() { + auto& drawer = WidgetDrawer::Get(); + drawer.RegisterTypeDrawer(&drawer); + + //drawer.RegisterTypeDrawer(&DrawBoolWidget); + Logger::Log("Starting AssimpModule", "modules"); AssimpModule_Startup(); Logger::Log("Starting AudioModule", "modules"); diff --git a/Nuake/Source/Nuake/UI/WidgetDrawer.h b/Nuake/Source/Nuake/UI/WidgetDrawer.h new file mode 100644 index 00000000..039566f1 --- /dev/null +++ b/Nuake/Source/Nuake/UI/WidgetDrawer.h @@ -0,0 +1,88 @@ +#pragma once +#include "Nuake/Core/Object/Object.h" + +#include +#include + +#include +#include + + +namespace Nuake +{ + using DrawWidgetTypeFn = std::function; + class WidgetDrawer + { + public: + WidgetDrawer() = default; + ~WidgetDrawer() = default; + + static WidgetDrawer& Get() + { + static WidgetDrawer instance; + return instance; + } + + void DrawFloat(entt::meta_data& type, entt::meta_any& instance) + { + float stepSize = 1.f; + if (auto prop = type.prop(HashedFieldPropName::FloatStep)) + stepSize = *prop.value().try_cast(); + + float min = 0.f; + if (auto prop = type.prop(HashedFieldPropName::FloatMin)) + min = *prop.value().try_cast(); + + float max = 0.f; + if (auto prop = type.prop(HashedFieldPropName::FloatMax)) + max = *prop.value().try_cast(); + + auto propDisplayName = type.prop(HashedName::DisplayName); + const char* displayName = *propDisplayName.value().try_cast(); + if (displayName != nullptr) + { + ImGui::Text(displayName); + ImGui::TableNextColumn(); + + auto fieldVal = type.get(instance); + float* floatPtr = fieldVal.try_cast(); + if (floatPtr != nullptr) + { + float floatProxy = *floatPtr; + const std::string controlId = std::string("##") + displayName; + if (ImGui::DragFloat(controlId.c_str(), &floatProxy, stepSize, min, max)) + { + type.set(instance, floatProxy); + } + } + else + { + ImGui::Text("ERR"); + } + } + } + + void DrawWidget(entt::meta_data& dataType, entt::meta_any& instance) + { + entt::id_type dataId = dataType.type().id(); + if (WidgetTypeDrawers.contains(dataId)) + { + auto& drawerFn = WidgetTypeDrawers[dataId]; + drawerFn(dataType, instance); + } + else + { + ImGui::Text("ERR"); + } + } + + template + void RegisterTypeDrawer(O* o) + { + WidgetTypeDrawers[entt::type_id().hash()] = std::bind(Func, o, std::placeholders::_1, std::placeholders::_2); + } + + private: + std::unordered_map WidgetTypeDrawers; + }; +} \ No newline at end of file From 729ae9050dc30602e27a48870606c94dffff4907 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 2 Apr 2025 16:26:33 -0400 Subject: [PATCH 2/6] Moved game state into its own header --- Nuake/Source/Engine.h | 9 +-------- Nuake/Source/Nuake/Core/GameState.h | 12 ++++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 Nuake/Source/Nuake/Core/GameState.h diff --git a/Nuake/Source/Engine.h b/Nuake/Source/Engine.h index 92d66012..408cece4 100644 --- a/Nuake/Source/Engine.h +++ b/Nuake/Source/Engine.h @@ -1,6 +1,7 @@ #pragma once #include "Nuake/Core/Core.h" +#include "Nuake/Core/GameState.h" #include "Nuake/Core/Logger.h" #include "Nuake/Window.h" #include "Nuake/Core/MulticastDelegate.h" @@ -13,14 +14,6 @@ namespace Nuake class EngineSubsystem; class EngineSubsystemScriptable; - enum GameState - { - Loading, - Playing, - Paused, - Stopped - }; - class Engine { public: diff --git a/Nuake/Source/Nuake/Core/GameState.h b/Nuake/Source/Nuake/Core/GameState.h new file mode 100644 index 00000000..fabd057f --- /dev/null +++ b/Nuake/Source/Nuake/Core/GameState.h @@ -0,0 +1,12 @@ +#pragma once + +namespace Nuake +{ + enum GameState + { + Loading, + Playing, + Paused, + Stopped + }; +} \ No newline at end of file From ef70a04da96732c4f9a44cfa9bba682f5cd76662 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 2 Apr 2025 16:27:06 -0400 Subject: [PATCH 3/6] Added basic events for modules to register to OnUpdate, OnFixedUpdate, OnSceneLoad, OnGameStateChanged --- .../Modules/ExampleModule/ExampleModule.cpp | 19 +++++++++++++++---- Nuake/Source/Nuake/Modules/ModuleDB.h | 10 ++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp b/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp index 79609f1b..b7d7c748 100644 --- a/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp +++ b/Nuake/Source/Nuake/Modules/ExampleModule/ExampleModule.cpp @@ -71,17 +71,30 @@ void ExampleModule_Startup() TestClass::InternalInitializeClass(); + // Register the module & info auto& module = ModuleDB::Get().RegisterModule(); module.instance = module.Resolve().construct(); - module.Description = "This is an example module"; + // This is to expose parameters in the modules settings module.RegisterSetting<&mySetting>("mySetting"); // This is to expose functions to the rest of the engine module.BindFunction("ExampleFunction"); module.BindFunction("ExampleModuleLog", "hi"); - //module.Invoke("ExampleModuleLog", "Hello World"); + + // The module can hook to certain events + module.OnUpdate.AddStatic([](float ts) + { + + }); + + module.OnFixedUpdate.AddStatic([](float ts) + { + + }); + + entt::id_type typeId = entt::hashed_string(TestClass::ClassName().c_str()); entt::meta_type metaType = entt::resolve(typeId); @@ -157,8 +170,6 @@ void ExampleModule_Startup() //Logger::Log("Serialized original component: " + jsonDataOG.dump(4), "ExampleModule", VERBOSE); } - - void ExampleModule_Shutdown() { diff --git a/Nuake/Source/Nuake/Modules/ModuleDB.h b/Nuake/Source/Nuake/Modules/ModuleDB.h index 16a7210a..c51a0941 100644 --- a/Nuake/Source/Nuake/Modules/ModuleDB.h +++ b/Nuake/Source/Nuake/Modules/ModuleDB.h @@ -4,11 +4,14 @@ #include #include +#include "Nuake/Core/Logger.h" +#include "Nuake/Core/GameState.h" +#include "Nuake/Core/MulticastDelegate.h" #include "Nuake/Core/Object/Object.h" +#include "Nuake/Scene/Scene.h" #include -#include "Nuake/Core/Logger.h" class ModuleInstance { public: @@ -21,7 +24,10 @@ public: return entt::resolve(entt::hashed_string(Name.c_str())); } - + MulticastDelegate> OnSceneLoad; + MulticastDelegate OnUpdate; + MulticastDelegate OnFixedUpdate; + MulticastDelegate OnGameStateChanged; }; class Class From fff6997dd4c9e413641bebc0a9b0197ea5eb498a Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 2 Apr 2025 16:49:28 -0400 Subject: [PATCH 4/6] Nowcalling module events --- Nuake/Source/Engine.cpp | 10 ++++++---- Nuake/Source/Nuake/Modules/Modules.cpp | 17 +++++++++++++++++ Nuake/Source/Nuake/Modules/Modules.h | 2 ++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Nuake/Source/Engine.cpp b/Nuake/Source/Engine.cpp index 2f9304bf..a2edf5e4 100644 --- a/Nuake/Source/Engine.cpp +++ b/Nuake/Source/Engine.cpp @@ -5,7 +5,6 @@ #include "Nuake/Physics/PhysicsManager.h" #include "Nuake/AI/NavManager.h" -#include "Nuake/Audio/AudioManager.h" #include "Nuake/FileSystem/FileSystem.h" #include "Nuake/Core/Input.h" #include "Nuake/Rendering/Renderer.h" @@ -54,7 +53,6 @@ namespace Nuake ScriptingEngineNet::Get().OnGameAssemblyLoaded().AddStatic(&Engine::OnScriptingEngineGameAssemblyLoaded); - AudioManager::Get().Initialize(); PhysicsManager::Get().Init(); NavManager::Get().Initialize(); @@ -151,13 +149,17 @@ namespace Nuake // Fixed update while (fixedUpdateDifference >= fixedUpdateRate) { - currentWindow->FixedUpdate(fixedUpdateRate * timeScale); + const float scaledFixedTimestep = fixedUpdateRate * timeScale; + currentWindow->FixedUpdate(scaledFixedTimestep); + + Modules::FixedUpdate(scaledFixedTimestep); fixedUpdateDifference -= fixedUpdateRate; } + Modules::Update(scaledTimeStep); + Input::Update(); - AudioManager::Get().AudioUpdate(); } } diff --git a/Nuake/Source/Nuake/Modules/Modules.cpp b/Nuake/Source/Nuake/Modules/Modules.cpp index fddd2ed9..4d836f74 100644 --- a/Nuake/Source/Nuake/Modules/Modules.cpp +++ b/Nuake/Source/Nuake/Modules/Modules.cpp @@ -4,6 +4,7 @@ #include "AssimpModule/AssimpModule.h" #include "AudioModule/AudioModule.h" #include "ExampleModule/ExampleModule.h" +#include "ModuleDB.h" #include "Nuake/UI/WidgetDrawer.h" @@ -56,6 +57,22 @@ void DrawBoolWidget(entt::meta_type& type, entt::meta_any& instance) } +void Nuake::Modules::FixedUpdate(float ts) +{ + for (auto& moduleName : ModuleDB::Get().GetModules()) + { + ModuleDB::Get().GetBaseImpl(moduleName).OnFixedUpdate.Broadcast(ts); + } +} + +void Nuake::Modules::Update(float ts) +{ + for (auto& moduleName : ModuleDB::Get().GetModules()) + { + ModuleDB::Get().GetBaseImpl(moduleName).OnUpdate.Broadcast(ts); + } +} + void Nuake::Modules::StartupModules() { auto& drawer = WidgetDrawer::Get(); diff --git a/Nuake/Source/Nuake/Modules/Modules.h b/Nuake/Source/Nuake/Modules/Modules.h index 20ed9e09..825c12e1 100644 --- a/Nuake/Source/Nuake/Modules/Modules.h +++ b/Nuake/Source/Nuake/Modules/Modules.h @@ -12,6 +12,8 @@ namespace Nuake public: static void StartupModules(); + static void FixedUpdate(float ts); + static void Update(float ts); static void ShutdownModules(); }; } \ No newline at end of file From 2876ee701b1facf3756b1406bac773f5c12ba83b Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 2 Apr 2025 16:49:53 -0400 Subject: [PATCH 5/6] Removed audio from core engine and moved to module only --- .../Source/Editor/Windows/EditorInterface.cpp | 1 - Nuake/Source/Nuake/Core/MulticastDelegate.h | 2 +- .../Nuake/Modules/AudioModule/AudioModule.cpp | 36 ++---- Nuake/Source/Nuake/Scene/Scene.cpp | 2 - .../Nuake/Scene/Systems/AudioSystem.cpp | 113 ------------------ .../Source/Nuake/Scene/Systems/AudioSystem.h | 20 ---- 6 files changed, 8 insertions(+), 166 deletions(-) delete mode 100644 Nuake/Source/Nuake/Scene/Systems/AudioSystem.cpp delete mode 100644 Nuake/Source/Nuake/Scene/Systems/AudioSystem.h diff --git a/Editor/Source/Editor/Windows/EditorInterface.cpp b/Editor/Source/Editor/Windows/EditorInterface.cpp index 5a573e35..b10531d9 100644 --- a/Editor/Source/Editor/Windows/EditorInterface.cpp +++ b/Editor/Source/Editor/Windows/EditorInterface.cpp @@ -42,7 +42,6 @@ #include "Nuake/Rendering/SceneRenderer.h" #include #include "UIDemoWindow.h" -#include #include #include "Nuake/FileSystem/FileSystem.h" diff --git a/Nuake/Source/Nuake/Core/MulticastDelegate.h b/Nuake/Source/Nuake/Core/MulticastDelegate.h index ac5349e2..ea28a591 100644 --- a/Nuake/Source/Nuake/Core/MulticastDelegate.h +++ b/Nuake/Source/Nuake/Core/MulticastDelegate.h @@ -63,7 +63,7 @@ public: // Remove a callable using the token returned by Add() void Remove(DelegateHandle& handle) { - ASSERT(handle.IsValid()); + //assert(handle.IsValid()); if (handle.IsValid() && handle.id < delegates.size()) { diff --git a/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp b/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp index 2afe3445..6d0b6e3d 100644 --- a/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp +++ b/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp @@ -5,6 +5,8 @@ #include "Nuake/Modules/ModuleDB.h" #include +#include "Nuake/Audio/AudioManager.h" + void PlayAudio(int id, Nuake::Matrix4 volume) { @@ -42,37 +44,13 @@ void AudioModule_Startup() module.BindFunction("PlayAudio", "id", "volume"); module.BindFunction("StopAudio"); - Logger::Log("AudioModule exposed API:", "Module", VERBOSE); - - auto reflection = module.Resolve(); - auto metaTypeid = entt::hashed_string(module.Name.c_str()); - auto s = reflection.func(metaTypeid); - for (auto [id, func] : reflection.func()) - { - const std::string_view returnType = func.ret().info().name(); - const std::string_view funcName = module.GetTypeName(id); - - std::string msg = std::string(returnType) + " " + std::string(funcName) + "("; - auto argNames = module.GetFuncArgNames(id); - std::vector args; - for (int i = 0; i < func.arity(); i++) - { - const std::string argType = std::string(func.arg(i).info().name()); - args.push_back(argType); - - msg += argType + " " + argNames[i]; - - if (i < func.arity() - 1) - { - msg += ", "; - } - } - msg += ")"; - - Logger::Log(msg, "", VERBOSE); - } + AudioManager::Get().Initialize(); SceneSystemDB::Get().RegisterSceneSystem(); + + module.OnUpdate.AddStatic([](float ts) { + AudioManager::Get().AudioUpdate(); + }); } void AudioModule_Shutdown() diff --git a/Nuake/Source/Nuake/Scene/Scene.cpp b/Nuake/Source/Nuake/Scene/Scene.cpp index bdb74ed6..0e2bb62f 100644 --- a/Nuake/Source/Nuake/Scene/Scene.cpp +++ b/Nuake/Source/Nuake/Scene/Scene.cpp @@ -14,7 +14,6 @@ #include "Nuake/Scene/Systems/QuakeMapBuilder.h" #include "Nuake/Scene/Systems/ParticleSystem.h" #include "Nuake/Scene/Systems/AnimationSystem.h" -#include "Nuake/Scene/Systems/AudioSystem.h" #include "Nuake/Scene/Systems/UISystem.h" #include "Nuake/Rendering/SceneRenderer.h" @@ -74,7 +73,6 @@ namespace Nuake m_Systems.push_back(CreateRef(this)); m_Systems.push_back(CreateRef(this)); m_Systems.push_back(CreateRef(this)); - //m_Systems.push_back(CreateRef(this)); m_SceneRenderer = CreateRef(); m_SceneRenderer->Init(); diff --git a/Nuake/Source/Nuake/Scene/Systems/AudioSystem.cpp b/Nuake/Source/Nuake/Scene/Systems/AudioSystem.cpp deleted file mode 100644 index d8b687db..00000000 --- a/Nuake/Source/Nuake/Scene/Systems/AudioSystem.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "AudioSystem.h" - -#include "Engine.h" -#include "Nuake/Scene/Scene.h" -#include "Nuake/Scene/Entities/Entity.h" -#include "Nuake/Scene/Components/AudioEmitterComponent.h" -#include "Nuake/FileSystem/File.h" -#include "Nuake/Audio/AudioManager.h" - -#include - -namespace Nuake -{ - AudioSystem::AudioSystem(Scene* scene) - { - m_Scene = scene; - } - - bool AudioSystem::Init() - { - AudioManager::Get().StopAll(); - - return true; - } - - void AudioSystem::Update(Timestep ts) - { - auto& audioManager = AudioManager::Get(); - - // Update 3D listener of the audio system - auto currentCamera = m_Scene->GetCurrentCamera(); - - Vector3 direction = currentCamera->GetDirection(); - Vector3 position = currentCamera->GetTranslation(); - if (!Engine::IsPlayMode()) - { - direction.x *= -1.0f; - direction.z *= -1.0f; - } - - audioManager.SetListenerPosition(position, std::move(direction), currentCamera->GetUp()); - - auto view = m_Scene->m_Registry.view(); - for (auto& e : view) - { - auto [transformComponent, audioEmitterComponent] = view.get(e); - - if (audioEmitterComponent.FilePath.file == nullptr || !audioEmitterComponent.FilePath.file->Exist()) - { - // Doesn't have a file - continue; - } - - const bool isPlaying = audioEmitterComponent.IsPlaying; - const std::string absoluteFilePath = audioEmitterComponent.FilePath.file->GetAbsolutePath(); - const bool isVoiceActive = audioManager.IsVoiceActive(absoluteFilePath); - - AudioRequest audioRequest; - audioRequest.audioFile = absoluteFilePath; - audioRequest.pan = audioEmitterComponent.Pan; - audioRequest.volume = audioEmitterComponent.Volume; - audioRequest.speed = audioEmitterComponent.PlaybackSpeed; - audioRequest.spatialized = audioEmitterComponent.Spatialized; - audioRequest.Loop = audioEmitterComponent.Loop; - audioRequest.position = transformComponent.GetGlobalTransform()[3]; - audioRequest.MinDistance = audioEmitterComponent.MinDistance; - audioRequest.MaxDistance = audioEmitterComponent.MaxDistance; - audioRequest.AttenuationFactor = audioEmitterComponent.AttenuationFactor; - - if (isVoiceActive) - { - if (!isPlaying && audioEmitterComponent.Loop) - { - audioManager.StopVoice(absoluteFilePath); // Stop audio - } - else - { - // Update the active voice with new params - audioManager.UpdateVoice(audioRequest); - } - } - - if (isPlaying) - { - // Reset the play status to false since the audio has been fired - if (!audioEmitterComponent.Loop) - { - audioManager.QueueWavAudio(std::move(audioRequest)); - audioEmitterComponent.IsPlaying = false; - } - else if (!isVoiceActive) - { - audioManager.QueueWavAudio(std::move(audioRequest)); - } - } - } - } - - void AudioSystem::FixedUpdate(Timestep ts) - { - - } - - void AudioSystem::EditorUpdate() - { - - } - - void AudioSystem::Exit() - { - AudioManager::Get().StopAll(); - } -} diff --git a/Nuake/Source/Nuake/Scene/Systems/AudioSystem.h b/Nuake/Source/Nuake/Scene/Systems/AudioSystem.h deleted file mode 100644 index b5c9393e..00000000 --- a/Nuake/Source/Nuake/Scene/Systems/AudioSystem.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include "Nuake/Scene/Systems/System.h" - -namespace Nuake -{ - class AudioSystem : public System - { - private: - std::unordered_map m_StatusCache; - - public: - AudioSystem(Scene* scene); - bool Init() override; - void Update(Timestep ts) override; - void Draw() override {} - void EditorUpdate() override; - void FixedUpdate(Timestep ts) override; - void Exit() override; - }; -} From 06c6aab24ef4ddfe6981ad69ebbf3857d3fa55f2 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Wed, 2 Apr 2025 16:57:07 -0400 Subject: [PATCH 6/6] Now using module param volume --- Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp b/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp index 6d0b6e3d..ff8405cf 100644 --- a/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp +++ b/Nuake/Source/Nuake/Modules/AudioModule/AudioModule.cpp @@ -36,7 +36,7 @@ void AudioModule_Startup() auto& module = ModuleDB::Get().RegisterModule(); module.Name = "AudioModule"; - module.Description = "Core audio module."; + module.Description = "Core audio module"; module.RegisterSetting<&Volume>("Volume"); module.RegisterSetting<&Muted>("Muted"); @@ -48,8 +48,12 @@ void AudioModule_Startup() SceneSystemDB::Get().RegisterSceneSystem(); - module.OnUpdate.AddStatic([](float ts) { - AudioManager::Get().AudioUpdate(); + module.OnUpdate.AddStatic([](float ts) + { + auto& audioMgr = AudioManager::Get(); + audioMgr.SetGlobalVolume(Volume); + + audioMgr.AudioUpdate(); }); }