1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-30 09:06:43 +00:00

Proper handling of cull flags

This commit is contained in:
madsbuvi 2021-01-01 11:50:18 +01:00
parent 2b43e59c09
commit a9cea565f9
5 changed files with 30 additions and 15 deletions

View file

@ -675,18 +675,6 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
Settings::Manager::getInt("anisotropy", "General") Settings::Manager::getInt("anisotropy", "General")
); );
// geometry shader must be enabled before the RenderingManager sets up any shaders
// therefore this part is separate from the rest of stereo setup.
mStereoEnabled = mEnvironment.getVrMode() || Settings::Manager::getBool("stereo enabled", "Stereo");
if (mStereoEnabled)
{
// Mask in everything that does not currently use shaders.
// Remove that altogether when the sky finally uses them.
auto noShaderMask = MWRender::VisMask::Mask_Sky | MWRender::VisMask::Mask_Sun | MWRender::VisMask::Mask_WeatherParticles;
// Since shaders are not yet created, we need to use the brute force technique initially
mStereoView.reset(new Misc::StereoView(noShaderMask, MWRender::VisMask::Mask_Scene));
}
int numThreads = Settings::Manager::getInt("preload num threads", "Cells"); int numThreads = Settings::Manager::getInt("preload num threads", "Cells");
if (numThreads <= 0) if (numThreads <= 0)
throw std::runtime_error("Invalid setting: 'preload num threads' must be >0"); throw std::runtime_error("Invalid setting: 'preload num threads' must be >0");
@ -782,6 +770,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
#ifdef USE_OPENXR #ifdef USE_OPENXR
mXrEnvironment.setGUIManager(new MWVR::VRGUIManager(mViewer, mResourceSystem.get(), rootNode)); mXrEnvironment.setGUIManager(new MWVR::VRGUIManager(mViewer, mResourceSystem.get(), rootNode));
mXrEnvironment.getViewer()->configureCallbacks(); mXrEnvironment.getViewer()->configureCallbacks();
mStereoView->setCullMask(mStereoView->getCullMask() & ~MWRender::VisMask::Mask_GUI);
#endif #endif
@ -816,7 +805,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
// Stereo shader technique can be set up now. // Stereo shader technique can be set up now.
mStereoView->setStereoTechnique(Misc::getStereoTechnique()); mStereoView->setStereoTechnique(Misc::getStereoTechnique());
mStereoView->initializeScene(); mStereoView->initializeScene();
mStereoView->setCullMask(mStereoView->getCullMask()); mStereoView->setCullMask(mViewer->getCamera()->getCullMask() & ~MWRender::VisMask::Mask_GUI);
} }
window->setStore(mEnvironment.getWorld()->getStore()); window->setStore(mEnvironment.getWorld()->getStore());
@ -935,6 +924,22 @@ void OMW::Engine::go()
// Create encoder // Create encoder
mEncoder = new ToUTF8::Utf8Encoder(mEncoding); mEncoder = new ToUTF8::Utf8Encoder(mEncoding);
#ifdef USE_OPENXR
mEnvironment.setVrMode(true);
#endif
// geometry shader must be enabled before the RenderingManager sets up any shaders
// therefore this part is separate from the rest of stereo setup.
mStereoEnabled = mEnvironment.getVrMode() || Settings::Manager::getBool("stereo enabled", "Stereo");
if (mStereoEnabled)
{
// Mask in everything that does not currently use shaders.
// Remove that altogether when the sky finally uses them.
auto noShaderMask = MWRender::VisMask::Mask_Sky | MWRender::VisMask::Mask_Sun | MWRender::VisMask::Mask_WeatherParticles;
// Since shaders are not yet created, we need to use the brute force technique initially
mStereoView.reset(new Misc::StereoView(noShaderMask, MWRender::VisMask::Mask_Scene));
}
// Setup viewer // Setup viewer
mViewer = new osgViewer::Viewer; mViewer = new osgViewer::Viewer;
mViewer->setReleaseContextAtEndOfFrameHint(false); mViewer->setReleaseContextAtEndOfFrameHint(false);

View file

@ -606,11 +606,15 @@ namespace MWGui
mOldCullMask = mViewer->getCamera()->getCullMask(); mOldCullMask = mViewer->getCamera()->getCullMask();
mViewer->getUpdateVisitor()->setTraversalMask(disablemask); mViewer->getUpdateVisitor()->setTraversalMask(disablemask);
mViewer->getCamera()->setCullMask(disablemask); mViewer->getCamera()->setCullMask(disablemask);
mViewer->getCamera()->setCullMaskLeft(disablemask);
mViewer->getCamera()->setCullMaskRight(disablemask);
} }
else if (enable && mViewer->getCamera()->getCullMask() == disablemask) else if (enable && mViewer->getCamera()->getCullMask() == disablemask)
{ {
mViewer->getUpdateVisitor()->setTraversalMask(mOldUpdateMask); mViewer->getUpdateVisitor()->setTraversalMask(mOldUpdateMask);
mViewer->getCamera()->setCullMask(mOldCullMask); mViewer->getCamera()->setCullMask(mOldCullMask);
mViewer->getCamera()->setCullMaskLeft(mOldCullMask);
mViewer->getCamera()->setCullMaskRight(mOldCullMask);
} }
} }

View file

@ -369,7 +369,10 @@ namespace MWRender
mViewer->getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR); mViewer->getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
mViewer->getCamera()->setCullingMode(cullingMode); mViewer->getCamera()->setCullingMode(cullingMode);
mViewer->getCamera()->setCullMask(~(Mask_UpdateVisitor|Mask_SimpleWater)); auto mask = ~(Mask_UpdateVisitor | Mask_SimpleWater);
mViewer->getCamera()->setCullMask(mask);
mViewer->getCamera()->setCullMaskLeft(mask);
mViewer->getCamera()->setCullMaskRight(mask);
NifOsg::Loader::setHiddenNodeMask(Mask_UpdateVisitor); NifOsg::Loader::setHiddenNodeMask(Mask_UpdateVisitor);
NifOsg::Loader::setIntersectionDisabledNodeMask(Mask_Effect); NifOsg::Loader::setIntersectionDisabledNodeMask(Mask_Effect);
Nif::NIFFile::setLoadUnsupportedFiles(Settings::Manager::getBool("load unsupported nif files", "Models")); Nif::NIFFile::setLoadUnsupportedFiles(Settings::Manager::getBool("load unsupported nif files", "Models"));
@ -586,6 +589,8 @@ namespace MWRender
else else
mask &= ~Mask_Scene; mask &= ~Mask_Scene;
mViewer->getCamera()->setCullMask(mask); mViewer->getCamera()->setCullMask(mask);
mViewer->getCamera()->setCullMaskLeft(mask);
mViewer->getCamera()->setCullMaskRight(mask);
return enabled; return enabled;
} }
else if (mode == Render_NavMesh) else if (mode == Render_NavMesh)

View file

@ -14,7 +14,6 @@ void OMW::Engine::initVr()
if (!mViewer) if (!mViewer)
throw std::logic_error("mViewer must be initialized before calling initVr()"); throw std::logic_error("mViewer must be initialized before calling initVr()");
mEnvironment.setVrMode(true);
mXrEnvironment.setManager(new MWVR::OpenXRManager); mXrEnvironment.setManager(new MWVR::OpenXRManager);
mXrEnvironment.setSession(new MWVR::VRSession()); mXrEnvironment.setSession(new MWVR::VRSession());
mXrEnvironment.setViewer(new MWVR::VRViewer(mViewer)); mXrEnvironment.setViewer(new MWVR::VRViewer(mViewer));

View file

@ -720,6 +720,8 @@ namespace Misc
else else
{ {
mMainCamera->setCullMask(cullMask); mMainCamera->setCullMask(cullMask);
mMainCamera->setCullMaskLeft(cullMask);
mMainCamera->setCullMaskRight(cullMask);
} }
} }
osg::Node::NodeMask StereoView::getCullMask() osg::Node::NodeMask StereoView::getCullMask()