Implement comprehensive audio control panel with tabbed settings interface

Adds complete audio volume controls for all 11 audio systems with master volume. Reorganizes settings window into Video, Audio, and Gameplay tabs for better UX.

Audio Features:
- Master volume control affecting all audio systems
- Individual volume sliders for: Music, Ambient, UI, Combat, Spell, Movement, Footsteps, NPC Voices, Mounts, Activity sounds
- Real-time volume adjustment with master volume multiplier
- Restore defaults button per tab

Technical Changes:
- Added getVolumeScale() getters to all audio managers
- Integrated all 10 audio managers into renderer (UI, Combat, Spell, Movement added)
- Expanded game_screen.hpp with 11 pending volume variables
- Reorganized settings window using ImGui tab bars (Video/Audio/Gameplay)
- Audio settings uses scrollable child window for 11 volume controls
- Settings window expanded to 520x720px to accommodate comprehensive controls
This commit is contained in:
Kelsi 2026-02-09 17:07:22 -08:00
parent 1e23370c0e
commit 9741c8ee7c
12 changed files with 295 additions and 98 deletions

View file

@ -82,6 +82,7 @@ public:
// Volume control
void setVolumeScale(float scale);
float getVolumeScale() const { return volumeScale_; }
private:
struct AmbientEmitter {

View file

@ -23,6 +23,7 @@ public:
// Volume control
void setVolumeScale(float scale);
float getVolumeScale() const { return volumeScale_; }
// Weapon swing sounds (whoosh sounds before impact)
enum class WeaponSize {

View file

@ -42,6 +42,7 @@ public:
bool isMounted() const { return mounted_; }
void setVolumeScale(float scale) { volumeScale_ = scale; }
float getVolumeScale() const { return volumeScale_; }
private:
MountType detectMountType(uint32_t creatureDisplayId) const;

View file

@ -23,6 +23,7 @@ public:
// Volume control
void setVolumeScale(float scale);
float getVolumeScale() const { return volumeScale_; }
// Character size (for water splash intensity)
enum class CharacterSize {

View file

@ -23,6 +23,7 @@ public:
// Volume control
void setVolumeScale(float scale);
float getVolumeScale() const { return volumeScale_; }
// Magic school types
enum class MagicSchool {

View file

@ -12,10 +12,10 @@ class AssetManager;
namespace audio {
class UISoundManager {
class UiSoundManager {
public:
UISoundManager() = default;
~UISoundManager() = default;
UiSoundManager() = default;
~UiSoundManager() = default;
// Initialization
bool initialize(pipeline::AssetManager* assets);
@ -23,6 +23,7 @@ public:
// Volume control
void setVolumeScale(float scale);
float getVolumeScale() const { return volumeScale_; }
// Window sounds
void playBagOpen();

View file

@ -8,7 +8,7 @@
namespace wowee {
namespace core { class Window; }
namespace game { class World; class ZoneManager; }
namespace audio { class MusicManager; class FootstepManager; class ActivitySoundManager; class MountSoundManager; class NpcVoiceManager; class AmbientSoundManager; enum class FootstepSurface : uint8_t; enum class VoiceType; }
namespace audio { class MusicManager; class FootstepManager; class ActivitySoundManager; class MountSoundManager; class NpcVoiceManager; class AmbientSoundManager; class UiSoundManager; class CombatSoundManager; class SpellSoundManager; class MovementSoundManager; enum class FootstepSurface : uint8_t; enum class VoiceType; }
namespace pipeline { class AssetManager; }
namespace rendering {
@ -151,6 +151,10 @@ public:
audio::MountSoundManager* getMountSoundManager() { return mountSoundManager.get(); }
audio::NpcVoiceManager* getNpcVoiceManager() { return npcVoiceManager.get(); }
audio::AmbientSoundManager* getAmbientSoundManager() { return ambientSoundManager.get(); }
audio::UiSoundManager* getUiSoundManager() { return uiSoundManager.get(); }
audio::CombatSoundManager* getCombatSoundManager() { return combatSoundManager.get(); }
audio::SpellSoundManager* getSpellSoundManager() { return spellSoundManager.get(); }
audio::MovementSoundManager* getMovementSoundManager() { return movementSoundManager.get(); }
private:
core::Window* window = nullptr;
@ -179,6 +183,10 @@ private:
std::unique_ptr<audio::MountSoundManager> mountSoundManager;
std::unique_ptr<audio::NpcVoiceManager> npcVoiceManager;
std::unique_ptr<audio::AmbientSoundManager> ambientSoundManager;
std::unique_ptr<audio::UiSoundManager> uiSoundManager;
std::unique_ptr<audio::CombatSoundManager> combatSoundManager;
std::unique_ptr<audio::SpellSoundManager> spellSoundManager;
std::unique_ptr<audio::MovementSoundManager> movementSoundManager;
std::unique_ptr<game::ZoneManager> zoneManager;
std::unique_ptr<Shader> underwaterOverlayShader;
uint32_t underwaterOverlayVAO = 0;

View file

@ -65,8 +65,17 @@ private:
bool pendingVsync = false;
int pendingResIndex = 0;
bool pendingShadows = false;
int pendingMasterVolume = 100;
int pendingMusicVolume = 30;
int pendingSfxVolume = 100;
int pendingAmbientVolume = 100;
int pendingUiVolume = 100;
int pendingCombatVolume = 100;
int pendingSpellVolume = 100;
int pendingMovementVolume = 100;
int pendingFootstepVolume = 100;
int pendingNpcVoiceVolume = 100;
int pendingMountVolume = 100;
int pendingActivityVolume = 100;
float pendingMouseSensitivity = 0.2f;
bool pendingInvertMouse = false;
int pendingUiOpacity = 65;