Use infinite AAB for sky meshes to fix them from disappearing from underwater refraction, while still taking advantage of CPU culling for other meshes

This commit is contained in:
scrawl 2013-02-17 18:12:38 +01:00
parent 7ffcfa3622
commit 791d16bbdb
3 changed files with 13 additions and 1 deletions

View file

@ -41,6 +41,7 @@ namespace MWRender
mRenderTarget->removeListener(this); mRenderTarget->removeListener(this);
Ogre::TextureManager::getSingleton().remove("WaterRefraction"); Ogre::TextureManager::getSingleton().remove("WaterRefraction");
mParentCamera->getSceneManager()->destroyCamera(mCamera); mParentCamera->getSceneManager()->destroyCamera(mCamera);
mParentCamera->getSceneManager()->removeRenderQueueListener(this);
} }
void Refraction::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) void Refraction::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
@ -53,6 +54,9 @@ namespace MWRender
mCamera->setAspectRatio(mParentCamera->getAspectRatio()); mCamera->setAspectRatio(mParentCamera->getAspectRatio());
mCamera->setFOVy(mParentCamera->getFOVy()); mCamera->setFOVy(mParentCamera->getFOVy());
// enable clip plane here to take advantage of CPU culling for overwater or underwater objects
mCamera->enableCustomNearClipPlane(mIsUnderwater ? mNearClipPlaneUnderwater : mNearClipPlane);
mRenderActive = true; mRenderActive = true;
} }

View file

@ -280,6 +280,9 @@ void SkyManager::create()
mSunGlare->setRenderQueue(RQG_SkiesLate); mSunGlare->setRenderQueue(RQG_SkiesLate);
mSunGlare->setVisibilityFlags(RV_NoReflection); mSunGlare->setVisibilityFlags(RV_NoReflection);
Ogre::AxisAlignedBox aabInf;
aabInf.setInfinite ();
// Stars // Stars
mAtmosphereNight = mRootNode->createChildSceneNode(); mAtmosphereNight = mRootNode->createChildSceneNode();
NifOgre::EntityList entities = NifOgre::NIFLoader::createEntities(mAtmosphereNight, NULL, "meshes\\sky_night_01.nif"); NifOgre::EntityList entities = NifOgre::NIFLoader::createEntities(mAtmosphereNight, NULL, "meshes\\sky_night_01.nif");
@ -289,6 +292,7 @@ void SkyManager::create()
night1_ent->setRenderQueueGroup(RQG_SkiesEarly+1); night1_ent->setRenderQueueGroup(RQG_SkiesEarly+1);
night1_ent->setVisibilityFlags(RV_Sky); night1_ent->setVisibilityFlags(RV_Sky);
night1_ent->setCastShadows(false); night1_ent->setCastShadows(false);
night1_ent->getMesh()->_setBounds (aabInf);
for (unsigned int j=0; j<night1_ent->getNumSubEntities(); ++j) for (unsigned int j=0; j<night1_ent->getNumSubEntities(); ++j)
{ {
@ -315,6 +319,7 @@ void SkyManager::create()
atmosphere_ent->setRenderQueueGroup(RQG_SkiesEarly); atmosphere_ent->setRenderQueueGroup(RQG_SkiesEarly);
atmosphere_ent->setVisibilityFlags(RV_Sky); atmosphere_ent->setVisibilityFlags(RV_Sky);
atmosphere_ent->getSubEntity (0)->setMaterialName ("openmw_atmosphere"); atmosphere_ent->getSubEntity (0)->setMaterialName ("openmw_atmosphere");
atmosphere_ent->getMesh()->_setBounds (aabInf);
} }
@ -328,6 +333,7 @@ void SkyManager::create()
clouds_ent->setRenderQueueGroup(RQG_SkiesEarly+5); clouds_ent->setRenderQueueGroup(RQG_SkiesEarly+5);
clouds_ent->getSubEntity(0)->setMaterialName ("openmw_clouds"); clouds_ent->getSubEntity(0)->setMaterialName ("openmw_clouds");
clouds_ent->setCastShadows(false); clouds_ent->setCastShadows(false);
clouds_ent->getMesh()->_setBounds (aabInf);
} }
mCreated = true; mCreated = true;

View file

@ -124,7 +124,6 @@ void PlaneReflection::renderQueueEnded (Ogre::uint8 queueGroupId, const Ogre::St
{ {
if (queueGroupId < 20 && mRenderActive) if (queueGroupId < 20 && mRenderActive)
{ {
// this trick does not seem to work well for extreme angles
mCamera->enableCustomNearClipPlane(mIsUnderwater ? mErrorPlaneUnderwater : mErrorPlane); mCamera->enableCustomNearClipPlane(mIsUnderwater ? mErrorPlaneUnderwater : mErrorPlane);
Root::getSingleton().getRenderSystem()->_setProjectionMatrix(mCamera->getProjectionMatrixRS()); Root::getSingleton().getRenderSystem()->_setProjectionMatrix(mCamera->getProjectionMatrixRS());
} }
@ -145,6 +144,9 @@ void PlaneReflection::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
pos.y = (mWaterPlane).d*2 - pos.y; pos.y = (mWaterPlane).d*2 - pos.y;
mSky->setSkyPosition(pos); mSky->setSkyPosition(pos);
mCamera->enableReflection(mWaterPlane); mCamera->enableReflection(mWaterPlane);
// enable clip plane here to take advantage of CPU culling for overwater or underwater objects
mCamera->enableCustomNearClipPlane(mIsUnderwater ? mErrorPlaneUnderwater : mErrorPlane);
} }
void PlaneReflection::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt) void PlaneReflection::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)