1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-03-17 10:21:11 +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);
applyStateSet(node.getStateSet(), node); if (node.getStateSet())
traverse(node); applyStateSet(node.getStateSet(), 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)
{ {
pushRequirements(geometry); bool needPop = geometry.getStateSet() || mRequirements.empty();
if (needPop)
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);
const ShaderRequirements& reqs = mRequirements.back(); if (!mRequirements.empty())
adjustGeometry(geometry, reqs); {
createProgram(reqs); const ShaderRequirements& reqs = mRequirements.back();
popRequirements(); adjustGeometry(geometry, reqs);
createProgram(reqs);
}
else
ensureFFP(geometry);
if (needPop)
popRequirements();
} }
void ShaderVisitor::apply(osg::Drawable& drawable) void ShaderVisitor::apply(osg::Drawable& drawable)
{ {
pushRequirements(drawable); bool needPop = drawable.getStateSet() || mRequirements.empty();
if (drawable.getStateSet()) if (needPop)
applyStateSet(drawable.getStateSet(), drawable); {
pushRequirements(drawable);
if (drawable.getStateSet())
applyStateSet(drawable.getStateSet(), drawable);
}
const ShaderRequirements& reqs = mRequirements.back(); const ShaderRequirements& reqs = mRequirements.back();
createProgram(reqs); createProgram(reqs);
@ -909,7 +927,8 @@ namespace Shader
} }
} }
popRequirements(); if (needPop)
popRequirements();
} }
void ShaderVisitor::setAllowedToModifyStateSets(bool allowed) void ShaderVisitor::setAllowedToModifyStateSets(bool allowed)