1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-27 16:41:38 +00:00

restored toggleWater

This commit is contained in:
scrawl 2012-04-12 16:46:56 +02:00
parent 95f87a8abf
commit a96ad7fb82
2 changed files with 29 additions and 28 deletions

View file

@ -11,7 +11,7 @@ namespace MWRender
Water::Water (Ogre::Camera *camera, SkyManager* sky, const ESM::Cell* cell) :
mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()),
mIsUnderwater(false), mVisibilityFlags(0),
mReflectionTarget(0), mActive(1)
mReflectionTarget(0), mActive(1), mToggled(1)
{
mSky = sky;
@ -134,8 +134,7 @@ Water::Water (Ogre::Camera *camera, SkyManager* sky, const ESM::Cell* cell) :
void Water::setActive(bool active)
{
mActive = active;
if (mReflectionTarget) mReflectionTarget->setActive(active && !mIsUnderwater);
mWater->setVisible(active);
updateVisible();
}
Water::~Water()
@ -167,8 +166,8 @@ void Water::setHeight(const float height)
void Water::toggle()
{
if (mActive)
mWater->setVisible(!mWater->getVisible());
mToggled = !mToggled;
updateVisible();
}
void Water::checkUnderwater(float y)
@ -183,9 +182,6 @@ void Water::checkUnderwater(float y)
if (pass->hasFragmentProgram() && pass->getFragmentProgramParameters()->_findNamedConstantDefinition("isUnderwater", false))
pass->getFragmentProgramParameters()->setNamedConstant("isUnderwater", Real(0));
if (mReflectionTarget)
mReflectionTarget->setActive(mActive);
mWater->setRenderQueueGroup(RQG_Water);
mIsUnderwater = false;
@ -201,13 +197,12 @@ void Water::checkUnderwater(float y)
if (pass->hasFragmentProgram() && pass->getFragmentProgramParameters()->_findNamedConstantDefinition("isUnderwater", false))
pass->getFragmentProgramParameters()->setNamedConstant("isUnderwater", Real(1));
if (mReflectionTarget)
mReflectionTarget->setActive(false);
mWater->setRenderQueueGroup(RQG_UnderWater);
mIsUnderwater = true;
}
updateVisible();
}
Vector3 Water::getSceneNodeCoordinates(int gridX, int gridY)
@ -217,15 +212,14 @@ Vector3 Water::getSceneNodeCoordinates(int gridX, int gridY)
void Water::preRenderTargetUpdate(const RenderTargetEvent& evt)
{
mReflectionCamera->setOrientation(mCamera->getDerivedOrientation());
mReflectionCamera->setPosition(mCamera->getDerivedPosition());
mReflectionCamera->setNearClipDistance(mCamera->getNearClipDistance());
mReflectionCamera->setFarClipDistance(mCamera->getFarClipDistance());
mReflectionCamera->setAspectRatio(mCamera->getAspectRatio());
mReflectionCamera->setFOVy(mCamera->getFOVy());
if (evt.source == mReflectionTarget)
{
mWater->setVisible(false);
mReflectionCamera->setOrientation(mCamera->getDerivedOrientation());
mReflectionCamera->setPosition(mCamera->getDerivedPosition());
mReflectionCamera->setNearClipDistance(mCamera->getNearClipDistance());
mReflectionCamera->setFarClipDistance(mCamera->getFarClipDistance());
mReflectionCamera->setAspectRatio(mCamera->getAspectRatio());
mReflectionCamera->setFOVy(mCamera->getFOVy());
// Some messy code to get the skybox to show up at all
// The problem here is that it gets clipped by the water plane
@ -242,8 +236,6 @@ void Water::preRenderTargetUpdate(const RenderTargetEvent& evt)
void Water::postRenderTargetUpdate(const RenderTargetEvent& evt)
{
mWater->setVisible(true);
if (evt.source == mReflectionTarget)
{
mSky->resetSkyPosition();
@ -291,4 +283,11 @@ void Water::setViewportBackground(const ColourValue& bg)
mReflectionTarget->getViewport(0)->setBackgroundColour(bg);
}
void Water::updateVisible()
{
mWater->setVisible(mToggled && mActive);
if (mReflectionTarget)
mReflectionTarget->setActive(mToggled && mActive && !mIsUnderwater);
}
} // namespace

View file

@ -24,6 +24,7 @@ namespace MWRender {
bool mIsUnderwater;
bool mActive;
bool mToggled;
int mTop;
Ogre::Vector3 getSceneNodeCoordinates(int gridX, int gridY);
@ -31,6 +32,7 @@ namespace MWRender {
protected:
void preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
void postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
void updateVisible();
SkyManager* mSky;