void GLObjectsVisitor::apply(osg::StateSet& stateset) { if (_stateSetAppliedSet.count(&stateset)!=0) return; _stateSetAppliedSet.insert(&stateset); if (_mode & COMPILE_STATE_ATTRIBUTES && _renderInfo.getState()) { stateset.compileGLObjects(*_renderInfo.getState()); osg::Program* program = dynamic_cast<osg::Program*>(stateset.getAttribute(osg::StateAttribute::PROGRAM)); if (program) { if( program->isFixedFunction() ) _lastCompiledProgram = NULL; // It does not make sense to apply uniforms on fixed pipe else _lastCompiledProgram = program; } if (_lastCompiledProgram.valid() && !stateset.getUniformList().empty()) { osg::Program::PerContextProgram* pcp = _lastCompiledProgram->getPCP(*_renderInfo.getState()); if (pcp) { pcp->useProgram(); _renderInfo.getState()->setLastAppliedProgramObject(pcp); const osg::StateSet::UniformList& ul = stateset.getUniformList(); for(osg::StateSet::UniformList::const_iterator itr = ul.begin(); itr != ul.end(); ++itr) { pcp->apply(*(itr->second.first)); } } } else if(_renderInfo.getState()->getLastAppliedProgramObject()) { osg::State* state = _renderInfo.getState(); osg::GLExtensions* extensions = state->get<osg::GLExtensions>(); extensions->glUseProgram(0); _renderInfo.getState()->setLastAppliedProgramObject(0); } } if (_mode & RELEASE_STATE_ATTRIBUTES) { stateset.releaseGLObjects(_renderInfo.getState()); } if (_mode & CHECK_BLACK_LISTED_MODES) { stateset.checkValidityOfAssociatedModes(*_renderInfo.getState()); } }