mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-26 14:56:39 +00:00 
			
		
		
		
	Merge branch 'alpha-test-override' into 'master'
Ensure original (removed) state overrides replacement state when recreating shaders Closes #6108 See merge request OpenMW/openmw!966
This commit is contained in:
		
						commit
						07a7a903a7
					
				
					 1 changed files with 10 additions and 5 deletions
				
			
		|  | @ -275,10 +275,12 @@ namespace Shader | |||
|         osg::StateSet::AttributeList removedAttributes; | ||||
|         if (osg::ref_ptr<osg::StateSet> removedState = getRemovedState(*stateset)) | ||||
|             removedAttributes = removedState->getAttributeList(); | ||||
|         for (const auto& attributeMap : { attributes, removedAttributes }) | ||||
|         for (const auto* attributeMap : std::initializer_list<const osg::StateSet::AttributeList*>{ &attributes, &removedAttributes }) | ||||
|         { | ||||
|             for (osg::StateSet::AttributeList::const_iterator it = attributeMap.begin(); it != attributeMap.end(); ++it) | ||||
|             for (osg::StateSet::AttributeList::const_iterator it = attributeMap->begin(); it != attributeMap->end(); ++it) | ||||
|             { | ||||
|                 if (attributeMap != &removedAttributes && removedAttributes.count(it->first)) | ||||
|                     continue; | ||||
|                 if (it->first.first == osg::StateAttribute::MATERIAL) | ||||
|                 { | ||||
|                     // This should probably be moved out of ShaderRequirements and be applied directly now it's a uniform instead of a define
 | ||||
|  | @ -400,9 +402,12 @@ namespace Shader | |||
|         { | ||||
|             writableStateSet->addUniform(new osg::Uniform("alphaRef", reqs.mAlphaRef)); | ||||
| 
 | ||||
|             const auto* alphaFunc = writableStateSet->getAttributePair(osg::StateAttribute::ALPHAFUNC); | ||||
|             if (alphaFunc) | ||||
|                 removedState->setAttribute(alphaFunc->first, alphaFunc->second); | ||||
|             if (!removedState->getAttributePair(osg::StateAttribute::ALPHAFUNC)) | ||||
|             { | ||||
|                 const auto* alphaFunc = writableStateSet->getAttributePair(osg::StateAttribute::ALPHAFUNC); | ||||
|                 if (alphaFunc) | ||||
|                     removedState->setAttribute(alphaFunc->first, alphaFunc->second); | ||||
|             } | ||||
|             // This prevents redundant glAlphaFunc calls while letting the shadows bin still see the test
 | ||||
|             writableStateSet->setAttribute(RemovedAlphaFunc::getInstance(reqs.mAlphaFunc), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue