1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-04 12:39:55 +00:00
OpenMW/apps/openmw/mwworld/weather.cpp

101 lines
2.5 KiB
C++
Raw Normal View History

2012-02-21 22:56:34 +01:00
#include "weather.hpp"
#include "../mwrender/renderingmanager.hpp"
using namespace Ogre;
2012-02-21 22:56:34 +01:00
using namespace MWWorld;
#define TRANSITION_TIME 10
WeatherManager::WeatherManager(MWRender::RenderingManager* rendering) :
mCurrentWeather("clear")
2012-02-21 22:56:34 +01:00
{
mRendering = rendering;
/// \todo read these from Morrowind.ini
Weather clear;
clear.mCloudTexture = "tx_sky_clear.dds";
clear.mCloudsMaximumPercent = 0.75;
mWeatherSettings["clear"] = clear;
Weather cloudy;
cloudy.mCloudTexture = "tx_sky_cloudy.dds";
cloudy.mCloudsMaximumPercent = 0.9;
mWeatherSettings["cloudy"] = cloudy;
Weather overcast;
overcast.mCloudTexture = "tx_sky_overcast.dds";
overcast.mCloudsMaximumPercent = 1.0;
mWeatherSettings["overcast"] = overcast;
setWeather("clear", true);
setWeather("cloudy", false);
}
void WeatherManager::setWeather(const String& weather, bool instant)
{
if (instant)
{
mNextWeather = "";
mCurrentWeather = weather;
}
else if (weather != mCurrentWeather)
{
mNextWeather = weather;
mRemainingTransitionTime = TRANSITION_TIME;
}
}
WeatherResult WeatherManager::getResult()
{
const Weather& current = mWeatherSettings[mCurrentWeather];
WeatherResult result;
result.mCloudTexture = current.mCloudTexture;
result.mCloudBlendFactor = 0;
result.mCloudOpacity = current.mCloudsMaximumPercent;
/// \todo
return result;
}
WeatherResult WeatherManager::transition(const Weather& other, float factor)
{
const Weather& current = mWeatherSettings[mCurrentWeather];
WeatherResult result;
result.mCloudTexture = current.mCloudTexture;
result.mNextCloudTexture = other.mCloudTexture;
result.mCloudBlendFactor = factor;
#define lerp(x, y) (x * (1-factor) + y * factor)
result.mCloudOpacity = lerp(current.mCloudsMaximumPercent, other.mCloudsMaximumPercent);
/// \todo
return result;
}
void WeatherManager::update(float duration)
{
WeatherResult result;
if (mNextWeather != "")
{
mRemainingTransitionTime -= duration;
if (mRemainingTransitionTime < 0)
{
mCurrentWeather = mNextWeather;
mNextWeather = "";
}
}
if (mNextWeather != "")
result = transition(mWeatherSettings[mNextWeather], 1-(mRemainingTransitionTime/TRANSITION_TIME));
else
result = getResult();
mRendering->getSkyManager()->setWeather(result);
2012-02-21 22:56:34 +01:00
}