forked from teamnwah/openmw-tes3coop
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:
parent
7ffcfa3622
commit
791d16bbdb
3 changed files with 13 additions and 1 deletions
|
@ -41,6 +41,7 @@ namespace MWRender
|
|||
mRenderTarget->removeListener(this);
|
||||
Ogre::TextureManager::getSingleton().remove("WaterRefraction");
|
||||
mParentCamera->getSceneManager()->destroyCamera(mCamera);
|
||||
mParentCamera->getSceneManager()->removeRenderQueueListener(this);
|
||||
}
|
||||
|
||||
void Refraction::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
|
||||
|
@ -53,6 +54,9 @@ namespace MWRender
|
|||
mCamera->setAspectRatio(mParentCamera->getAspectRatio());
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -280,6 +280,9 @@ void SkyManager::create()
|
|||
mSunGlare->setRenderQueue(RQG_SkiesLate);
|
||||
mSunGlare->setVisibilityFlags(RV_NoReflection);
|
||||
|
||||
Ogre::AxisAlignedBox aabInf;
|
||||
aabInf.setInfinite ();
|
||||
|
||||
// Stars
|
||||
mAtmosphereNight = mRootNode->createChildSceneNode();
|
||||
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->setVisibilityFlags(RV_Sky);
|
||||
night1_ent->setCastShadows(false);
|
||||
night1_ent->getMesh()->_setBounds (aabInf);
|
||||
|
||||
for (unsigned int j=0; j<night1_ent->getNumSubEntities(); ++j)
|
||||
{
|
||||
|
@ -315,6 +319,7 @@ void SkyManager::create()
|
|||
atmosphere_ent->setRenderQueueGroup(RQG_SkiesEarly);
|
||||
atmosphere_ent->setVisibilityFlags(RV_Sky);
|
||||
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->getSubEntity(0)->setMaterialName ("openmw_clouds");
|
||||
clouds_ent->setCastShadows(false);
|
||||
clouds_ent->getMesh()->_setBounds (aabInf);
|
||||
}
|
||||
|
||||
mCreated = true;
|
||||
|
|
|
@ -124,7 +124,6 @@ void PlaneReflection::renderQueueEnded (Ogre::uint8 queueGroupId, const Ogre::St
|
|||
{
|
||||
if (queueGroupId < 20 && mRenderActive)
|
||||
{
|
||||
// this trick does not seem to work well for extreme angles
|
||||
mCamera->enableCustomNearClipPlane(mIsUnderwater ? mErrorPlaneUnderwater : mErrorPlane);
|
||||
Root::getSingleton().getRenderSystem()->_setProjectionMatrix(mCamera->getProjectionMatrixRS());
|
||||
}
|
||||
|
@ -145,6 +144,9 @@ void PlaneReflection::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
|
|||
pos.y = (mWaterPlane).d*2 - pos.y;
|
||||
mSky->setSkyPosition(pos);
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue