From 8325e100df61854a29494daf815b9be14a65820e Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Sat, 20 Apr 2024 08:12:53 +0300 Subject: [PATCH] More decal deduplication --- components/nifosg/nifloader.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/components/nifosg/nifloader.cpp b/components/nifosg/nifloader.cpp index 5af4e57c53..4616ac440f 100644 --- a/components/nifosg/nifloader.cpp +++ b/components/nifosg/nifloader.cpp @@ -2209,8 +2209,11 @@ namespace NifOsg handleDepthFlags(stateset, material->mDepthTest, material->mDepthWrite); } - void handleDecal(bool hasSortAlpha, osg::ref_ptr stateset) + void handleDecal(bool enabled, bool hasSortAlpha, osg::Node& node) { + if (!enabled) + return; + osg::ref_ptr stateset = node.getOrCreateStateSet(); osg::ref_ptr polygonOffset(new osg::PolygonOffset); polygonOffset->setUnits(SceneUtil::AutoDepth::isReversed() ? 1.f : -1.f); polygonOffset->setFactor(SceneUtil::AutoDepth::isReversed() ? 0.65f : -0.65f); @@ -2279,10 +2282,7 @@ namespace NifOsg handleAlphaTesting(shaderMat->mAlphaTest, osg::AlphaFunc::GREATER, shaderMat->mAlphaTestThreshold, node); handleAlphaBlending(shaderMat->mAlphaBlend, shaderMat->mSourceBlendMode, shaderMat->mDestinationBlendMode, true, hasSortAlpha, node); - if (shaderMat->mDecal) - { - handleDecal(hasSortAlpha, node.getOrCreateStateSet()); - } + handleDecal(shaderMat->mDecal, hasSortAlpha, node); if (shaderMat->mShaderType == Bgsm::ShaderType::Lighting) { auto bgsm = static_cast(shaderMat.get()); @@ -2794,8 +2794,7 @@ namespace NifOsg emissiveMult = shaderprop->mEmissiveMult; specStrength = shaderprop->mSpecStrength; specEnabled = shaderprop->specular(); - if (shaderprop->decal()) - handleDecal(hasSortAlpha, node->getOrCreateStateSet()); + handleDecal(shaderprop->decal(), hasSortAlpha, *node); break; } case Nif::RC_BSEffectShaderProperty: @@ -2806,8 +2805,7 @@ namespace NifOsg handleShaderMaterialDrawableProperties(shaderMat, mat, *node, hasSortAlpha); break; } - if (shaderprop->decal()) - handleDecal(hasSortAlpha, node->getOrCreateStateSet()); + handleDecal(shaderprop->decal(), hasSortAlpha, *node); if (shaderprop->softEffect()) SceneUtil::setupSoftEffect( *node, shaderprop->mFalloffDepth, true, shaderprop->mFalloffDepth);