1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-28 20:06:41 +00:00

Merge branch 'fix-5699' into 'master'

Guarantee glow updater regenerates shaders on completion

See merge request OpenMW/openmw!435
This commit is contained in:
Alexei Dobrohotov 2020-12-03 21:55:26 +00:00
commit 8fb07b72d5
3 changed files with 23 additions and 0 deletions

View file

@ -112,6 +112,8 @@ void GlowUpdater::apply(osg::StateSet *stateset, osg::NodeVisitor *nv)
removeTexture(stateset); removeTexture(stateset);
this->reset(); this->reset();
mDone = true; mDone = true;
// normally done in StateSetUpdater::operator(), but needs doing here so the shader visitor sees the right StateSet
mNode->setStateSet(stateset);
mResourceSystem->getSceneManager()->recreateShaders(mNode); mResourceSystem->getSceneManager()->recreateShaders(mNode);
} }
if (mOriginalDuration < 0) // if this glowupdater was originally a permanent glow if (mOriginalDuration < 0) // if this glowupdater was originally a permanent glow

View file

@ -294,7 +294,10 @@ namespace Shader
void ShaderVisitor::createProgram(const ShaderRequirements &reqs) void ShaderVisitor::createProgram(const ShaderRequirements &reqs)
{ {
if (!reqs.mShaderRequired && !mForceShaders) if (!reqs.mShaderRequired && !mForceShaders)
{
ensureFFP(*reqs.mNode);
return; return;
}
osg::Node& node = *reqs.mNode; osg::Node& node = *reqs.mNode;
osg::StateSet* writableStateSet = nullptr; osg::StateSet* writableStateSet = nullptr;
@ -333,6 +336,19 @@ namespace Shader
} }
} }
void ShaderVisitor::ensureFFP(osg::Node& node)
{
if (!node.getStateSet() || !node.getStateSet()->getAttribute(osg::StateAttribute::PROGRAM))
return;
osg::StateSet* writableStateSet = nullptr;
if (mAllowedToModifyStateSets)
writableStateSet = node.getStateSet();
else
writableStateSet = getWritableStateSet(node);
writableStateSet->removeAttribute(osg::StateAttribute::PROGRAM);
}
bool ShaderVisitor::adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs) bool ShaderVisitor::adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs)
{ {
bool useShader = reqs.mShaderRequired || mForceShaders; bool useShader = reqs.mShaderRequired || mForceShaders;
@ -380,6 +396,8 @@ namespace Shader
createProgram(reqs); createProgram(reqs);
} }
else
ensureFFP(geometry);
if (needPop) if (needPop)
popRequirements(); popRequirements();
@ -414,6 +432,8 @@ namespace Shader
morph->setSourceGeometry(sourceGeometry); morph->setSourceGeometry(sourceGeometry);
} }
} }
else
ensureFFP(drawable);
if (needPop) if (needPop)
popRequirements(); popRequirements();

View file

@ -94,6 +94,7 @@ namespace Shader
std::string mDefaultFsTemplate; std::string mDefaultFsTemplate;
void createProgram(const ShaderRequirements& reqs); void createProgram(const ShaderRequirements& reqs);
void ensureFFP(osg::Node& node);
bool adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs); bool adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs);
}; };