feat(editor): zone audio configuration panel

- Zone manifest gains audio fields: musicTrack, ambienceDay,
  ambienceNight, musicVolume, ambienceVolume
- Serialized to/from zone.json under "audio" key
- Info panel: collapsable "Zone Audio" section with text inputs for
  music/ambience paths and volume sliders
- Preset selector: Elwynn Forest, Durotar, Darkshore, Dungeon, None
- ZoneManifest stored persistently on EditorApp so audio settings
  survive between exports (was recreated each save)
- Custom zones can now specify their own background music and ambient
  soundscapes via zone.json
This commit is contained in:
Kelsi 2026-05-05 15:48:49 -07:00
parent 36dc9ddef7
commit 2136727c68
5 changed files with 76 additions and 1 deletions

View file

@ -2473,6 +2473,51 @@ void EditorUI::renderPropertiesPanel(EditorApp& app) {
ImGui::Text("Height: %.0f-%.0f (avg %.0f)", minH, maxH, sumH / count);
}
// Zone audio configuration
if (app.hasTerrainLoaded() && ImGui::CollapsingHeader("Zone Audio")) {
auto& manifest = app.getZoneManifest();
static char musicBuf[256] = {};
static char ambDayBuf[256] = {};
static char ambNightBuf[256] = {};
std::strncpy(musicBuf, manifest.musicTrack.c_str(), sizeof(musicBuf) - 1);
std::strncpy(ambDayBuf, manifest.ambienceDay.c_str(), sizeof(ambDayBuf) - 1);
std::strncpy(ambNightBuf, manifest.ambienceNight.c_str(), sizeof(ambNightBuf) - 1);
if (ImGui::InputText("Music##audio", musicBuf, sizeof(musicBuf)))
manifest.musicTrack = musicBuf;
if (ImGui::InputText("Ambience (Day)##audio", ambDayBuf, sizeof(ambDayBuf)))
manifest.ambienceDay = ambDayBuf;
if (ImGui::InputText("Ambience (Night)##audio", ambNightBuf, sizeof(ambNightBuf)))
manifest.ambienceNight = ambNightBuf;
ImGui::SliderFloat("Music Vol", &manifest.musicVolume, 0.0f, 1.0f, "%.2f");
ImGui::SliderFloat("Ambience Vol", &manifest.ambienceVolume, 0.0f, 1.0f, "%.2f");
if (ImGui::BeginCombo("Presets##audioPreset", "Select...")) {
if (ImGui::Selectable("Elwynn Forest")) {
manifest.musicTrack = "Sound\\Music\\ZoneMusic\\Forest\\ForestDay.mp3";
manifest.ambienceDay = "Sound\\Ambience\\GlueScreenAmbience.wav";
}
if (ImGui::Selectable("Durotar")) {
manifest.musicTrack = "Sound\\Music\\ZoneMusic\\Barrens\\BarrensDay.mp3";
manifest.ambienceDay = "Sound\\Ambience\\GlueScreenAmbience.wav";
}
if (ImGui::Selectable("Darkshore")) {
manifest.musicTrack = "Sound\\Music\\ZoneMusic\\Darkshore\\DarkshoreDay.mp3";
manifest.ambienceDay = "Sound\\Ambience\\GlueScreenAmbience.wav";
}
if (ImGui::Selectable("Dungeon")) {
manifest.musicTrack = "Sound\\Music\\ZoneMusic\\Dungeon\\DungeonAmbience.mp3";
manifest.ambienceDay = "";
}
if (ImGui::Selectable("None (silent)")) {
manifest.musicTrack = "";
manifest.ambienceDay = "";
manifest.ambienceNight = "";
}
ImGui::EndCombo();
}
}
if (app.getTerrainEditor().hasUnsavedChanges())
ImGui::TextColored(ImVec4(1, 0.8f, 0.3f, 1), "* Unsaved (Ctrl+S to save)");
else