diff --git a/Editor/src/ComponentsPanel/QuakeMapPanel.h b/Editor/src/ComponentsPanel/QuakeMapPanel.h index 7269ba76..48be8510 100644 --- a/Editor/src/ComponentsPanel/QuakeMapPanel.h +++ b/Editor/src/ComponentsPanel/QuakeMapPanel.h @@ -4,6 +4,7 @@ #include "src/Scene/Systems/QuakeMapBuilder.h" #include + class QuakeMapPanel : ComponentPanel { public: diff --git a/Editor/src/Windows/EditorSelectionPanel.cpp b/Editor/src/Windows/EditorSelectionPanel.cpp index af20949f..208c393a 100644 --- a/Editor/src/Windows/EditorSelectionPanel.cpp +++ b/Editor/src/Windows/EditorSelectionPanel.cpp @@ -118,9 +118,10 @@ void EditorSelectionPanel::DrawEntity(Nuake::Entity entity) void EditorSelectionPanel::DrawAddComponentMenu(Nuake::Entity entity) { - if (entity.HasComponent()) + using namespace Nuake; + if (entity.HasComponent()) { - auto& entityName = entity.GetComponent().Name; + auto& entityName = entity.GetComponent().Name; ImGuiTextSTD("##Name", entityName); ImGui::SameLine(); @@ -129,27 +130,27 @@ void EditorSelectionPanel::DrawAddComponentMenu(Nuake::Entity entity) if (ImGui::BeginPopup("ComponentPopup")) { - MenuItemComponent("Wren Script", Nuake::WrenScriptComponent) - MenuItemComponent("Camera", Nuake::CameraComponent) - MenuItemComponent("Light", Nuake::LightComponent) + MenuItemComponent("Wren Script", WrenScriptComponent); + MenuItemComponent("Camera", CameraComponent); + MenuItemComponent("Light", LightComponent); ImGui::Separator(); - MenuItemComponent("Model", Nuake::ModelComponent) - MenuItemComponent("Skinned Model", Nuake::SkinnedModelComponent) - MenuItemComponent("Bone", Nuake::BoneComponent) + MenuItemComponent("Model", ModelComponent); + MenuItemComponent("Skinned Model", SkinnedModelComponent); + MenuItemComponent("Bone", BoneComponent) ImGui::Separator(); - MenuItemComponent("Sprite", Nuake::SpriteComponent) - MenuItemComponent("Particle Emitter", Nuake::ParticleEmitterComponent) + MenuItemComponent("Sprite", SpriteComponent) + MenuItemComponent("Particle Emitter", ParticleEmitterComponent) ImGui::Separator(); - MenuItemComponent("Character Controller", Nuake::CharacterControllerComponent) - MenuItemComponent("Rigid body", Nuake::RigidBodyComponent) + MenuItemComponent("Character Controller", CharacterControllerComponent) + MenuItemComponent("Rigid body", RigidBodyComponent) ImGui::Separator(); - MenuItemComponent("Box collider", Nuake::BoxColliderComponent) - MenuItemComponent("Capsule collider", Nuake::CapsuleColliderComponent) - MenuItemComponent("Cylinder collider", Nuake::CylinderColliderComponent) - MenuItemComponent("Sphere collider", Nuake::SphereColliderComponent) - MenuItemComponent("Mesh collider", Nuake::MeshColliderComponent) + MenuItemComponent("Box collider", BoxColliderComponent) + MenuItemComponent("Capsule collider", CapsuleColliderComponent) + MenuItemComponent("Cylinder collider", CylinderColliderComponent) + MenuItemComponent("Sphere collider", SphereColliderComponent) + MenuItemComponent("Mesh collider", MeshColliderComponent) ImGui::Separator(); - MenuItemComponent("Quake map", Nuake::QuakeMapComponent) + MenuItemComponent("Quake map", QuakeMapComponent) ImGui::EndPopup(); } ImGui::Separator(); diff --git a/Nuake/src/Audio/AudioManager.cpp b/Nuake/src/Audio/AudioManager.cpp index d8672ea6..01a28a35 100644 --- a/Nuake/src/Audio/AudioManager.cpp +++ b/Nuake/src/Audio/AudioManager.cpp @@ -1,32 +1,43 @@ #include "AudioManager.h" +#include "src/Core/Logger.h" +#include "src/Core/FileSystem.h" #include #include "soloud_speech.h" #include "soloud_thread.h" +#include -namespace Nuake -{ - void AudioManager::Initialize() + +namespace Nuake { + + AudioManager::AudioManager() : + m_AudioThreadRunning(true) { - _soloud = CreateRef(); - _soloud->init(); - - _audioThreadRunning = false; - _audioThread = std::thread(&AudioManager::AudioThreadLoop, this); } AudioManager::~AudioManager() { Deinitialize(); - _audioThreadRunning = false; - _audioThread.join(); + m_AudioThreadRunning = false; + m_AudioThread.join(); } + void AudioManager::Initialize() + { + m_Soloud = CreateRef(); + + // TODO: Sample rate, back end, buffer size, flags. + m_Soloud->init(); + + m_AudioThread = std::thread(&AudioManager::AudioThreadLoop, this); + + Logger::Log("Audio manager initialized", "audio", VERBOSE); + } void AudioManager::Deinitialize() { - _soloud->deinit(); + m_Soloud->deinit(); } void AudioManager::PlayTTS(const std::string& text) @@ -34,11 +45,51 @@ namespace Nuake } + void AudioManager::QueueWavAudio(const std::string& filePath) + { + // Acquire mutex lock and push to queue + const std::lock_guard lock(m_AudioQueueMutex); + + // Check if file exists and load + const bool fileExists = FileSystem::FileExists(filePath, true); + if (fileExists && !IsWavLoaded(filePath)) + { + LoadWavAudio(filePath); + } + + m_AudioQueue.push({ filePath }); + } + + bool AudioManager::IsWavLoaded(const std::string& filePath) const + { + return m_WavSamples.find(filePath) != m_WavSamples.end(); + } + + void AudioManager::LoadWavAudio(const std::string& filePath) + { + m_WavSamples[filePath] = SoLoud::Wav(); + m_WavSamples[filePath].load(filePath.c_str()); + } + void AudioManager::AudioThreadLoop() { - while(_audioThreadRunning) + while(m_AudioThreadRunning) { - + // Acquire mutex lock + const std::lock_guard lock(m_AudioQueueMutex); + + // Check if we have audio queued + while (!m_AudioQueue.empty()) + { + auto& first = m_AudioQueue.front(); + const std::string& audioFilePath = first.audioFile; + + // If file exists, play it + m_Soloud->play(*&m_WavSamples[audioFilePath]); + + // Remove item from queue. + m_AudioQueue.pop(); + } } } } \ No newline at end of file diff --git a/Nuake/src/Audio/AudioManager.h b/Nuake/src/Audio/AudioManager.h index a60ab612..d2f0fc16 100644 --- a/Nuake/src/Audio/AudioManager.h +++ b/Nuake/src/Audio/AudioManager.h @@ -10,21 +10,36 @@ namespace SoLoud class AudioSource; } +// Temp code +struct audioQueueRequest +{ + std::string audioFile; +}; + +namespace SoLoud +{ + class Wav; +} + namespace Nuake { // This is a singleton that manages everything for audio. class AudioManager { private: - Ref _soloud; - - bool _audioThreadRunning; - std::thread _audioThread; - std::mutex _audioMutex; - const int MAX_VOICE_COUNT = 32; + + Ref m_Soloud; + + bool m_AudioThreadRunning; + std::thread m_AudioThread; + std::mutex m_AudioQueueMutex; + std::atomic m_AudioQueued = { false }; + std::queue m_AudioQueue; + + std::unordered_map m_WavSamples; public: - AudioManager() = default; + AudioManager(); ~AudioManager(); static AudioManager& Get() @@ -42,6 +57,9 @@ namespace Nuake void PlayTTS(const std::string& text); + void QueueWavAudio(const std::string& filePath); + bool IsWavLoaded(const std::string& filePath) const; + void LoadWavAudio(const std::string& filePath); private: void AudioThreadLoop(); }; diff --git a/Nuake/src/Core/Core.h b/Nuake/src/Core/Core.h index 9b73304f..816c6a6d 100644 --- a/Nuake/src/Core/Core.h +++ b/Nuake/src/Core/Core.h @@ -4,6 +4,7 @@ #include #include #include +#include #define ASSERT(x) if (!(x)) assert(false)