Skip to content

Commit

Permalink
Merge branch 'lessborkedprecipocclusion' into 'master'
Browse files Browse the repository at this point in the history
Fix invisible rain when occlusion is enabled and sky blending isn't (#7273)

Closes #7273

See merge request OpenMW/openmw!4520
  • Loading branch information
AnyOldName3 committed Feb 1, 2025
2 parents a17bffd + fe571c1 commit 1aa4ef0
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 24 deletions.
45 changes: 22 additions & 23 deletions apps/openmw/mwrender/sky.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,15 +262,15 @@ namespace MWRender
, mPrecipitationAlpha(0.f)
, mDirtyParticlesEffect(false)
{
osg::ref_ptr<CameraRelativeTransform> skyroot = new CameraRelativeTransform;
skyroot->setName("Sky Root");
mSkyRootNode = new CameraRelativeTransform;
mSkyRootNode->setName("Sky Root");
// Assign empty program to specify we don't want shaders when we are rendering in FFP pipeline
if (!mSceneManager->getForceShaders())
skyroot->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(),
mSkyRootNode->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(),
osg::StateAttribute::OVERRIDE | osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);
mSceneManager->setUpNormalsRTForStateSet(skyroot->getOrCreateStateSet(), false);
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*skyroot->getOrCreateStateSet());
parentNode->addChild(skyroot);
mSceneManager->setUpNormalsRTForStateSet(mSkyRootNode->getOrCreateStateSet(), false);
SceneUtil::ShadowManager::instance().disableShadowsForStateSet(*mSkyRootNode->getOrCreateStateSet());
parentNode->addChild(mSkyRootNode);

mEarlyRenderBinRoot = new osg::Group;
// render before the world is rendered
Expand All @@ -281,19 +281,18 @@ namespace MWRender
if (enableSkyRTT)
{
mSkyRTT = new SkyRTT(Settings::fog().mSkyRttResolution, mEarlyRenderBinRoot);
skyroot->addChild(mSkyRTT);
mRootNode = new osg::Group;
skyroot->addChild(mRootNode);
mSkyRootNode->addChild(mSkyRTT);
}
else
mRootNode = skyroot;

mRootNode->setNodeMask(Mask_Sky);
mRootNode->addChild(mEarlyRenderBinRoot);
mUnderwaterSwitch = new UnderwaterSwitchCallback(skyroot);
mSkyNode = new osg::Group;
mSkyNode->setNodeMask(Mask_Sky);
mSkyNode->addChild(mEarlyRenderBinRoot);
mSkyRootNode->addChild(mSkyNode);

mUnderwaterSwitch = new UnderwaterSwitchCallback(mSkyRootNode);

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()
Expand Down Expand Up @@ -464,7 +463,7 @@ namespace MWRender
mRainParticleSystem->setUserValue("particleOcclusion", true);
mSceneManager->recreateShaders(mRainNode);

mRootNode->addChild(mRainNode);
mSkyNode->addChild(mRainNode);
if (mPrecipitationOcclusion)
mPrecipitationOccluder->enable();
}
Expand All @@ -474,7 +473,7 @@ namespace MWRender
if (!mRainNode)
return;

mRootNode->removeChild(mRainNode);
mSkyNode->removeChild(mRainNode);
mRainNode = nullptr;
mPlacer = nullptr;
mCounter = nullptr;
Expand All @@ -485,10 +484,10 @@ namespace MWRender

SkyManager::~SkyManager()
{
if (mRootNode)
if (mSkyRootNode)
{
mRootNode->getParent(0)->removeChild(mRootNode);
mRootNode = nullptr;
mSkyRootNode->getParent(0)->removeChild(mSkyRootNode);
mSkyRootNode = nullptr;
}
}

Expand Down Expand Up @@ -595,7 +594,7 @@ namespace MWRender
const osg::Node::NodeMask mask = enabled ? Mask_Sky : 0u;

mEarlyRenderBinRoot->setNodeMask(mask);
mRootNode->setNodeMask(mask);
mSkyNode->setNodeMask(mask);

if (!enabled && mParticleNode && mParticleEffect)
{
Expand Down Expand Up @@ -691,7 +690,7 @@ namespace MWRender
{
if (mParticleNode)
{
mRootNode->removeChild(mParticleNode);
mSkyNode->removeChild(mParticleNode);
mParticleNode = nullptr;
}
if (mRainEffect.empty())
Expand All @@ -706,7 +705,7 @@ namespace MWRender
mParticleNode = new osg::PositionAttitudeTransform;
mParticleNode->addCullCallback(mUnderwaterSwitch);
mParticleNode->setNodeMask(Mask_WeatherParticles);
mRootNode->addChild(mParticleNode);
mSkyNode->addChild(mParticleNode);
}

mParticleEffect = mSceneManager->getInstance(mCurrentParticleEffect, mParticleNode);
Expand Down
3 changes: 2 additions & 1 deletion apps/openmw/mwrender/sky.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ namespace MWRender

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::PositionAttitudeTransform> mParticleNode;
Expand Down

0 comments on commit 1aa4ef0

Please sign in to comment.