diff --git a/CHANGELOG.md b/CHANGELOG.md index 27147172b0..35a8bb0a61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -225,6 +225,7 @@ Bug #6937: Divided by Nix Hounds quest is broken Bug #7008: Race condition on initializing a vector of reserved node names Bug #7121: Crash on TimeStamp construction with invalid hour value + Bug #7251: Force shaders setting still renders some drawables with FFP Feature #890: OpenMW-CS: Column filtering Feature #1465: "Reset" argument for AI functions Feature #2491: Ability to make OpenMW "portable" diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 7568150833..f92c08fd64 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -612,9 +612,6 @@ namespace MWRender mRootNode->getOrCreateStateSet()->setAttributeAndModes(clipcontrol, osg::StateAttribute::ON); } - // Assign a default shader on root to handle empty statesets - mResourceSystem->getSceneManager()->recreateShaders(mRootNode, "objects"); - SceneUtil::setCameraClearDepth(mViewer->getCamera()); updateProjectionMatrix(); diff --git a/components/shader/shadervisitor.cpp b/components/shader/shadervisitor.cpp index 06f246e9bc..e904e4b75a 100644 --- a/components/shader/shadervisitor.cpp +++ b/components/shader/shadervisitor.cpp @@ -865,73 +865,51 @@ namespace Shader void ShaderVisitor::apply(osg::Geometry& geometry) { - bool needPop = (geometry.getStateSet() != nullptr); + pushRequirements(geometry); if (geometry.getStateSet()) // TODO: check if stateset affects shader permutation before pushing it - { - pushRequirements(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) { - bool needPop = drawable.getStateSet(); + pushRequirements(drawable); - if (needPop) + if (drawable.getStateSet()) + applyStateSet(drawable.getStateSet(), drawable); + + const ShaderRequirements& reqs = mRequirements.back(); + createProgram(reqs); + + if (auto rig = dynamic_cast(&drawable)) { - pushRequirements(drawable); - - if (drawable.getStateSet()) - applyStateSet(drawable.getStateSet(), drawable); + osg::ref_ptr sourceGeometry = rig->getSourceGeometry(); + if (sourceGeometry && adjustGeometry(*sourceGeometry, reqs)) + rig->setSourceGeometry(sourceGeometry); + } + else if (auto morph = dynamic_cast(&drawable)) + { + osg::ref_ptr sourceGeometry = morph->getSourceGeometry(); + if (sourceGeometry && adjustGeometry(*sourceGeometry, reqs)) + morph->setSourceGeometry(sourceGeometry); + } + else if (auto osgaRig = dynamic_cast(&drawable)) + { + osg::ref_ptr sourceOsgaRigGeometry = osgaRig->getSourceRigGeometry(); + osg::ref_ptr sourceGeometry = sourceOsgaRigGeometry->getSourceGeometry(); + if (sourceGeometry && adjustGeometry(*sourceGeometry, reqs)) + { + sourceOsgaRigGeometry->setSourceGeometry(sourceGeometry); + osgaRig->setSourceRigGeometry(sourceOsgaRigGeometry); + } } - if (!mRequirements.empty()) - { - const ShaderRequirements& reqs = mRequirements.back(); - createProgram(reqs); - - if (auto rig = dynamic_cast(&drawable)) - { - osg::ref_ptr sourceGeometry = rig->getSourceGeometry(); - if (sourceGeometry && adjustGeometry(*sourceGeometry, reqs)) - rig->setSourceGeometry(sourceGeometry); - } - else if (auto morph = dynamic_cast(&drawable)) - { - osg::ref_ptr sourceGeometry = morph->getSourceGeometry(); - if (sourceGeometry && adjustGeometry(*sourceGeometry, reqs)) - morph->setSourceGeometry(sourceGeometry); - } - else if (auto osgaRig = dynamic_cast(&drawable)) - { - osg::ref_ptr sourceOsgaRigGeometry = osgaRig->getSourceRigGeometry(); - osg::ref_ptr sourceGeometry = sourceOsgaRigGeometry->getSourceGeometry(); - if (sourceGeometry && adjustGeometry(*sourceGeometry, reqs)) - { - sourceOsgaRigGeometry->setSourceGeometry(sourceGeometry); - osgaRig->setSourceRigGeometry(sourceOsgaRigGeometry); - } - } - } - else - ensureFFP(drawable); - - if (needPop) - popRequirements(); + popRequirements(); } void ShaderVisitor::setAllowedToModifyStateSets(bool allowed)