diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 634173589..b67e04f40 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -21,7 +21,7 @@ using namespace Ogre; #define CELESTIAL_BODY_DISTANCE 1000.f BillboardObject::BillboardObject( const String& textureName, - const unsigned int initialSize, + const float initialSize, const Vector3& position, SceneNode* rootNode) { @@ -63,21 +63,19 @@ SceneNode* BillboardObject::getNode() } void BillboardObject::init(const String& textureName, - const unsigned int initialSize, + const float initialSize, const Vector3& position, SceneNode* rootNode) { SceneManager* sceneMgr = rootNode->getCreator(); - - const float scale = initialSize*550.f; - + Vector3 finalPosition = position.normalisedCopy() * CELESTIAL_BODY_DISTANCE; static unsigned int bodyCount=0; /// \todo These billboards are not 100% correct, might want to revisit them later mBBSet = sceneMgr->createBillboardSet("SkyBillboardSet"+StringConverter::toString(bodyCount), 1); - mBBSet->setDefaultDimensions(scale, scale); + mBBSet->setDefaultDimensions(550.f*initialSize, 550.f*initialSize); mBBSet->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+2); mBBSet->setBillboardType(BBT_PERPENDICULAR_COMMON); mBBSet->setCommonDirection( -position.normalisedCopy() ); @@ -102,7 +100,7 @@ void BillboardObject::init(const String& textureName, } Moon::Moon( const String& textureName, - const unsigned int initialSize, + const float initialSize, const Vector3& position, SceneNode* rootNode) { @@ -214,9 +212,13 @@ unsigned int Moon::getPhaseInt() const return 0; } -void Moon::setVisibility(const float pVisibility) +void Moon::setVisibility(const float visibility) { - mMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("visibilityFactor", Real(pVisibility)); + if (mVisibility != visibility) + { + mMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("visibilityFactor", Real(visibility)); + mVisibility = visibility; + } } void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) @@ -302,14 +304,19 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : overlay_panel->show(); mThunderOverlay->add2D(overlay_panel); mThunderOverlay->hide(); - + + mSecunda = new Moon("textures\\tx_secunda_full.dds", 0.5, Vector3(-0.4, 0.4, 0.5), mRootNode); + mSecunda->setType(Moon::Type_Secunda); + mSecunda->setRenderQueue(RENDER_QUEUE_SKIES_EARLY+4); + + mMasser = new Moon("textures\\tx_masser_full.dds", 0.75, Vector3(-0.4, 0.4, 0.5), mRootNode); + mMasser->setRenderQueue(RENDER_QUEUE_SKIES_EARLY+3); + mMasser->setType(Moon::Type_Masser); + mSun = new BillboardObject("textures\\tx_sun_05.dds", 1, Vector3(0.4, 0.4, 0.4), mRootNode); mSunGlare = new BillboardObject("textures\\tx_sun_flash_grey_05.dds", 3, Vector3(0.4, 0.4, 0.4), mRootNode); mSunGlare->setRenderQueue(RENDER_QUEUE_SKIES_LATE); - mMasser = new Moon("textures\\tx_masser_full.dds", 1, Vector3(-0.4, 0.4, 0.5), mRootNode); - mSecunda = new Moon("textures\\tx_secunda_full.dds", 0.5, Vector3(0.4, -0.4, 0.5), mRootNode); - mMasser->setType(Moon::Type_Masser); - mSecunda->setType(Moon::Type_Secunda); + HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); @@ -427,7 +434,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : // Clouds NifOgre::NIFLoader::load("meshes\\sky_clouds_01.nif"); Entity* clouds_ent = mSceneMgr->createEntity("meshes\\sky_clouds_01.nif"); - clouds_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+3); + clouds_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+5); SceneNode* clouds_node = mRootNode->createChildSceneNode(); clouds_node->attachObject(clouds_ent); mCloudMaterial = clouds_ent->getSubEntity(0)->getMaterial(); @@ -538,12 +545,10 @@ void SkyManager::enable() mRootNode->setVisible(true); mEnabled = true; - mSunGlare->setVisible(mGlareEnabled && mSunEnabled && mEnabled); - mSun->setVisible(mSunEnabled && mEnabled); - - /// \todo - mMasser->setVisible(false); - mSecunda->setVisible(false); + mSunGlare->setVisible(mGlareEnabled && mSunEnabled); + mSun->setVisible(mSunEnabled); + mMasser->setVisible(mMasserEnabled); + mSecunda->setVisible(mSecundaEnabled); } void SkyManager::disable() @@ -554,8 +559,7 @@ void SkyManager::disable() void SkyManager::setMoonColour (bool red) { - /// \todo tweak these colors - mSecunda->setColour( red ? ColourValue(1.0, 0.0, 0.0) + mSecunda->setColour( red ? ColourValue(1.0, 0.0784, 0.0784) : ColourValue(1.0, 1.0, 1.0)); } @@ -646,6 +650,36 @@ void SkyManager::setSunDirection(const Vector3& direction) mSunGlare->setPosition(direction); } +void SkyManager::setMasserDirection(const Vector3& direction) +{ + mMasser->setPosition(direction); +} + +void SkyManager::setSecundaDirection(const Vector3& direction) +{ + mSecunda->setPosition(direction); +} + +void SkyManager::masserEnable() +{ + mMasserEnabled = true; +} + +void SkyManager::secundaEnable() +{ + mSecundaEnabled = true; +} + +void SkyManager::masserDisable() +{ + mMasserEnabled = false; +} + +void SkyManager::secundaDisable() +{ + mSecundaEnabled = false; +} + void SkyManager::setThunder(const float factor) { if (factor > 0.f) @@ -656,3 +690,13 @@ void SkyManager::setThunder(const float factor) else mThunderOverlay->hide(); } + +void SkyManager::setMasserFade(const float fade) +{ + mMasser->setVisibility(fade); +} + +void SkyManager::setSecundaFade(const float fade) +{ + mSecunda->setVisibility(fade); +} diff --git a/apps/openmw/mwrender/sky.hpp b/apps/openmw/mwrender/sky.hpp index ef26ce862..6f5e0fa55 100644 --- a/apps/openmw/mwrender/sky.hpp +++ b/apps/openmw/mwrender/sky.hpp @@ -29,7 +29,7 @@ namespace MWRender { public: BillboardObject( const Ogre::String& textureName, - const unsigned int size, + const float size, const Ogre::Vector3& position, Ogre::SceneNode* rootNode ); @@ -44,7 +44,7 @@ namespace MWRender protected: virtual void init(const Ogre::String& textureName, - const unsigned int size, + const float size, const Ogre::Vector3& position, Ogre::SceneNode* rootNode); @@ -61,12 +61,12 @@ namespace MWRender { public: Moon( const Ogre::String& textureName, - const unsigned int size, + const float size, const Ogre::Vector3& position, Ogre::SceneNode* rootNode ); - void setVisibility(const float pVisibility); + void setVisibility(const float visibility); ///< set the transparency factor for this moon enum Phase @@ -94,6 +94,7 @@ namespace MWRender unsigned int getPhaseInt() const; private: + float mVisibility; Type mType; Phase mPhase; }; @@ -138,6 +139,20 @@ namespace MWRender void setSunDirection(const Ogre::Vector3& direction); + void setMasserDirection(const Ogre::Vector3& direction); + + void setSecundaDirection(const Ogre::Vector3& direction); + + void setMasserFade(const float fade); + + void setSecundaFade(const float fade); + + void masserEnable(); + void masserDisable(); + + void secundaEnable(); + void secundaDisable(); + void setThunder(const float factor); void setGlare(bool glare); @@ -183,6 +198,8 @@ namespace MWRender bool mEnabled; bool mGlareEnabled; bool mSunEnabled; + bool mMasserEnabled; + bool mSecundaEnabled; }; } diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp index 395fedc2c..766c150ee 100644 --- a/apps/openmw/mwworld/weather.cpp +++ b/apps/openmw/mwworld/weather.cpp @@ -121,7 +121,7 @@ WeatherManager::WeatherManager(MWRender::RenderingManager* rendering, Environmen mWeatherSettings["overcast"] = overcast; */ - setWeather("thunderstorm", true); + setWeather("clear", true); } void WeatherManager::setWeather(const String& weather, bool instant) @@ -319,6 +319,74 @@ void WeatherManager::update(float duration) mRendering->getSkyManager()->sunEnable(); } + // moon calculations + float night; + if (mHour >= 14) + night = mHour-14; + else if (mHour <= 10) + night = mHour+10; + else + night = 0; + + night /= 20.f; + + if (night != 0) + { + float moonHeight = 1-std::abs((night-0.5)*2); + int facing = (mHour > 0.f && mHour<12.f) ? 1 : -1; + Vector3 masser( + (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; + else if (mHour >= 14 && mHour <= 15.f) + 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); + } + else + { + mRendering->getSkyManager()->masserDisable(); + mRendering->getSkyManager()->secundaDisable(); + } + if (mCurrentWeather == "thunderstorm" && mNextWeather == "") { if (mThunderFlash > 0) diff --git a/apps/openmw/mwworld/weather.hpp b/apps/openmw/mwworld/weather.hpp index 57a80ed13..e318ff79f 100644 --- a/apps/openmw/mwworld/weather.hpp +++ b/apps/openmw/mwworld/weather.hpp @@ -17,6 +17,7 @@ namespace MWWorld struct WeatherGlobals { /* + [Weather] EnvReduceColor=255,255,255,255 LerpCloseColor=037,046,048,255 BumpFadeColor=230,239,255,255 @@ -66,6 +67,32 @@ namespace MWWorld Snow Gravity Scale=0.1 Snow High Kill=700 Snow Low Kill=150 + + + [Moons] + Masser Size=94 + Masser Fade In Start=14 + Masser Fade In Finish=15 + Masser Fade Out Start=7 + Masser Fade Out Finish=10 + Masser Axis Offset=35 + Masser Speed=.5 + Masser Daily Increment=1 + Masser Fade Start Angle=50 + Masser Fade End Angle=40 + Masser Moon Shadow Early Fade Angle=0.5 + Secunda Size=40 + Secunda Fade In Start=14 + Secunda Fade In Finish=15 + Secunda Fade Out Start=7 + Secunda Fade Out Finish=10 + Secunda Axis Offset=50 + Secunda Speed=.6 + Secunda Daily Increment=1.2 + Secunda Fade Start Angle=50 + Secunda Fade End Angle=30 + Secunda Moon Shadow Early Fade Angle=0.5 + Script Color=255,20,20 */ static const float mSunriseTime = 8;