1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-19 19:41:33 +00:00

Merge branch 'seventeenth-times-the-charm' into 'master'

Fix #7264

Closes #7264

See merge request OpenMW/openmw!2805
This commit is contained in:
psi29a 2023-03-10 07:21:07 +00:00
commit b9f1d5d4e7

View file

@ -212,15 +212,17 @@ namespace Shader
void ShaderVisitor::apply(osg::Node& node) void ShaderVisitor::apply(osg::Node& node)
{ {
if (node.getStateSet()) bool needPop = false;
if (node.getStateSet() || mRequirements.empty())
{ {
needPop = true;
pushRequirements(node); pushRequirements(node);
if (node.getStateSet())
applyStateSet(node.getStateSet(), node); applyStateSet(node.getStateSet(), node);
traverse(node);
popRequirements();
} }
else
traverse(node); traverse(node);
if (needPop)
popRequirements();
} }
osg::StateSet* getWritableStateSet(osg::Node& node) osg::StateSet* getWritableStateSet(osg::Node& node)
@ -865,23 +867,39 @@ namespace Shader
void ShaderVisitor::apply(osg::Geometry& geometry) void ShaderVisitor::apply(osg::Geometry& geometry)
{ {
bool needPop = geometry.getStateSet() || mRequirements.empty();
if (needPop)
pushRequirements(geometry); pushRequirements(geometry);
if (geometry.getStateSet()) // TODO: check if stateset affects shader permutation before pushing it if (geometry.getStateSet()) // TODO: check if stateset affects shader permutation before pushing it
applyStateSet(geometry.getStateSet(), geometry); applyStateSet(geometry.getStateSet(), geometry);
if (!mRequirements.empty())
{
const ShaderRequirements& reqs = mRequirements.back(); const ShaderRequirements& reqs = mRequirements.back();
adjustGeometry(geometry, reqs);
createProgram(reqs);
adjustGeometry(geometry, reqs);
createProgram(reqs);
}
else
ensureFFP(geometry);
if (needPop)
popRequirements(); popRequirements();
} }
void ShaderVisitor::apply(osg::Drawable& drawable) void ShaderVisitor::apply(osg::Drawable& drawable)
{
bool needPop = drawable.getStateSet() || mRequirements.empty();
if (needPop)
{ {
pushRequirements(drawable); pushRequirements(drawable);
if (drawable.getStateSet()) if (drawable.getStateSet())
applyStateSet(drawable.getStateSet(), drawable); applyStateSet(drawable.getStateSet(), drawable);
}
const ShaderRequirements& reqs = mRequirements.back(); const ShaderRequirements& reqs = mRequirements.back();
createProgram(reqs); createProgram(reqs);
@ -909,6 +927,7 @@ namespace Shader
} }
} }
if (needPop)
popRequirements(); popRequirements();
} }