diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 95eb8dd33..4f84d90a9 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -51,7 +51,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const cameraPitchNode->attachObject(mRendering.getCamera()); //mSkyManager = 0; - mSkyManager = new SkyManager(mMwRoot, mRendering.getCamera()); + mSkyManager = new SkyManager(mMwRoot, mRendering.getCamera(), &environment); mPlayer = new MWRender::Player (mRendering.getCamera(), playerNode); mSun = 0; diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index e09fa8a42..343afc13c 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -10,11 +10,14 @@ #include +#include "../mwworld/environment.hpp" +#include "../mwworld/world.hpp" + using namespace MWRender; using namespace Ogre; // the speed at which the clouds are animated -#define CLOUD_SPEED 0.001 +#define CLOUD_SPEED 0.003 // this distance has to be set accordingly so that the // celestial bodies are behind the clouds, but in front of the atmosphere @@ -296,9 +299,10 @@ void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource())->unlock(); } -SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : +SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera, MWWorld::Environment* env) : mGlareFade(0), mGlareEnabled(false) { + mEnvironment = env; mViewport = pCamera->getViewport(); mSceneMgr = pMwRoot->getCreator(); mRootNode = pCamera->getParentSceneNode()->createChildSceneNode(); @@ -312,7 +316,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : Pass* pass = material->getTechnique(0)->getPass(0); pass->setSceneBlending(SBT_TRANSPARENT_ALPHA); mThunderTextureUnit = pass->createTextureUnitState(); - mThunderTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(1.f, 1.f, 1.f)); // always black colour + mThunderTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(1.f, 1.f, 1.f)); mThunderTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 0.5f); OverlayManager& ovm = OverlayManager::getSingleton(); mThunderOverlay = ovm.create( "ThunderOverlay" ); @@ -504,7 +508,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : " uniform float4 emissive \n" ") \n" "{ \n" - " uv += float2(1,1) * time * speed * "<getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstantFromTime("time", 1); + mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstantFromTime("time", mEnvironment->mWorld->getTimeScaleFactor()/30.f); /// \todo improve this mMasser->setPhase( static_cast( (int) ((mDay % 32)/4.f)) ); @@ -594,8 +598,8 @@ void SkyManager::update(float duration) mMasser->setVisible(mMasserEnabled); mSecunda->setVisible(mSecundaEnabled); - // rotate the whole sky by 360 degrees every 4 days - mRootNode->roll(Degree(mHourDiff*360/96.f)); + // rotate the stars by 360 degrees every 4 days + mAtmosphereNight->roll(Degree(mEnvironment->mWorld->getTimeScaleFactor()*duration*360 / (3600*96.f))); } void SkyManager::enable() @@ -775,9 +779,6 @@ void SkyManager::setSecundaFade(const float fade) void SkyManager::setHour(double hour) { - mHourDiff = mHour - hour; - if (mHourDiff > 0) mHourDiff -= 24; - mHour = hour; } diff --git a/apps/openmw/mwrender/sky.hpp b/apps/openmw/mwrender/sky.hpp index 2c7b7379a..bf52afd8d 100644 --- a/apps/openmw/mwrender/sky.hpp +++ b/apps/openmw/mwrender/sky.hpp @@ -107,7 +107,7 @@ namespace MWRender class SkyManager { public: - SkyManager(Ogre::SceneNode* pMwRoot, Ogre::Camera* pCamera); + SkyManager(Ogre::SceneNode* pMwRoot, Ogre::Camera* pCamera, MWWorld::Environment* env); ~SkyManager(); void update(float duration); @@ -164,12 +164,11 @@ namespace MWRender Ogre::Vector3 getRealSunPos(); private: + MWWorld::Environment* mEnvironment; float mHour; int mDay; int mMonth; - float mHourDiff; - BillboardObject* mSun; BillboardObject* mSunGlare; Moon* mMasser; diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 1c47e3c71..a636ce288 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -478,7 +478,7 @@ namespace MWWorld float World::getTimeScaleFactor() const { - return mGlobalVariables->getInt ("timescale"); + return mGlobalVariables->getFloat ("timescale"); } void World::changeToInteriorCell (const std::string& cellName, const ESM::Position& position)