mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-15 09:39:53 +00:00
Implement SunDiscSunsetColor, fade the sun during sunrise & sunset
This commit is contained in:
parent
f7e5a40143
commit
385f4f729c
@ -402,6 +402,13 @@ public:
|
||||
destroySunGlare();
|
||||
}
|
||||
|
||||
void setColor(const osg::Vec4f& color)
|
||||
{
|
||||
mUpdater->mColor.r() = color.r();
|
||||
mUpdater->mColor.g() = color.g();
|
||||
mUpdater->mColor.b() = color.b();
|
||||
}
|
||||
|
||||
virtual void adjustTransparency(const float ratio)
|
||||
{
|
||||
mUpdater->mColor.a() = ratio;
|
||||
@ -576,7 +583,7 @@ private:
|
||||
osg::Vec4f mColor;
|
||||
|
||||
Updater()
|
||||
: mColor(1.f, 1.f, 1.f, 1.0f)
|
||||
: mColor(1.f, 1.f, 1.f, 1.f)
|
||||
{
|
||||
}
|
||||
|
||||
@ -588,7 +595,8 @@ private:
|
||||
virtual void apply(osg::StateSet* stateset, osg::NodeVisitor*)
|
||||
{
|
||||
osg::Material* mat = static_cast<osg::Material*>(stateset->getAttribute(osg::StateAttribute::MATERIAL));
|
||||
mat->setDiffuse(osg::Material::FRONT_AND_BACK, mColor);
|
||||
mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4f(0,0,0,mColor.a()));
|
||||
mat->setEmission(osg::Material::FRONT_AND_BACK, osg::Vec4f(mColor.r(), mColor.g(), mColor.b(), 1));
|
||||
}
|
||||
};
|
||||
|
||||
@ -1464,15 +1472,8 @@ void SkyManager::setWeather(const WeatherResult& weather)
|
||||
mMasser->adjustTransparency(weather.mGlareView);
|
||||
mSecunda->adjustTransparency(weather.mGlareView);
|
||||
|
||||
/*
|
||||
float timeofday_angle = std::abs(mSun->getPosition().z/mSunGlare->getPosition().length());
|
||||
float strength;
|
||||
if (timeofday_angle <= 0.44)
|
||||
strength = timeofday_angle/0.44f;
|
||||
else
|
||||
strength = 1.f;
|
||||
*/
|
||||
mSun->adjustTransparency(weather.mGlareView);
|
||||
mSun->setColor(weather.mSunDiscColor);
|
||||
mSun->adjustTransparency(weather.mGlareView * weather.mSunDiscColor.a());
|
||||
|
||||
float nextStarsOpacity = weather.mNightFade * weather.mGlareView;
|
||||
if(weather.mNight && mStarsOpacity != nextStarsOpacity)
|
||||
|
@ -48,8 +48,10 @@ namespace MWRender
|
||||
|
||||
osg::Vec4f mSkyColor;
|
||||
|
||||
// sun light color
|
||||
osg::Vec4f mSunColor;
|
||||
|
||||
// alpha is the sun transparency
|
||||
osg::Vec4f mSunDiscColor;
|
||||
|
||||
float mFogDepth;
|
||||
|
@ -432,6 +432,7 @@ WeatherManager::WeatherManager(MWRender::RenderingManager& rendering, const MWWo
|
||||
, mSunsetTime(fallback.getFallbackFloat("Weather_Sunset_Time"))
|
||||
, mSunriseDuration(fallback.getFallbackFloat("Weather_Sunrise_Duration"))
|
||||
, mSunsetDuration(fallback.getFallbackFloat("Weather_Sunset_Duration"))
|
||||
, mSunPreSunsetTime(fallback.getFallbackFloat("Weather_Sun_Pre-Sunset_Time"))
|
||||
, mNightStart(mSunsetTime + mSunsetDuration)
|
||||
, mNightEnd(mSunriseTime - 0.5f)
|
||||
, mDayStart(mSunriseTime + mSunriseDuration)
|
||||
@ -966,7 +967,6 @@ inline void WeatherManager::calculateResult(const int weatherID, const float gam
|
||||
mResult.mAmbientLoopSoundID = current.mAmbientLoopSoundID;
|
||||
mResult.mAmbientSoundVolume = 1.f;
|
||||
mResult.mEffectFade = 1.f;
|
||||
mResult.mSunColor = current.mSunDiscSunsetColor;
|
||||
|
||||
mResult.mIsStorm = current.mIsStorm;
|
||||
|
||||
@ -980,6 +980,7 @@ inline void WeatherManager::calculateResult(const int weatherID, const float gam
|
||||
|
||||
mResult.mFogDepth = mResult.mNight ? current.mLandFogNightDepth : current.mLandFogDayDepth;
|
||||
|
||||
// TODO: use pre/post sunset/sunrise time values in [Weather] section
|
||||
// night
|
||||
if (gameHour <= mNightEnd || gameHour >= mNightStart + 1)
|
||||
{
|
||||
@ -1050,6 +1051,36 @@ inline void WeatherManager::calculateResult(const int weatherID, const float gam
|
||||
mResult.mNightFade = factor;
|
||||
}
|
||||
}
|
||||
|
||||
if (gameHour >= mSunsetTime - mSunPreSunsetTime)
|
||||
{
|
||||
float factor = (gameHour - (mSunsetTime - mSunPreSunsetTime)) / mSunPreSunsetTime;
|
||||
factor = std::min(1.f, factor);
|
||||
mResult.mSunDiscColor = lerp(osg::Vec4f(1,1,1,1), current.mSunDiscSunsetColor, factor);
|
||||
// The SunDiscSunsetColor in the INI isn't exactly the resulting color on screen, most likely because
|
||||
// MW applied the color to the ambient term as well. After the ambient and emissive terms are added together, the fixed pipeline
|
||||
// would then clamp the total lighting to (1,1,1). A noticable change in color tone can be observed when only one of the color components gets clamped.
|
||||
// Unfortunately that means we can't use the INI color as is, have to replicate the above nonsense.
|
||||
mResult.mSunDiscColor = mResult.mSunDiscColor + osg::componentMultiply(mResult.mSunDiscColor, mResult.mAmbientColor);
|
||||
for (int i=0; i<3; ++i)
|
||||
mResult.mSunDiscColor[i] = std::min(1.f, mResult.mSunDiscColor[i]);
|
||||
}
|
||||
else
|
||||
mResult.mSunDiscColor = osg::Vec4f(1,1,1,1);
|
||||
|
||||
if (gameHour >= mSunsetTime)
|
||||
{
|
||||
float fade = std::min(1.f, (gameHour - mSunsetTime) / 2.f);
|
||||
fade = fade*fade;
|
||||
mResult.mSunDiscColor.a() = 1.f - fade;
|
||||
}
|
||||
else if (gameHour >= mSunriseTime && gameHour <= mSunriseTime + 1)
|
||||
{
|
||||
mResult.mSunDiscColor.a() = gameHour - mSunriseTime;
|
||||
}
|
||||
else
|
||||
mResult.mSunDiscColor.a() = 1;
|
||||
|
||||
}
|
||||
|
||||
inline void WeatherManager::calculateTransitionResult(const float factor, const float gameHour)
|
||||
|
@ -75,7 +75,7 @@ namespace MWWorld
|
||||
float mLandFogDayDepth;
|
||||
float mLandFogNightDepth;
|
||||
|
||||
// Color modulation for the sun itself during sunset (not completely sure)
|
||||
// Color modulation for the sun itself during sunset
|
||||
osg::Vec4f mSunDiscSunsetColor;
|
||||
|
||||
// Used by scripts to animate signs, etc based on the wind (GetWindSpeed)
|
||||
@ -242,12 +242,7 @@ namespace MWWorld
|
||||
float mSunsetTime;
|
||||
float mSunriseDuration;
|
||||
float mSunsetDuration;
|
||||
// Some useful values
|
||||
/* TODO: Use pre-sunrise_time, pre-sunset_time,
|
||||
* post-sunrise_time, and post-sunset_time to better
|
||||
* describe sunrise/sunset time.
|
||||
* These values are fallbacks attached to weather.
|
||||
*/
|
||||
float mSunPreSunsetTime;
|
||||
float mNightStart;
|
||||
float mNightEnd;
|
||||
float mDayStart;
|
||||
|
Loading…
x
Reference in New Issue
Block a user