From 460b584934fb675d667d04aaa3184289385d3cad Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 16 Mar 2012 19:49:01 +0100 Subject: [PATCH] transition tweaks --- apps/openmw/mwworld/weather.cpp | 148 +++++++++++++++----------------- apps/openmw/mwworld/weather.hpp | 16 ++-- 2 files changed, 77 insertions(+), 87 deletions(-) diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp index eab1197c5..09d30ee8b 100644 --- a/apps/openmw/mwworld/weather.cpp +++ b/apps/openmw/mwworld/weather.cpp @@ -22,6 +22,14 @@ const std::string WeatherGlobals::mThunderSoundID1 = "Thunder1"; const std::string WeatherGlobals::mThunderSoundID2 = "Thunder2"; const std::string WeatherGlobals::mThunderSoundID3 = "Thunder3"; +const float WeatherGlobals::mWeatherUpdateTime = 20.f; + +// morrowind sets these per-weather, but since they are only used by 'thunderstorm' +// weather setting anyway, we can just as well set them globally +const float WeatherGlobals::mThunderFrequency = .4; +const float WeatherGlobals::mThunderThreshold = 0.6; +const float WeatherGlobals::mThunderSoundDelay = 0.25; + WeatherManager::WeatherManager(MWRender::RenderingManager* rendering, Environment* env) : mHour(14), mCurrentWeather("clear"), mFirstUpdate(true), mWeatherUpdateTime(0), mThunderFlash(0), mThunderChance(0), mThunderChanceNeeded(50), mThunderSoundDelay(0) @@ -344,7 +352,7 @@ WeatherResult WeatherManager::getResult(const String& weather) { const Weather& current = mWeatherSettings[weather]; WeatherResult result; - + result.mCloudTexture = current.mCloudTexture; result.mCloudBlendFactor = 0; result.mCloudOpacity = current.mCloudsMaximumPercent; @@ -353,16 +361,13 @@ WeatherResult WeatherManager::getResult(const String& weather) result.mGlareView = current.mGlareView; result.mAmbientLoopSoundID = current.mAmbientLoopSoundID; result.mSunColor = current.mSunDiscSunsetColor; - - const float fade_duration = current.mTransitionDelta * 24.f; - - result.mNight = (mHour < 6.f+fade_duration || mHour > 20.f-fade_duration); - + + result.mNight = (mHour < 6 || mHour > 19); + result.mFogDepth = result.mNight ? current.mLandFogNightDepth : current.mLandFogDayDepth; - + // night - if (mHour <= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) - || mHour >= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration)) + if (mHour <= 5.5f || mHour >= 21) { result.mFogColor = current.mFogNightColor; result.mAmbientColor = current.mAmbientNightColor; @@ -370,82 +375,68 @@ WeatherResult WeatherManager::getResult(const String& weather) result.mSkyColor = current.mSkyNightColor; result.mNightFade = 1.f; } - + // sunrise - else if (mHour >= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) && mHour <= WeatherGlobals::mSunriseTime) + else if (mHour >= 5.5f && mHour <= 8) { - if (mHour <= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration+fade_duration)) + if (mHour <= 6) { // fade in - float advance = (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration+fade_duration)-mHour; - float factor = (advance / fade_duration); + float advance = 6-mHour; + float factor = advance / 0.5f; result.mFogColor = lerp(current.mFogSunriseColor, current.mFogNightColor); result.mAmbientColor = lerp(current.mAmbientSunriseColor, current.mAmbientNightColor); result.mSunColor = lerp(current.mSunSunriseColor, current.mSunNightColor); result.mSkyColor = lerp(current.mSkySunriseColor, current.mSkyNightColor); result.mNightFade = factor; } - else if (mHour >= (WeatherGlobals::mSunriseTime-fade_duration)) + else //if (mHour >= 6) { // fade out - float advance = mHour-(WeatherGlobals::mSunriseTime-fade_duration); - float factor = advance / fade_duration; + float advance = mHour-9; + float factor = advance / 3.f; result.mFogColor = lerp(current.mFogSunriseColor, current.mFogDayColor); result.mAmbientColor = lerp(current.mAmbientSunriseColor, current.mAmbientDayColor); result.mSunColor = lerp(current.mSunSunriseColor, current.mSunDayColor); result.mSkyColor = lerp(current.mSkySunriseColor, current.mSkyDayColor); } - else - { - result.mFogColor = current.mFogSunriseColor; - result.mAmbientColor = current.mAmbientSunriseColor; - result.mSunColor = current.mSunSunriseColor; - result.mSkyColor = current.mSkySunriseColor; - } } - + // day - else if (mHour >= (WeatherGlobals::mSunriseTime) && mHour <= (WeatherGlobals::mSunsetTime)) + else if (mHour >= 8 && mHour <= 17) { result.mFogColor = current.mFogDayColor; result.mAmbientColor = current.mAmbientDayColor; result.mSunColor = current.mSunDayColor; result.mSkyColor = current.mSkyDayColor; } - + // sunset - else if (mHour >= (WeatherGlobals::mSunsetTime) && mHour <= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration)) + else if (mHour >= 17 && mHour <= 21) { - if (mHour <= (WeatherGlobals::mSunsetTime+fade_duration)) + if (mHour <= 19) { // fade in - float advance = (WeatherGlobals::mSunsetTime+fade_duration)-mHour; - float factor = (advance / fade_duration); + float advance = 19-mHour; + float factor = (advance / 2); result.mFogColor = lerp(current.mFogSunsetColor, current.mFogDayColor); result.mAmbientColor = lerp(current.mAmbientSunsetColor, current.mAmbientDayColor); result.mSunColor = lerp(current.mSunSunsetColor, current.mSunDayColor); result.mSkyColor = lerp(current.mSkySunsetColor, current.mSkyDayColor); } - else if (mHour >= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration-fade_duration)) + else //if (mHour >= 19) { // fade out - float advance = mHour-(WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration-fade_duration); - float factor = advance / fade_duration; + float advance = mHour-19; + float factor = advance / 2.f; result.mFogColor = lerp(current.mFogSunsetColor, current.mFogNightColor); result.mAmbientColor = lerp(current.mAmbientSunsetColor, current.mAmbientNightColor); result.mSunColor = lerp(current.mSunSunsetColor, current.mSunNightColor); result.mSkyColor = lerp(current.mSkySunsetColor, current.mSkyNightColor); result.mNightFade = factor; } - else - { - result.mFogColor = current.mFogSunsetColor; - result.mAmbientColor = current.mAmbientSunsetColor; - result.mSunColor = current.mSunSunsetColor; - result.mSkyColor = current.mSkySunsetColor; - } } - + return result; } @@ -454,16 +445,16 @@ WeatherResult WeatherManager::transition(float factor) const WeatherResult& current = getResult(mCurrentWeather); const WeatherResult& other = getResult(mNextWeather); WeatherResult result; - + result.mCloudTexture = current.mCloudTexture; result.mNextCloudTexture = other.mCloudTexture; result.mCloudBlendFactor = factor; - + result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity); result.mFogColor = lerp(current.mFogColor, other.mFogColor); result.mSunColor = lerp(current.mSunColor, other.mSunColor); result.mSkyColor = lerp(current.mSkyColor, other.mSkyColor); - + result.mAmbientColor = lerp(current.mAmbientColor, other.mAmbientColor); result.mSunDiscColor = lerp(current.mSunDiscColor, other.mSunDiscColor); result.mFogDepth = lerp(current.mFogDepth, other.mFogDepth); @@ -471,9 +462,9 @@ WeatherResult WeatherManager::transition(float factor) result.mCloudSpeed = lerp(current.mCloudSpeed, other.mCloudSpeed); result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity); result.mGlareView = lerp(current.mGlareView, other.mGlareView); - + result.mNight = current.mNight; - + // sound change behaviour: // if 'other' has a new sound, switch to it after 1/2 of the transition length if (other.mAmbientLoopSoundID != "") @@ -481,7 +472,7 @@ WeatherResult WeatherManager::transition(float factor) // if 'current' has a sound and 'other' does not have a sound, turn off the sound immediately else if (current.mAmbientLoopSoundID != "") result.mAmbientLoopSoundID = ""; - + return result; } @@ -490,7 +481,7 @@ void WeatherManager::update(float duration) mWeatherUpdateTime -= duration; bool exterior = (mEnvironment->mWorld->isCellExterior() || mEnvironment->mWorld->isCellQuasiExterior()); - + if (exterior) { std::string regionstr = mEnvironment->mWorld->getPlayer().getPlayer().getCell()->cell->region; @@ -500,16 +491,16 @@ void WeatherManager::update(float duration) { mCurrentRegion = regionstr; mWeatherUpdateTime = WeatherGlobals::mWeatherUpdateTime*60.f; - + std::string weather; - + if (mRegionOverrides.find(regionstr) != mRegionOverrides.end()) weather = mRegionOverrides[regionstr]; else { // get weather probabilities for the current region const ESM::Region *region = mEnvironment->mWorld->getStore().regions.find (regionstr); - + float clear = region->data.clear/255.f; float cloudy = region->data.cloudy/255.f; float foggy = region->data.foggy/255.f; @@ -520,13 +511,13 @@ void WeatherManager::update(float duration) float blight = region->data.blight/255.f; float snow = region->data.a/255.f; float blizzard = region->data.b/255.f; - + // re-scale to 100 percent const float total = clear+cloudy+foggy+overcast+rain+thunder+ash+blight+snow+blizzard; - + srand(time(NULL)); float random = ((rand()%100)/100.f) * total; - + if (random >= snow+blight+ash+thunder+rain+overcast+foggy+cloudy+clear) weather = "blizzard"; else if (random >= blight+ash+thunder+rain+overcast+foggy+cloudy+clear) @@ -548,7 +539,7 @@ void WeatherManager::update(float duration) else weather = "clear"; } - + setWeather(weather, false); /* std::cout << "roll result: " << random << std::endl; @@ -560,9 +551,9 @@ void WeatherManager::update(float duration) std::cout << "New weather : " << weather << std::endl; */ } - + WeatherResult result; - + if (mNextWeather != "") { mRemainingTransitionTime -= duration; @@ -572,17 +563,16 @@ void WeatherManager::update(float duration) mNextWeather = ""; } } - + if (mNextWeather != "") result = transition(1-(mRemainingTransitionTime/(mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60))); else result = getResult(mCurrentWeather); mRendering->configureFog(result.mFogDepth, result.mFogColor); - + // disable sun during night - if (mHour >= WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration - || mHour <= WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) + if (mHour >= 21 || mHour <= 5.5f) mRendering->getSkyManager()->sunDisable(); else { @@ -597,7 +587,7 @@ void WeatherManager::update(float duration) mRendering->getSkyManager()->sunEnable(); } - + // moon calculations float night; if (mHour >= 14) @@ -606,9 +596,9 @@ void WeatherManager::update(float duration) night = mHour+10; else night = 0; - + night /= 20.f; - + if (night != 0) { float moonHeight = 1-std::abs((night-0.5)*2); @@ -617,17 +607,17 @@ void WeatherManager::update(float duration) (1-moonHeight)*facing, (1-moonHeight)*facing, moonHeight); - + Vector3 secunda( (1-moonHeight)*facing*0.8, (1-moonHeight)*facing*1.25, moonHeight); - + mRendering->getSkyManager()->setMasserDirection(masser); mRendering->getSkyManager()->setSecundaDirection(secunda); mRendering->getSkyManager()->masserEnable(); mRendering->getSkyManager()->secundaEnable(); - + float hour_fade; if (mHour >= 7.f && mHour <= 14.f) hour_fade = 1-(mHour-7)/3.f; @@ -635,28 +625,28 @@ void WeatherManager::update(float duration) hour_fade = mHour-14; else hour_fade = 1; - + float secunda_angle_fade; float masser_angle_fade; float angle = moonHeight*90.f; - + if (angle >= 30 && angle <= 50) secunda_angle_fade = (angle-30)/20.f; else if (angle <30) secunda_angle_fade = 0.f; else secunda_angle_fade = 1.f; - + if (angle >= 40 && angle <= 50) masser_angle_fade = (angle-40)/10.f; else if (angle <40) masser_angle_fade = 0.f; else masser_angle_fade = 1.f; - + masser_angle_fade *= hour_fade; secunda_angle_fade *= hour_fade; - + mRendering->getSkyManager()->setMasserFade(masser_angle_fade); mRendering->getSkyManager()->setSecundaFade(secunda_angle_fade); } @@ -665,7 +655,7 @@ void WeatherManager::update(float duration) mRendering->getSkyManager()->masserDisable(); mRendering->getSkyManager()->secundaDisable(); } - + if (mCurrentWeather == "thunderstorm" && mNextWeather == "" && exterior) { if (mThunderFlash > 0) @@ -684,7 +674,7 @@ void WeatherManager::update(float duration) mEnvironment->mSoundManager->playSound(soundname, 1.0, 1.0); mThunderSoundDelay = 1000; } - + mThunderFlash -= duration; if (mThunderFlash > 0) mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold ); @@ -703,20 +693,20 @@ void WeatherManager::update(float duration) if (mThunderChance >= mThunderChanceNeeded) { mThunderFlash = WeatherGlobals::mThunderThreshold; - + mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold ); - + mThunderSoundDelay = WeatherGlobals::mThunderSoundDelay; } } } else mRendering->getSkyManager()->setThunder(0.f); - + mRendering->setAmbientColour(result.mAmbientColor); mRendering->sunEnable(); mRendering->setSunColour(result.mSunColor); - + mRendering->getSkyManager()->setWeather(result); } else diff --git a/apps/openmw/mwworld/weather.hpp b/apps/openmw/mwworld/weather.hpp index 1828a90c9..b9b40e6fa 100644 --- a/apps/openmw/mwworld/weather.hpp +++ b/apps/openmw/mwworld/weather.hpp @@ -95,18 +95,18 @@ namespace MWWorld Script Color=255,20,20 */ - static const float mSunriseTime = 8; - static const float mSunsetTime = 18; - static const float mSunriseDuration = 2; - static const float mSunsetDuration = 2; + static const float mSunriseTime; + static const float mSunsetTime; + static const float mSunriseDuration; + static const float mSunsetDuration; - static const float mWeatherUpdateTime = 20.f; + static const float mWeatherUpdateTime; // morrowind sets these per-weather, but since they are only used by 'thunderstorm' // weather setting anyway, we can just as well set them globally - static const float mThunderFrequency = .4; - static const float mThunderThreshold = 0.6; - static const float mThunderSoundDelay = 0.25; + static const float mThunderFrequency; + static const float mThunderThreshold; + static const float mThunderSoundDelay; static const std::string mThunderSoundID0; static const std::string mThunderSoundID1; static const std::string mThunderSoundID2;