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:
commit
8fb07b72d5
3 changed files with 23 additions and 0 deletions
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue