667 lines
22 KiB
C++
667 lines
22 KiB
C++
#include "stdafx.h"
|
|
#include "WeatherWindow.h"
|
|
#include "Editor.h"
|
|
|
|
#include <thread>
|
|
|
|
using namespace wiECS;
|
|
using namespace wiScene;
|
|
using namespace wiGraphics;
|
|
|
|
void WeatherWindow::Create(EditorComponent* editor)
|
|
{
|
|
wiWindow::Create("Weather Window");
|
|
SetSize(XMFLOAT2(660, 560));
|
|
|
|
float x = 180;
|
|
float y = 20;
|
|
float hei = 18;
|
|
float step = hei + 2;
|
|
|
|
|
|
fogStartSlider.Create(0, 5000, 0, 100000, "Fog Start: ");
|
|
fogStartSlider.SetSize(XMFLOAT2(100, hei));
|
|
fogStartSlider.SetPos(XMFLOAT2(x, y += step));
|
|
fogStartSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().fogStart = args.fValue;
|
|
});
|
|
AddWidget(&fogStartSlider);
|
|
|
|
fogEndSlider.Create(1, 5000, 1000, 10000, "Fog End: ");
|
|
fogEndSlider.SetSize(XMFLOAT2(100, hei));
|
|
fogEndSlider.SetPos(XMFLOAT2(x, y += step));
|
|
fogEndSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().fogEnd = args.fValue;
|
|
});
|
|
AddWidget(&fogEndSlider);
|
|
|
|
fogHeightSlider.Create(0, 1, 0, 10000, "Fog Height: ");
|
|
fogHeightSlider.SetSize(XMFLOAT2(100, hei));
|
|
fogHeightSlider.SetPos(XMFLOAT2(x, y += step));
|
|
fogHeightSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().fogHeight = args.fValue;
|
|
});
|
|
AddWidget(&fogHeightSlider);
|
|
|
|
cloudinessSlider.Create(0, 1, 0.0f, 10000, "Cloudiness: ");
|
|
cloudinessSlider.SetSize(XMFLOAT2(100, hei));
|
|
cloudinessSlider.SetPos(XMFLOAT2(x, y += step));
|
|
cloudinessSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().cloudiness = args.fValue;
|
|
});
|
|
AddWidget(&cloudinessSlider);
|
|
|
|
cloudScaleSlider.Create(0.00005f, 0.001f, 0.0005f, 10000, "Cloud Scale: ");
|
|
cloudScaleSlider.SetSize(XMFLOAT2(100, hei));
|
|
cloudScaleSlider.SetPos(XMFLOAT2(x, y += step));
|
|
cloudScaleSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().cloudScale = args.fValue;
|
|
});
|
|
AddWidget(&cloudScaleSlider);
|
|
|
|
cloudSpeedSlider.Create(0.001f, 0.2f, 0.1f, 10000, "Cloud Speed: ");
|
|
cloudSpeedSlider.SetSize(XMFLOAT2(100, hei));
|
|
cloudSpeedSlider.SetPos(XMFLOAT2(x, y += step));
|
|
cloudSpeedSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().cloudSpeed = args.fValue;
|
|
});
|
|
AddWidget(&cloudSpeedSlider);
|
|
|
|
windSpeedSlider.Create(0.0f, 4.0f, 1.0f, 10000, "Wind Speed: ");
|
|
windSpeedSlider.SetSize(XMFLOAT2(100, hei));
|
|
windSpeedSlider.SetPos(XMFLOAT2(x, y += step));
|
|
windSpeedSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().windSpeed = args.fValue;
|
|
});
|
|
AddWidget(&windSpeedSlider);
|
|
|
|
windMagnitudeSlider.Create(0.0f, 0.2f, 0.0f, 10000, "Wind Magnitude: ");
|
|
windMagnitudeSlider.SetSize(XMFLOAT2(100, hei));
|
|
windMagnitudeSlider.SetPos(XMFLOAT2(x, y += step));
|
|
windMagnitudeSlider.OnSlide([&](wiEventArgs args) {
|
|
UpdateWind();
|
|
});
|
|
AddWidget(&windMagnitudeSlider);
|
|
|
|
windDirectionSlider.Create(0, 1, 0, 10000, "Wind Direction: ");
|
|
windDirectionSlider.SetSize(XMFLOAT2(100, hei));
|
|
windDirectionSlider.SetPos(XMFLOAT2(x, y += step));
|
|
windDirectionSlider.OnSlide([&](wiEventArgs args) {
|
|
UpdateWind();
|
|
});
|
|
AddWidget(&windDirectionSlider);
|
|
|
|
windWaveSizeSlider.Create(0, 1, 0, 10000, "Wind Wave Size: ");
|
|
windWaveSizeSlider.SetSize(XMFLOAT2(100, hei));
|
|
windWaveSizeSlider.SetPos(XMFLOAT2(x, y += step));
|
|
windWaveSizeSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().windWaveSize = args.fValue;
|
|
});
|
|
AddWidget(&windWaveSizeSlider);
|
|
|
|
windRandomnessSlider.Create(0, 10, 5, 10000, "Wind Randomness: ");
|
|
windRandomnessSlider.SetSize(XMFLOAT2(100, hei));
|
|
windRandomnessSlider.SetPos(XMFLOAT2(x, y += step));
|
|
windRandomnessSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().windRandomness = args.fValue;
|
|
});
|
|
AddWidget(&windRandomnessSlider);
|
|
|
|
skyExposureSlider.Create(0, 4, 1, 10000, "Sky Exposure: ");
|
|
skyExposureSlider.SetSize(XMFLOAT2(100, hei));
|
|
skyExposureSlider.SetPos(XMFLOAT2(x, y += step));
|
|
skyExposureSlider.OnSlide([&](wiEventArgs args) {
|
|
GetWeather().skyExposure = args.fValue;
|
|
});
|
|
AddWidget(&skyExposureSlider);
|
|
|
|
simpleskyCheckBox.Create("Simple sky: ");
|
|
simpleskyCheckBox.SetTooltip("Simple sky will simply blend horizon and zenith color from bottom to top.");
|
|
simpleskyCheckBox.SetSize(XMFLOAT2(hei, hei));
|
|
simpleskyCheckBox.SetPos(XMFLOAT2(x, y += step));
|
|
simpleskyCheckBox.OnClick([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.SetSimpleSky(args.bValue);
|
|
if (args.bValue)
|
|
{
|
|
weather.SetRealisticSky(false);
|
|
}
|
|
});
|
|
AddWidget(&simpleskyCheckBox);
|
|
|
|
realisticskyCheckBox.Create("Realistic sky: ");
|
|
realisticskyCheckBox.SetTooltip("Physically based sky rendering model.");
|
|
realisticskyCheckBox.SetSize(XMFLOAT2(hei, hei));
|
|
realisticskyCheckBox.SetPos(XMFLOAT2(x + 120, y));
|
|
realisticskyCheckBox.OnClick([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.SetRealisticSky(args.bValue);
|
|
if (args.bValue)
|
|
{
|
|
weather.SetSimpleSky(false);
|
|
}
|
|
});
|
|
AddWidget(&realisticskyCheckBox);
|
|
|
|
skyButton.Create("Load Sky");
|
|
skyButton.SetTooltip("Load a skybox cubemap texture...");
|
|
skyButton.SetSize(XMFLOAT2(240, hei));
|
|
skyButton.SetPos(XMFLOAT2(x-100, y += step));
|
|
skyButton.OnClick([=](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
|
|
if (weather.skyMap == nullptr)
|
|
{
|
|
wiHelper::FileDialogParams params;
|
|
params.type = wiHelper::FileDialogParams::OPEN;
|
|
params.description = "Cubemap texture";
|
|
params.extensions.push_back("dds");
|
|
wiHelper::FileDialog(params, [=](std::string fileName) {
|
|
wiEvent::Subscribe_Once(SYSTEM_EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) {
|
|
auto& weather = GetWeather();
|
|
weather.skyMapName = fileName;
|
|
weather.skyMap = wiResourceManager::Load(fileName, wiResourceManager::IMPORT_RETAIN_FILEDATA);
|
|
skyButton.SetText(wiHelper::GetFileNameFromPath(fileName));
|
|
});
|
|
});
|
|
}
|
|
else
|
|
{
|
|
weather.skyMap.reset();
|
|
weather.skyMapName.clear();
|
|
skyButton.SetText("Load Sky");
|
|
}
|
|
|
|
// Also, we invalidate all environment probes to reflect the sky changes.
|
|
InvalidateProbes();
|
|
|
|
});
|
|
AddWidget(&skyButton);
|
|
|
|
colorgradingButton.Create("Load Color Grading LUT");
|
|
colorgradingButton.SetTooltip("Load a color grading lookup texture. It must be a 256x16 RGBA image!");
|
|
colorgradingButton.SetSize(XMFLOAT2(240, hei));
|
|
colorgradingButton.SetPos(XMFLOAT2(x - 100, y += step));
|
|
colorgradingButton.OnClick([=](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
|
|
if (weather.colorGradingMap == nullptr)
|
|
{
|
|
wiHelper::FileDialogParams params;
|
|
params.type = wiHelper::FileDialogParams::OPEN;
|
|
params.description = "Texture";
|
|
params.extensions.push_back("png");
|
|
params.extensions.push_back("tga");
|
|
params.extensions.push_back("bmp");
|
|
wiHelper::FileDialog(params, [=](std::string fileName) {
|
|
wiEvent::Subscribe_Once(SYSTEM_EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) {
|
|
auto& weather = GetWeather();
|
|
weather.colorGradingMapName = fileName;
|
|
weather.colorGradingMap = wiResourceManager::Load(fileName, wiResourceManager::IMPORT_COLORGRADINGLUT | wiResourceManager::IMPORT_RETAIN_FILEDATA);
|
|
colorgradingButton.SetText(wiHelper::GetFileNameFromPath(fileName));
|
|
});
|
|
});
|
|
}
|
|
else
|
|
{
|
|
weather.colorGradingMap.reset();
|
|
weather.colorGradingMapName.clear();
|
|
colorgradingButton.SetText("Load Color Grading LUT");
|
|
}
|
|
|
|
});
|
|
AddWidget(&colorgradingButton);
|
|
|
|
|
|
|
|
// Ocean params:
|
|
ocean_enabledCheckBox.Create("Ocean simulation enabled: ");
|
|
ocean_enabledCheckBox.SetSize(XMFLOAT2(hei, hei));
|
|
ocean_enabledCheckBox.SetPos(XMFLOAT2(x + 100, y += step));
|
|
ocean_enabledCheckBox.OnClick([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.SetOceanEnabled(args.bValue);
|
|
if (!weather.IsOceanEnabled())
|
|
{
|
|
wiScene::GetScene().OceanRegenerate();
|
|
}
|
|
});
|
|
AddWidget(&ocean_enabledCheckBox);
|
|
|
|
|
|
ocean_patchSizeSlider.Create(1, 1000, 1000, 100000, "Patch size: ");
|
|
ocean_patchSizeSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_patchSizeSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_patchSizeSlider.SetValue(wiScene::GetScene().weather.oceanParameters.patch_length);
|
|
ocean_patchSizeSlider.SetTooltip("Adjust water tiling patch size");
|
|
ocean_patchSizeSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
if (std::abs(weather.oceanParameters.patch_length - args.fValue) > FLT_EPSILON)
|
|
{
|
|
weather.oceanParameters.patch_length = args.fValue;
|
|
wiScene::GetScene().OceanRegenerate();
|
|
}
|
|
}
|
|
});
|
|
AddWidget(&ocean_patchSizeSlider);
|
|
|
|
ocean_waveAmplitudeSlider.Create(0, 1000, 1000, 100000, "Wave amplitude: ");
|
|
ocean_waveAmplitudeSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_waveAmplitudeSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_waveAmplitudeSlider.SetValue(wiScene::GetScene().weather.oceanParameters.wave_amplitude);
|
|
ocean_waveAmplitudeSlider.SetTooltip("Adjust wave size");
|
|
ocean_waveAmplitudeSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
if (std::abs(weather.oceanParameters.wave_amplitude - args.fValue) > FLT_EPSILON)
|
|
{
|
|
weather.oceanParameters.wave_amplitude = args.fValue;
|
|
wiScene::GetScene().OceanRegenerate();
|
|
}
|
|
}
|
|
});
|
|
AddWidget(&ocean_waveAmplitudeSlider);
|
|
|
|
ocean_choppyScaleSlider.Create(0, 10, 1000, 100000, "Choppiness: ");
|
|
ocean_choppyScaleSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_choppyScaleSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_choppyScaleSlider.SetValue(wiScene::GetScene().weather.oceanParameters.choppy_scale);
|
|
ocean_choppyScaleSlider.SetTooltip("Adjust wave choppiness");
|
|
ocean_choppyScaleSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
weather.oceanParameters.choppy_scale = args.fValue;
|
|
}
|
|
});
|
|
AddWidget(&ocean_choppyScaleSlider);
|
|
|
|
ocean_windDependencySlider.Create(0, 1, 1000, 100000, "Wind dependency: ");
|
|
ocean_windDependencySlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_windDependencySlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_windDependencySlider.SetValue(wiScene::GetScene().weather.oceanParameters.wind_dependency);
|
|
ocean_windDependencySlider.SetTooltip("Adjust wind contribution");
|
|
ocean_windDependencySlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
if (std::abs(weather.oceanParameters.wind_dependency - args.fValue) > FLT_EPSILON)
|
|
{
|
|
weather.oceanParameters.wind_dependency = args.fValue;
|
|
wiScene::GetScene().OceanRegenerate();
|
|
}
|
|
}
|
|
});
|
|
AddWidget(&ocean_windDependencySlider);
|
|
|
|
ocean_timeScaleSlider.Create(0, 4, 1000, 100000, "Time scale: ");
|
|
ocean_timeScaleSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_timeScaleSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_timeScaleSlider.SetValue(wiScene::GetScene().weather.oceanParameters.time_scale);
|
|
ocean_timeScaleSlider.SetTooltip("Adjust simulation speed");
|
|
ocean_timeScaleSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
weather.oceanParameters.time_scale = args.fValue;
|
|
}
|
|
});
|
|
AddWidget(&ocean_timeScaleSlider);
|
|
|
|
ocean_heightSlider.Create(-100, 100, 0, 100000, "Water level: ");
|
|
ocean_heightSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_heightSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_heightSlider.SetValue(0);
|
|
ocean_heightSlider.SetTooltip("Adjust water level");
|
|
ocean_heightSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
weather.oceanParameters.waterHeight = args.fValue;
|
|
}
|
|
});
|
|
AddWidget(&ocean_heightSlider);
|
|
|
|
ocean_detailSlider.Create(1, 10, 0, 9, "Surface Detail: ");
|
|
ocean_detailSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_detailSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_detailSlider.SetValue(4);
|
|
ocean_detailSlider.SetTooltip("Adjust surface tessellation resolution. High values can decrease performance.");
|
|
ocean_detailSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
weather.oceanParameters.surfaceDetail = (uint32_t)args.iValue;
|
|
}
|
|
});
|
|
AddWidget(&ocean_detailSlider);
|
|
|
|
ocean_toleranceSlider.Create(1, 10, 0, 1000, "Displacement Tolerance: ");
|
|
ocean_toleranceSlider.SetSize(XMFLOAT2(100, hei));
|
|
ocean_toleranceSlider.SetPos(XMFLOAT2(x, y += step));
|
|
ocean_toleranceSlider.SetValue(2);
|
|
ocean_toleranceSlider.SetTooltip("Big waves can introduce glitches on screen borders, this can fix that but surface detail will decrease.");
|
|
ocean_toleranceSlider.OnSlide([&](wiEventArgs args) {
|
|
if (wiScene::GetScene().weathers.GetCount() > 0)
|
|
{
|
|
WeatherComponent& weather = wiScene::GetScene().weathers[0];
|
|
weather.oceanParameters.surfaceDisplacementTolerance = args.fValue;
|
|
}
|
|
});
|
|
AddWidget(&ocean_toleranceSlider);
|
|
|
|
|
|
ocean_resetButton.Create("Reset Ocean to default");
|
|
ocean_resetButton.SetTooltip("Reset ocean to default values.");
|
|
ocean_resetButton.SetSize(XMFLOAT2(240, hei));
|
|
ocean_resetButton.SetPos(XMFLOAT2(x - 100, y += step));
|
|
ocean_resetButton.OnClick([=](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.oceanParameters = wiOcean::OceanParameters();
|
|
});
|
|
AddWidget(&ocean_resetButton);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x = 340;
|
|
y = 20;
|
|
|
|
colorComboBox.Create("Color picker mode: ");
|
|
colorComboBox.SetSize(XMFLOAT2(120, hei));
|
|
colorComboBox.SetPos(XMFLOAT2(x + 150, y += step));
|
|
colorComboBox.AddItem("Ambient color");
|
|
colorComboBox.AddItem("Horizon color");
|
|
colorComboBox.AddItem("Zenith color");
|
|
colorComboBox.AddItem("Ocean color");
|
|
colorComboBox.AddItem("V. Cloud color");
|
|
colorComboBox.SetTooltip("Choose the destination data of the color picker.");
|
|
AddWidget(&colorComboBox);
|
|
|
|
y += 10;
|
|
|
|
colorPicker.Create("Color", false);
|
|
colorPicker.SetPos(XMFLOAT2(x, y += step));
|
|
colorPicker.SetVisible(false);
|
|
colorPicker.SetEnabled(true);
|
|
colorPicker.OnColorChanged([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
switch (colorComboBox.GetSelected())
|
|
{
|
|
default:
|
|
case 0:
|
|
weather.ambient = args.color.toFloat3();
|
|
break;
|
|
case 1:
|
|
weather.horizon = args.color.toFloat3();
|
|
break;
|
|
case 2:
|
|
weather.zenith = args.color.toFloat3();
|
|
break;
|
|
case 3:
|
|
weather.oceanParameters.waterColor = args.color.toFloat4();
|
|
break;
|
|
case 4:
|
|
weather.volumetricCloudParameters.Albedo = args.color.toFloat3();
|
|
break;
|
|
}
|
|
});
|
|
AddWidget(&colorPicker);
|
|
|
|
y += colorPicker.GetScale().y;
|
|
|
|
|
|
volumetricCloudsCheckBox.Create("Volumetric clouds: ");
|
|
volumetricCloudsCheckBox.SetTooltip("Enable volumetric cloud rendering, which is separate from the simple cloud parameters.");
|
|
volumetricCloudsCheckBox.SetSize(XMFLOAT2(hei, hei));
|
|
volumetricCloudsCheckBox.SetPos(XMFLOAT2(x + 280, y += step));
|
|
volumetricCloudsCheckBox.OnClick([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.SetVolumetricClouds(args.bValue);
|
|
});
|
|
AddWidget(&volumetricCloudsCheckBox);
|
|
|
|
coverageAmountSlider.Create(0, 10, 0, 1000, "Coverage amount: ");
|
|
coverageAmountSlider.SetSize(XMFLOAT2(100, hei));
|
|
coverageAmountSlider.SetPos(XMFLOAT2(x + 150, y += step));
|
|
coverageAmountSlider.OnSlide([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.volumetricCloudParameters.CoverageAmount = args.fValue;
|
|
});
|
|
AddWidget(&coverageAmountSlider);
|
|
|
|
coverageMinimumSlider.Create(1, 2, 1, 1000, "Coverage minimmum: ");
|
|
coverageMinimumSlider.SetSize(XMFLOAT2(100, hei));
|
|
coverageMinimumSlider.SetPos(XMFLOAT2(x + 150, y += step));
|
|
coverageMinimumSlider.OnSlide([&](wiEventArgs args) {
|
|
auto& weather = GetWeather();
|
|
weather.volumetricCloudParameters.CoverageMinimum = args.fValue;
|
|
});
|
|
AddWidget(&coverageMinimumSlider);
|
|
|
|
|
|
preset0Button.Create("WeatherPreset - Default");
|
|
preset0Button.SetTooltip("Apply this weather preset to the world.");
|
|
preset0Button.SetSize(XMFLOAT2(colorPicker.GetScale().x, hei));
|
|
preset0Button.SetPos(XMFLOAT2(x, y += step));
|
|
preset0Button.OnClick([=](wiEventArgs args) {
|
|
|
|
Scene& scene = wiScene::GetScene();
|
|
scene.weathers.Clear();
|
|
scene.weather = WeatherComponent();
|
|
|
|
InvalidateProbes();
|
|
|
|
});
|
|
AddWidget(&preset0Button);
|
|
|
|
preset1Button.Create("WeatherPreset - Daytime");
|
|
preset1Button.SetTooltip("Apply this weather preset to the world.");
|
|
preset1Button.SetSize(XMFLOAT2(colorPicker.GetScale().x, hei));
|
|
preset1Button.SetPos(XMFLOAT2(x, y += step));
|
|
preset1Button.OnClick([=](wiEventArgs args) {
|
|
|
|
auto& weather = GetWeather();
|
|
weather.ambient = XMFLOAT3(33.0f / 255.0f, 47.0f / 255.0f, 127.0f / 255.0f);
|
|
weather.horizon = XMFLOAT3(101.0f / 255.0f, 101.0f / 255.0f, 227.0f / 255.0f);
|
|
weather.zenith = XMFLOAT3(99.0f / 255.0f, 133.0f / 255.0f, 255.0f / 255.0f);
|
|
weather.cloudiness = 0.4f;
|
|
weather.fogStart = 100;
|
|
weather.fogEnd = 1000;
|
|
weather.fogHeight = 0;
|
|
|
|
InvalidateProbes();
|
|
|
|
});
|
|
AddWidget(&preset1Button);
|
|
|
|
preset2Button.Create("WeatherPreset - Sunset");
|
|
preset2Button.SetTooltip("Apply this weather preset to the world.");
|
|
preset2Button.SetSize(XMFLOAT2(colorPicker.GetScale().x, hei));
|
|
preset2Button.SetPos(XMFLOAT2(x, y += step));
|
|
preset2Button.OnClick([=](wiEventArgs args) {
|
|
|
|
auto& weather = GetWeather();
|
|
weather.ambient = XMFLOAT3(86.0f / 255.0f, 29.0f / 255.0f, 29.0f / 255.0f);
|
|
weather.horizon = XMFLOAT3(121.0f / 255.0f, 28.0f / 255.0f, 22.0f / 255.0f);
|
|
weather.zenith = XMFLOAT3(146.0f / 255.0f, 51.0f / 255.0f, 51.0f / 255.0f);
|
|
weather.cloudiness = 0.36f;
|
|
weather.fogStart = 50;
|
|
weather.fogEnd = 600;
|
|
weather.fogHeight = 0;
|
|
|
|
InvalidateProbes();
|
|
|
|
});
|
|
AddWidget(&preset2Button);
|
|
|
|
preset3Button.Create("WeatherPreset - Cloudy");
|
|
preset3Button.SetTooltip("Apply this weather preset to the world.");
|
|
preset3Button.SetSize(XMFLOAT2(colorPicker.GetScale().x, hei));
|
|
preset3Button.SetPos(XMFLOAT2(x, y += step));
|
|
preset3Button.OnClick([=](wiEventArgs args) {
|
|
|
|
auto& weather = GetWeather();
|
|
weather.ambient = XMFLOAT3(0.1f, 0.1f, 0.1f);
|
|
weather.horizon = XMFLOAT3(0.38f, 0.38f, 0.38f);
|
|
weather.zenith = XMFLOAT3(0.42f, 0.42f, 0.42f);
|
|
weather.cloudiness = 0.75f;
|
|
weather.fogStart = 0;
|
|
weather.fogEnd = 500;
|
|
weather.fogHeight = 0;
|
|
|
|
InvalidateProbes();
|
|
|
|
});
|
|
AddWidget(&preset3Button);
|
|
|
|
preset4Button.Create("WeatherPreset - Night");
|
|
preset4Button.SetTooltip("Apply this weather preset to the world.");
|
|
preset4Button.SetSize(XMFLOAT2(colorPicker.GetScale().x, hei));
|
|
preset4Button.SetPos(XMFLOAT2(x, y += step));
|
|
preset4Button.OnClick([=](wiEventArgs args) {
|
|
|
|
auto& weather = GetWeather();
|
|
weather.ambient = XMFLOAT3(12.0f / 255.0f, 21.0f / 255.0f, 77.0f / 255.0f);
|
|
weather.horizon = XMFLOAT3(10.0f / 255.0f, 33.0f / 255.0f, 70.0f / 255.0f);
|
|
weather.zenith = XMFLOAT3(4.0f / 255.0f, 20.0f / 255.0f, 51.0f / 255.0f);
|
|
weather.cloudiness = 0.28f;
|
|
weather.fogStart = 10;
|
|
weather.fogEnd = 400;
|
|
weather.fogHeight = 0;
|
|
|
|
InvalidateProbes();
|
|
|
|
});
|
|
AddWidget(&preset4Button);
|
|
|
|
|
|
eliminateCoarseCascadesButton.Create("EliminateCoarseCascades");
|
|
eliminateCoarseCascadesButton.SetTooltip("Eliminate the coarse cascade mask for every object in the scene.");
|
|
eliminateCoarseCascadesButton.SetSize(XMFLOAT2(colorPicker.GetScale().x, hei));
|
|
eliminateCoarseCascadesButton.SetPos(XMFLOAT2(x, y += step * 2));
|
|
eliminateCoarseCascadesButton.OnClick([=](wiEventArgs args) {
|
|
|
|
Scene& scene = wiScene::GetScene();
|
|
for (size_t i = 0; i < scene.objects.GetCount(); ++i)
|
|
{
|
|
scene.objects[i].cascadeMask = 1;
|
|
}
|
|
|
|
});
|
|
AddWidget(&eliminateCoarseCascadesButton);
|
|
|
|
|
|
|
|
|
|
Translate(XMFLOAT3(130, 30, 0));
|
|
SetVisible(false);
|
|
}
|
|
|
|
void WeatherWindow::Update()
|
|
{
|
|
Scene& scene = wiScene::GetScene();
|
|
if (scene.weathers.GetCount() > 0)
|
|
{
|
|
auto& weather = scene.weathers[0];
|
|
|
|
if (!weather.skyMapName.empty())
|
|
{
|
|
skyButton.SetText(wiHelper::GetFileNameFromPath(weather.skyMapName));
|
|
}
|
|
|
|
if (!weather.colorGradingMapName.empty())
|
|
{
|
|
colorgradingButton.SetText(wiHelper::GetFileNameFromPath(weather.colorGradingMapName));
|
|
}
|
|
|
|
fogStartSlider.SetValue(weather.fogStart);
|
|
fogEndSlider.SetValue(weather.fogEnd);
|
|
fogHeightSlider.SetValue(weather.fogHeight);
|
|
cloudinessSlider.SetValue(weather.cloudiness);
|
|
cloudScaleSlider.SetValue(weather.cloudScale);
|
|
cloudSpeedSlider.SetValue(weather.cloudSpeed);
|
|
windSpeedSlider.SetValue(weather.windSpeed);
|
|
windWaveSizeSlider.SetValue(weather.windWaveSize);
|
|
windRandomnessSlider.SetValue(weather.windRandomness);
|
|
skyExposureSlider.SetValue(weather.skyExposure);
|
|
windMagnitudeSlider.SetValue(XMVectorGetX(XMVector3Length(XMLoadFloat3(&weather.windDirection))));
|
|
|
|
switch (colorComboBox.GetSelected())
|
|
{
|
|
default:
|
|
case 0:
|
|
colorPicker.SetPickColor(wiColor::fromFloat3(weather.ambient));
|
|
break;
|
|
case 1:
|
|
colorPicker.SetPickColor(wiColor::fromFloat3(weather.horizon));
|
|
break;
|
|
case 2:
|
|
colorPicker.SetPickColor(wiColor::fromFloat3(weather.zenith));
|
|
break;
|
|
case 3:
|
|
colorPicker.SetPickColor(wiColor::fromFloat4(weather.oceanParameters.waterColor));
|
|
break;
|
|
case 4:
|
|
colorPicker.SetPickColor(wiColor::fromFloat3(weather.volumetricCloudParameters.Albedo));
|
|
break;
|
|
}
|
|
|
|
simpleskyCheckBox.SetCheck(weather.IsSimpleSky());
|
|
realisticskyCheckBox.SetCheck(weather.IsRealisticSky());
|
|
|
|
ocean_enabledCheckBox.SetCheck(weather.IsOceanEnabled());
|
|
ocean_patchSizeSlider.SetValue(weather.oceanParameters.patch_length);
|
|
ocean_waveAmplitudeSlider.SetValue(weather.oceanParameters.wave_amplitude);
|
|
ocean_choppyScaleSlider.SetValue(weather.oceanParameters.choppy_scale);
|
|
ocean_windDependencySlider.SetValue(weather.oceanParameters.wind_dependency);
|
|
ocean_timeScaleSlider.SetValue(weather.oceanParameters.time_scale);
|
|
ocean_heightSlider.SetValue(weather.oceanParameters.waterHeight);
|
|
ocean_detailSlider.SetValue((float)weather.oceanParameters.surfaceDetail);
|
|
ocean_toleranceSlider.SetValue(weather.oceanParameters.surfaceDisplacementTolerance);
|
|
|
|
volumetricCloudsCheckBox.SetCheck(weather.IsVolumetricClouds());
|
|
coverageAmountSlider.SetValue(weather.volumetricCloudParameters.CoverageAmount);
|
|
coverageMinimumSlider.SetValue(weather.volumetricCloudParameters.CoverageMinimum);
|
|
}
|
|
}
|
|
|
|
WeatherComponent& WeatherWindow::GetWeather() const
|
|
{
|
|
Scene& scene = wiScene::GetScene();
|
|
if (scene.weathers.GetCount() == 0)
|
|
{
|
|
scene.weathers.Create(CreateEntity());
|
|
}
|
|
return scene.weathers[0];
|
|
}
|
|
|
|
void WeatherWindow::InvalidateProbes() const
|
|
{
|
|
Scene& scene = wiScene::GetScene();
|
|
|
|
// Also, we invalidate all environment probes to reflect the sky changes.
|
|
for (size_t i = 0; i < scene.probes.GetCount(); ++i)
|
|
{
|
|
scene.probes[i].SetDirty();
|
|
}
|
|
}
|
|
|
|
void WeatherWindow::UpdateWind()
|
|
{
|
|
XMMATRIX rot = XMMatrixRotationY(windDirectionSlider.GetValue() * XM_PI * 2);
|
|
XMVECTOR dir = XMVectorSet(1, 0, 0, 0);
|
|
dir = XMVector3TransformNormal(dir, rot);
|
|
dir *= windMagnitudeSlider.GetValue();
|
|
XMStoreFloat3(&GetWeather().windDirection, dir);
|
|
}
|