From 3eded6772d5b52365282c07b0606a06ebe8648ad Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 19:00:42 -0700 Subject: [PATCH] Implement bird/cricket ambient sounds and remove stale renderer TODO - Add birdSounds_ and cricketSounds_ AmbientSample vectors to AmbientSoundManager, loaded from WoW MPQ paths: BirdAmbience/BirdChirp01-06.wav (up to 6 variants, daytime) and Insect/InsectMorning.wav + InsectNight.wav (nighttime). Missing files are silently skipped so the game runs without an MPQ too. - updatePeriodicSounds() now plays a randomly chosen loaded variant at the scheduled interval instead of the previous no-op placeholder. - Remove stale "TODO Phase 6: Vulkan underwater overlay" comment from Renderer::initialize(); the feature has been fully implemented in renderOverlay() / the swim effects pipeline since that comment was written. --- include/audio/ambient_sound_manager.hpp | 2 ++ src/audio/ambient_sound_manager.cpp | 44 ++++++++++++++++++++++--- src/rendering/renderer.cpp | 3 -- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/include/audio/ambient_sound_manager.hpp b/include/audio/ambient_sound_manager.hpp index 8a14d200..b73bafa1 100644 --- a/include/audio/ambient_sound_manager.hpp +++ b/include/audio/ambient_sound_manager.hpp @@ -114,6 +114,8 @@ private: std::vector windSounds_; std::vector tavernSounds_; std::vector blacksmithSounds_; + std::vector birdSounds_; + std::vector cricketSounds_; // Weather sound libraries std::vector rainLightSounds_; diff --git a/src/audio/ambient_sound_manager.cpp b/src/audio/ambient_sound_manager.cpp index 473bf36a..22791fe8 100644 --- a/src/audio/ambient_sound_manager.cpp +++ b/src/audio/ambient_sound_manager.cpp @@ -83,6 +83,34 @@ bool AmbientSoundManager::initialize(pipeline::AssetManager* assets) { blacksmithSounds_.resize(1); bool blacksmithLoaded = loadSound("Sound\\Ambience\\WMOAmbience\\BlackSmith.wav", blacksmithSounds_[0], assets); + // Load bird chirp sounds (daytime periodic) — up to 6 variants + { + static const char* birdPaths[] = { + "Sound\\Ambience\\BirdAmbience\\BirdChirp01.wav", + "Sound\\Ambience\\BirdAmbience\\BirdChirp02.wav", + "Sound\\Ambience\\BirdAmbience\\BirdChirp03.wav", + "Sound\\Ambience\\BirdAmbience\\BirdChirp04.wav", + "Sound\\Ambience\\BirdAmbience\\BirdChirp05.wav", + "Sound\\Ambience\\BirdAmbience\\BirdChirp06.wav", + }; + for (const char* p : birdPaths) { + birdSounds_.emplace_back(); + if (!loadSound(p, birdSounds_.back(), assets)) birdSounds_.pop_back(); + } + } + + // Load cricket/insect sounds (nighttime periodic) + { + static const char* cricketPaths[] = { + "Sound\\Ambience\\Insect\\InsectMorning.wav", + "Sound\\Ambience\\Insect\\InsectNight.wav", + }; + for (const char* p : cricketPaths) { + cricketSounds_.emplace_back(); + if (!loadSound(p, cricketSounds_.back(), assets)) cricketSounds_.pop_back(); + } + } + // Load weather sounds rainLightSounds_.resize(1); bool rainLightLoaded = loadSound("Sound\\Ambience\\Weather\\RainLight.wav", rainLightSounds_[0], assets); @@ -413,9 +441,13 @@ void AmbientSoundManager::updatePeriodicSounds(float deltaTime, bool isIndoor, b if (isDaytime()) { birdTimer_ += deltaTime; if (birdTimer_ >= randomFloat(BIRD_MIN_INTERVAL, BIRD_MAX_INTERVAL)) { - // Play a random bird chirp (we'll use wind sound as placeholder for now) - // TODO: Add actual bird sound files when available birdTimer_ = 0.0f; + if (!birdSounds_.empty()) { + std::uniform_int_distribution pick(0, birdSounds_.size() - 1); + const auto& snd = birdSounds_[pick(gen)]; + if (snd.loaded) + AudioEngine::instance().playSound2D(snd.data, BIRD_VOLUME, 1.0f); + } } } @@ -423,9 +455,13 @@ void AmbientSoundManager::updatePeriodicSounds(float deltaTime, bool isIndoor, b if (isNighttime()) { cricketTimer_ += deltaTime; if (cricketTimer_ >= randomFloat(CRICKET_MIN_INTERVAL, CRICKET_MAX_INTERVAL)) { - // Play cricket sounds - // TODO: Add actual cricket sound files when available cricketTimer_ = 0.0f; + if (!cricketSounds_.empty()) { + std::uniform_int_distribution pick(0, cricketSounds_.size() - 1); + const auto& snd = cricketSounds_[pick(gen)]; + if (snd.loaded) + AudioEngine::instance().playSound2D(snd.data, CRICKET_VOLUME, 1.0f); + } } } } diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 86e997c4..0fd4beb9 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -730,9 +730,6 @@ bool Renderer::initialize(core::Window* win) { spellSoundManager = std::make_unique(); movementSoundManager = std::make_unique(); - // TODO Phase 6: Vulkan underwater overlay, post-process, and shadow map - // GL versions stubbed during migration - // Create secondary command buffer resources for multithreaded rendering if (!createSecondaryCommandResources()) { LOG_WARNING("Failed to create secondary command buffers — falling back to single-threaded rendering");