Files
WickedEngine/Editor/SoundWindow.cpp
T
2020-10-04 14:24:22 +02:00

218 lines
6.1 KiB
C++

#include "stdafx.h"
#include "SoundWindow.h"
#include "wiAudio.h"
#include "Editor.h"
#include <sstream>
using namespace std;
using namespace wiGraphics;
using namespace wiECS;
using namespace wiScene;
SoundWindow::SoundWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
{
assert(GUI && "Invalid GUI!");
soundWindow = new wiWindow(GUI, "Sound Window");
soundWindow->SetSize(XMFLOAT2(440, 200));
GUI->AddWidget(soundWindow);
float x = 20;
float y = 10;
float hei = 18;
float step = hei + 2;
reverbComboBox = new wiComboBox("Reverb: ");
reverbComboBox->SetPos(XMFLOAT2(x + 80, y += step));
reverbComboBox->SetSize(XMFLOAT2(180, hei));
reverbComboBox->OnSelect([&](wiEventArgs args) {
wiAudio::SetReverb((wiAudio::REVERB_PRESET)args.iValue);
});
reverbComboBox->AddItem("DEFAULT");
reverbComboBox->AddItem("GENERIC");
reverbComboBox->AddItem("FOREST");
reverbComboBox->AddItem("PADDEDCELL");
reverbComboBox->AddItem("ROOM");
reverbComboBox->AddItem("BATHROOM");
reverbComboBox->AddItem("LIVINGROOM");
reverbComboBox->AddItem("STONEROOM");
reverbComboBox->AddItem("AUDITORIUM");
reverbComboBox->AddItem("CONCERTHALL");
reverbComboBox->AddItem("CAVE");
reverbComboBox->AddItem("ARENA");
reverbComboBox->AddItem("HANGAR");
reverbComboBox->AddItem("CARPETEDHALLWAY");
reverbComboBox->AddItem("HALLWAY");
reverbComboBox->AddItem("STONECORRIDOR");
reverbComboBox->AddItem("ALLEY");
reverbComboBox->AddItem("CITY");
reverbComboBox->AddItem("MOUNTAINS");
reverbComboBox->AddItem("QUARRY");
reverbComboBox->AddItem("PLAIN");
reverbComboBox->AddItem("PARKINGLOT");
reverbComboBox->AddItem("SEWERPIPE");
reverbComboBox->AddItem("UNDERWATER");
reverbComboBox->AddItem("SMALLROOM");
reverbComboBox->AddItem("MEDIUMROOM");
reverbComboBox->AddItem("LARGEROOM");
reverbComboBox->AddItem("MEDIUMHALL");
reverbComboBox->AddItem("LARGEHALL");
reverbComboBox->AddItem("PLATE");
reverbComboBox->SetTooltip("Set the global reverb setting.");
soundWindow->AddWidget(reverbComboBox);
y += step;
addButton = new wiButton("Add Sound");
addButton->SetTooltip("Add a sound file to the scene.");
addButton->SetPos(XMFLOAT2(x, y += step));
addButton->SetSize(XMFLOAT2(80, hei));
addButton->OnClick([=](wiEventArgs args) {
wiHelper::FileDialogParams params;
params.type = wiHelper::FileDialogParams::OPEN;
params.description = "Sound";
params.extensions.push_back("wav");
wiHelper::FileDialog(params, [=](std::string fileName) {
wiEvent::Subscribe_Once(SYSTEM_EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) {
Entity entity = GetScene().Entity_CreateSound("editorSound", fileName);
editor->ClearSelected();
editor->AddSelected(entity);
SetEntity(entity);
});
});
});
soundWindow->AddWidget(addButton);
filenameLabel = new wiLabel("Filename");
filenameLabel->SetPos(XMFLOAT2(x, y += step));
filenameLabel->SetSize(XMFLOAT2(400, hei));
soundWindow->AddWidget(filenameLabel);
nameField = new wiTextInputField("SoundName");
nameField->SetTooltip("Enter a sound name to identify this entity...");
nameField->SetPos(XMFLOAT2(x, y += step));
nameField->SetSize(XMFLOAT2(300, hei));
nameField->OnInputAccepted([&](wiEventArgs args) {
NameComponent* name = wiScene::GetScene().names.GetComponent(entity);
if (name == nullptr)
{
name = &wiScene::GetScene().names.Create(entity);
}
*name = args.sValue;
});
soundWindow->AddWidget(nameField);
nameField->SetEnabled(false);
playstopButton = new wiButton("Play");
playstopButton->SetTooltip("Play/Stop selected sound instance.");
playstopButton->SetPos(XMFLOAT2(x, y += step));
playstopButton->SetSize(XMFLOAT2(80, hei));
playstopButton->OnClick([&](wiEventArgs args) {
SoundComponent* sound = GetScene().sounds.GetComponent(entity);
if (sound != nullptr)
{
if (sound->IsPlaying())
{
sound->Stop();
playstopButton->SetText("Play");
}
else
{
sound->Play();
playstopButton->SetText("Stop");
}
}
});
soundWindow->AddWidget(playstopButton);
playstopButton->SetEnabled(false);
loopedCheckbox = new wiCheckBox("Looped: ");
loopedCheckbox->SetTooltip("Enable looping for the selected sound instance.");
loopedCheckbox->SetPos(XMFLOAT2(x + 150, y));
loopedCheckbox->SetSize(XMFLOAT2(30, hei));
loopedCheckbox->OnClick([&](wiEventArgs args) {
SoundComponent* sound = GetScene().sounds.GetComponent(entity);
if (sound != nullptr)
{
sound->SetLooped(args.bValue);
}
});
soundWindow->AddWidget(loopedCheckbox);
loopedCheckbox->SetEnabled(false);
volumeSlider = new wiSlider(0, 1, 1, 1000, "Volume: ");
volumeSlider->SetTooltip("Set volume level for the selected sound instance.");
volumeSlider->SetPos(XMFLOAT2(x + 60, y += step));
volumeSlider->SetSize(XMFLOAT2(240, hei));
volumeSlider->OnSlide([&](wiEventArgs args) {
SoundComponent* sound = GetScene().sounds.GetComponent(entity);
if (sound != nullptr)
{
sound->volume = args.fValue;
}
});
soundWindow->AddWidget(volumeSlider);
volumeSlider->SetEnabled(false);
soundWindow->Translate(XMFLOAT3(400, 120, 0));
soundWindow->SetVisible(false);
SetEntity(INVALID_ENTITY);
}
SoundWindow::~SoundWindow()
{
soundWindow->RemoveWidgets(true);
GUI->RemoveWidget(soundWindow);
delete soundWindow;
}
void SoundWindow::SetEntity(Entity entity)
{
this->entity = entity;
Scene& scene = wiScene::GetScene();
SoundComponent* sound = scene.sounds.GetComponent(entity);
NameComponent* name = scene.names.GetComponent(entity);
if (sound != nullptr)
{
filenameLabel->SetText(sound->filename);
if (name == nullptr)
{
nameField->SetText("Enter a sound name...");
}
else
{
nameField->SetText(name->name);
}
nameField->SetEnabled(true);
playstopButton->SetEnabled(true);
loopedCheckbox->SetEnabled(true);
loopedCheckbox->SetCheck(sound->IsLooped());
volumeSlider->SetEnabled(true);
volumeSlider->SetValue(sound->volume);
if (sound->IsPlaying())
{
playstopButton->SetText("Stop");
}
else
{
playstopButton->SetText("Play");
}
}
else
{
filenameLabel->SetText("");
nameField->SetText("");
nameField->SetEnabled(false);
playstopButton->SetEnabled(false);
loopedCheckbox->SetEnabled(false);
volumeSlider->SetEnabled(false);
}
}