mirror of
https://github.com/OpenMW/openmw.git
synced 2025-05-29 14:41:31 +00:00
Fix invisible rain when occlusion is enabled and sky blending isn't (#7273)
This commit is contained in:
parent
a17bffda26
commit
fe571c1a4d
2 changed files with 24 additions and 24 deletions
|
@ -262,15 +262,15 @@ namespace MWRender
|
||||||
, mPrecipitationAlpha(0.f)
|
, mPrecipitationAlpha(0.f)
|
||||||
, mDirtyParticlesEffect(false)
|
, mDirtyParticlesEffect(false)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<CameraRelativeTransform> skyroot = new CameraRelativeTransform;
|
mSkyRootNode = new CameraRelativeTransform;
|
||||||
skyroot->setName("Sky Root");
|
mSkyRootNode->setName("Sky Root");
|
||||||
// Assign empty program to specify we don't want shaders when we are rendering in FFP pipeline
|
// Assign empty program to specify we don't want shaders when we are rendering in FFP pipeline
|
||||||
if (!mSceneManager->getForceShaders())
|
if (!mSceneManager->getForceShaders())
|
||||||
skyroot->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(),
|
mSkyRootNode->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(),
|
||||||
osg::StateAttribute::OVERRIDE | osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);
|
osg::StateAttribute::OVERRIDE | osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);
|
||||||
mSceneManager->setUpNormalsRTForStateSet(skyroot->getOrCreateStateSet(), false);
|
mSceneManager->setUpNormalsRTForStateSet(mSkyRootNode->getOrCreateStateSet(), false);
|
||||||
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*skyroot->getOrCreateStateSet());
|
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*mSkyRootNode->getOrCreateStateSet());
|
||||||
parentNode->addChild(skyroot);
|
parentNode->addChild(mSkyRootNode);
|
||||||
|
|
||||||
mEarlyRenderBinRoot = new osg::Group;
|
mEarlyRenderBinRoot = new osg::Group;
|
||||||
// render before the world is rendered
|
// render before the world is rendered
|
||||||
|
@ -281,19 +281,18 @@ namespace MWRender
|
||||||
if (enableSkyRTT)
|
if (enableSkyRTT)
|
||||||
{
|
{
|
||||||
mSkyRTT = new SkyRTT(Settings::fog().mSkyRttResolution, mEarlyRenderBinRoot);
|
mSkyRTT = new SkyRTT(Settings::fog().mSkyRttResolution, mEarlyRenderBinRoot);
|
||||||
skyroot->addChild(mSkyRTT);
|
mSkyRootNode->addChild(mSkyRTT);
|
||||||
mRootNode = new osg::Group;
|
|
||||||
skyroot->addChild(mRootNode);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
mRootNode = skyroot;
|
|
||||||
|
|
||||||
mRootNode->setNodeMask(Mask_Sky);
|
mSkyNode = new osg::Group;
|
||||||
mRootNode->addChild(mEarlyRenderBinRoot);
|
mSkyNode->setNodeMask(Mask_Sky);
|
||||||
mUnderwaterSwitch = new UnderwaterSwitchCallback(skyroot);
|
mSkyNode->addChild(mEarlyRenderBinRoot);
|
||||||
|
mSkyRootNode->addChild(mSkyNode);
|
||||||
|
|
||||||
|
mUnderwaterSwitch = new UnderwaterSwitchCallback(mSkyRootNode);
|
||||||
|
|
||||||
mPrecipitationOcclusion = Settings::shaders().mWeatherParticleOcclusion;
|
mPrecipitationOcclusion = Settings::shaders().mWeatherParticleOcclusion;
|
||||||
mPrecipitationOccluder = std::make_unique<PrecipitationOccluder>(skyroot, parentNode, rootNode, camera);
|
mPrecipitationOccluder = std::make_unique<PrecipitationOccluder>(mSkyRootNode, parentNode, rootNode, camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkyManager::create()
|
void SkyManager::create()
|
||||||
|
@ -464,7 +463,7 @@ namespace MWRender
|
||||||
mRainParticleSystem->setUserValue("particleOcclusion", true);
|
mRainParticleSystem->setUserValue("particleOcclusion", true);
|
||||||
mSceneManager->recreateShaders(mRainNode);
|
mSceneManager->recreateShaders(mRainNode);
|
||||||
|
|
||||||
mRootNode->addChild(mRainNode);
|
mSkyNode->addChild(mRainNode);
|
||||||
if (mPrecipitationOcclusion)
|
if (mPrecipitationOcclusion)
|
||||||
mPrecipitationOccluder->enable();
|
mPrecipitationOccluder->enable();
|
||||||
}
|
}
|
||||||
|
@ -474,7 +473,7 @@ namespace MWRender
|
||||||
if (!mRainNode)
|
if (!mRainNode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mRootNode->removeChild(mRainNode);
|
mSkyNode->removeChild(mRainNode);
|
||||||
mRainNode = nullptr;
|
mRainNode = nullptr;
|
||||||
mPlacer = nullptr;
|
mPlacer = nullptr;
|
||||||
mCounter = nullptr;
|
mCounter = nullptr;
|
||||||
|
@ -485,10 +484,10 @@ namespace MWRender
|
||||||
|
|
||||||
SkyManager::~SkyManager()
|
SkyManager::~SkyManager()
|
||||||
{
|
{
|
||||||
if (mRootNode)
|
if (mSkyRootNode)
|
||||||
{
|
{
|
||||||
mRootNode->getParent(0)->removeChild(mRootNode);
|
mSkyRootNode->getParent(0)->removeChild(mSkyRootNode);
|
||||||
mRootNode = nullptr;
|
mSkyRootNode = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -595,7 +594,7 @@ namespace MWRender
|
||||||
const osg::Node::NodeMask mask = enabled ? Mask_Sky : 0u;
|
const osg::Node::NodeMask mask = enabled ? Mask_Sky : 0u;
|
||||||
|
|
||||||
mEarlyRenderBinRoot->setNodeMask(mask);
|
mEarlyRenderBinRoot->setNodeMask(mask);
|
||||||
mRootNode->setNodeMask(mask);
|
mSkyNode->setNodeMask(mask);
|
||||||
|
|
||||||
if (!enabled && mParticleNode && mParticleEffect)
|
if (!enabled && mParticleNode && mParticleEffect)
|
||||||
{
|
{
|
||||||
|
@ -691,7 +690,7 @@ namespace MWRender
|
||||||
{
|
{
|
||||||
if (mParticleNode)
|
if (mParticleNode)
|
||||||
{
|
{
|
||||||
mRootNode->removeChild(mParticleNode);
|
mSkyNode->removeChild(mParticleNode);
|
||||||
mParticleNode = nullptr;
|
mParticleNode = nullptr;
|
||||||
}
|
}
|
||||||
if (mRainEffect.empty())
|
if (mRainEffect.empty())
|
||||||
|
@ -706,7 +705,7 @@ namespace MWRender
|
||||||
mParticleNode = new osg::PositionAttitudeTransform;
|
mParticleNode = new osg::PositionAttitudeTransform;
|
||||||
mParticleNode->addCullCallback(mUnderwaterSwitch);
|
mParticleNode->addCullCallback(mUnderwaterSwitch);
|
||||||
mParticleNode->setNodeMask(Mask_WeatherParticles);
|
mParticleNode->setNodeMask(Mask_WeatherParticles);
|
||||||
mRootNode->addChild(mParticleNode);
|
mSkyNode->addChild(mParticleNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
mParticleEffect = mSceneManager->getInstance(mCurrentParticleEffect, mParticleNode);
|
mParticleEffect = mSceneManager->getInstance(mCurrentParticleEffect, mParticleNode);
|
||||||
|
|
|
@ -118,7 +118,8 @@ namespace MWRender
|
||||||
|
|
||||||
osg::Camera* mCamera;
|
osg::Camera* mCamera;
|
||||||
|
|
||||||
osg::ref_ptr<osg::Group> mRootNode;
|
osg::ref_ptr<CameraRelativeTransform> mSkyRootNode;
|
||||||
|
osg::ref_ptr<osg::Group> mSkyNode;
|
||||||
osg::ref_ptr<osg::Group> mEarlyRenderBinRoot;
|
osg::ref_ptr<osg::Group> mEarlyRenderBinRoot;
|
||||||
|
|
||||||
osg::ref_ptr<osg::PositionAttitudeTransform> mParticleNode;
|
osg::ref_ptr<osg::PositionAttitudeTransform> mParticleNode;
|
||||||
|
|
Loading…
Reference in a new issue