From 43724f004e7b01c90ca228e420fce283ca2c192e Mon Sep 17 00:00:00 2001 From: valid-ptr Date: Tue, 27 Oct 2020 17:20:43 +0300 Subject: [PATCH] ShaderComposition mechanism on the osg::State fixed --- src/osg/State.cpp | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/osg/State.cpp b/src/osg/State.cpp index 5cd5b3eca..ab253a76a 100644 --- a/src/osg/State.cpp +++ b/src/osg/State.cpp @@ -713,19 +713,19 @@ void State::apply(const StateSet* dstate) applyAttributeList(_attributeMap,dstate->getAttributeList()); - if ((_lastAppliedProgramObject!=0) && (previousLastAppliedProgramObject==_lastAppliedProgramObject) && _defineMap.changed) + // Checking if there is no program on the stack or the program is not applied from the AttributeStack (StateSet core mechanism) + if (_shaderCompositionEnabled && (_lastAppliedProgramObject == 0 || + (_lastAppliedProgramObject->getProgram() != _attributeMap[_lastAppliedProgramObject->getProgram()->getTypeMemberPair()].last_applied_attribute))) { - // OSG_NOTICE<<"State::apply(StateSet*) Program already applied ("<<(previousLastAppliedProgramObject==_lastAppliedProgramObject)<<") and _defineMap.changed= "<<_defineMap.changed<getProgram()->apply(*this); + // No program has been applied by the StateSet stack so assume shader composition is required + applyShaderComposition(); } - if (_shaderCompositionEnabled) + if (_lastAppliedProgramObject != 0 && previousLastAppliedProgramObject == _lastAppliedProgramObject && _defineMap.changed) { - if (previousLastAppliedProgramObject == _lastAppliedProgramObject || _lastAppliedProgramObject==0) - { - // No program has been applied by the StateSet stack so assume shader composition is required - applyShaderComposition(); - } + // Pragma(tic) mechanism must be applied after ShaderComposer + // OSG_NOTICE<<"State::apply(StateSet*) Program already applied ("<<(previousLastAppliedProgramObject==_lastAppliedProgramObject)<<") and _defineMap.changed= "<<_defineMap.changed<getProgram()->apply(*this); } if (dstate->getUniformList().empty()) @@ -784,17 +784,19 @@ void State::apply() // go through all active StateAttribute's, applying where appropriate. applyAttributeMap(_attributeMap); - - if ((_lastAppliedProgramObject!=0) && (previousLastAppliedProgramObject==_lastAppliedProgramObject) && _defineMap.changed) + // Checking if there is no program on the stack or the program is not applied from the AttributeStack (StateSet core mechanism) + if (_shaderCompositionEnabled && (_lastAppliedProgramObject == 0 || + (_lastAppliedProgramObject->getProgram() != _attributeMap[_lastAppliedProgramObject->getProgram()->getTypeMemberPair()].last_applied_attribute))) { - //OSG_NOTICE<<"State::apply() Program already applied ("<<(previousLastAppliedProgramObject==_lastAppliedProgramObject)<<") and _defineMap.changed= "<<_defineMap.changed<getProgram()->apply(*this); + // No program has been applied by the StateSet stack so assume shader composition is required + applyShaderComposition(); } - - if (_shaderCompositionEnabled) + if ((_lastAppliedProgramObject != 0) && (previousLastAppliedProgramObject == _lastAppliedProgramObject) && _defineMap.changed) { - applyShaderComposition(); + // Pragma(tic) mechanism must be applied after ShaderComposer + //OSG_NOTICE<<"State::apply() Program already applied ("<<(previousLastAppliedProgramObject==_lastAppliedProgramObject)<<") and _defineMap.changed= "<<_defineMap.changed<getProgram()->apply(*this); } if (_currentShaderCompositionUniformList.empty()) applyUniformMap(_uniformMap); @@ -811,7 +813,7 @@ void State::applyShaderComposition() { // if (isNotifyEnabled(osg::INFO)) print(notify(osg::INFO)); - // build lits of current ShaderComponents + // build list of current ShaderComponents ShaderComponents shaderComponents; // OSG_NOTICE<<"State::applyShaderComposition() : _attributeMap.size()=="<<_attributeMap.size()<getPCP(*this); - if (_lastAppliedProgramObject != pcp) applyAttribute(_currentShaderCompositionProgram); + if (_lastAppliedProgramObject != pcp) + _currentShaderCompositionProgram->apply(*this); // NOTE: AttributeStack should not be changed by ShaderComposer } } }