Merge branch '2805-for-48' into 'openmw-48'

2805 for OpenMW 0.48

See merge request OpenMW/openmw!2817
This commit is contained in:
Alexei Kotov 2023-03-11 21:07:24 +00:00
commit e093474ba2

View File

@ -185,15 +185,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)
@ -820,23 +822,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);
@ -862,7 +880,10 @@ namespace Shader
sourceOsgaRigGeometry->setSourceGeometry(sourceGeometry); sourceOsgaRigGeometry->setSourceGeometry(sourceGeometry);
osgaRig->setSourceRigGeometry(sourceOsgaRigGeometry); osgaRig->setSourceRigGeometry(sourceOsgaRigGeometry);
} }
} }
if (needPop)
popRequirements(); popRequirements();
} }