From e109d864895e472c805fcb090ca03f08ac952562 Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Wed, 29 Sep 2021 21:01:22 +0400 Subject: [PATCH] Revert "avoids creating empty statesets on drawables (#3132)" This reverts commit 957c25a491b86772b02ab9057679ad1fc970f353. --- apps/openmw/mwrender/renderingmanager.cpp | 1 - components/nifosg/nifloader.cpp | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index be143510b2..07b0418f2b 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -486,7 +486,6 @@ namespace MWRender defaultMat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4f(1,1,1,1)); defaultMat->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4f(0.f, 0.f, 0.f, 0.f)); sceneRoot->getOrCreateStateSet()->setAttribute(defaultMat); - sceneRoot->getOrCreateStateSet()->addUniform(new osg::Uniform("emissiveMult", 1.f)); mFog.reset(new FogManager()); diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index f05f906c8f..0432aef5b4 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -1134,6 +1134,8 @@ namespace NifOsg trans->addChild(toAttach); parentNode->addChild(trans); } + // create partsys stateset in order to pass in ShaderVisitor like all other Drawables + partsys->getOrCreateStateSet(); } void handleNiGeometryData(osg::Geometry *geometry, const Nif::NiGeometryData* data, const std::vector& boundTextures, const std::string& name) @@ -1921,6 +1923,8 @@ namespace NifOsg void applyDrawableProperties(osg::Node* node, const std::vector& properties, SceneUtil::CompositeStateSetUpdater* composite, bool hasVertexColors, int animflags) { + osg::StateSet* stateset = node->getOrCreateStateSet(); + // Specular lighting is enabled by default, but there's a quirk... bool specEnabled = true; osg::ref_ptr mat (new osg::Material); @@ -2002,15 +2006,15 @@ namespace NifOsg if (blendFunc->getDestination() == GL_DST_ALPHA) blendFunc->setDestination(GL_ONE); blendFunc = shareAttribute(blendFunc); - node->getOrCreateStateSet()->setAttributeAndModes(blendFunc, osg::StateAttribute::ON); + stateset->setAttributeAndModes(blendFunc, osg::StateAttribute::ON); bool noSort = (alphaprop->flags>>13)&1; if (!noSort) - node->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); + stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); else - node->getOrCreateStateSet()->setRenderBinToInherit(); + stateset->setRenderBinToInherit(); } - else if (osg::StateSet* stateset = node->getStateSet()) + else { stateset->removeAttribute(osg::StateAttribute::BLENDFUNC); stateset->removeMode(GL_BLEND); @@ -2021,9 +2025,9 @@ namespace NifOsg { osg::ref_ptr alphaFunc (new osg::AlphaFunc(getTestMode((alphaprop->flags>>10)&0x7), alphaprop->data.threshold/255.f)); alphaFunc = shareAttribute(alphaFunc); - node->getOrCreateStateSet()->setAttributeAndModes(alphaFunc, osg::StateAttribute::ON); + stateset->setAttributeAndModes(alphaFunc, osg::StateAttribute::ON); } - else if (osg::StateSet* stateset = node->getStateSet()) + else { stateset->removeAttribute(osg::StateAttribute::ALPHAFUNC); stateset->removeMode(GL_ALPHA_TEST); @@ -2079,10 +2083,8 @@ namespace NifOsg mat = shareAttribute(mat); - osg::StateSet* stateset = node->getStateSet(); stateset->setAttributeAndModes(mat, osg::StateAttribute::ON); - if (emissiveMult != 1.f) - stateset->addUniform(new osg::Uniform("emissiveMult", emissiveMult)); + stateset->addUniform(new osg::Uniform("emissiveMult", emissiveMult)); } };