osgEarth 2.1.1
|
Public Member Functions | |
UpdateLightingUniformsHelper (bool useUpdateTraversal=false) | |
~UpdateLightingUniformsHelper () | |
void | cullTraverse (osg::Node *node, osg::NodeVisitor *nv) |
void | updateTraverse (osg::Node *node) |
Protected Attributes | |
int | _maxLights |
bool * | _lightEnabled |
bool | _lightingEnabled |
bool | _dirty |
bool | _applied |
bool | _useUpdateTrav |
OpenThreads::Mutex | _stateSetMutex |
osg::ref_ptr< osg::Uniform > | _lightingEnabledUniform |
osg::ref_ptr< osg::Uniform > | _lightEnabledUniform |
A callback that will update the osgEarth lighting uniforms (based on the FFP lighting state) if necessary.
Definition at line 34 of file ShaderUtils.
UpdateLightingUniformsHelper::UpdateLightingUniformsHelper | ( | bool | useUpdateTraversal = false | ) |
Definition at line 58 of file ShaderUtils.cpp.
: _lightingEnabled( true ), _dirty( true ), _applied( false ), _useUpdateTrav( useUpdateTrav ) { _maxLights = Registry::instance()->getCapabilities().getMaxLights(); _lightEnabled = new bool[ _maxLights ]; if ( _maxLights > 0 ) _lightEnabled[0] = 1; for(int i=1; i<_maxLights; ++i ) _lightEnabled[i] = 0; _lightingEnabledUniform = new osg::Uniform( osg::Uniform::BOOL, "osgearth_LightingEnabled" ); _lightEnabledUniform = new osg::Uniform( osg::Uniform::INT, "osgearth_LightEnabled", _maxLights ); if ( !_useUpdateTrav ) { // setting the data variance the DYNAMIC makes it safe to change the uniform values // during the CULL traversal. _lightingEnabledUniform->setDataVariance( osg::Object::DYNAMIC ); _lightEnabledUniform->setDataVariance( osg::Object::DYNAMIC ); } }
UpdateLightingUniformsHelper::~UpdateLightingUniformsHelper | ( | ) |
Definition at line 84 of file ShaderUtils.cpp.
{ delete [] _lightEnabled; }
void UpdateLightingUniformsHelper::cullTraverse | ( | osg::Node * | node, |
osg::NodeVisitor * | nv | ||
) |
Definition at line 90 of file ShaderUtils.cpp.
{ osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>( nv ); if ( cv ) { StateSetStack stateSetStack; osgUtil::StateGraph* sg = cv->getCurrentStateGraph(); while( sg ) { const osg::StateSet* stateset = sg->getStateSet(); if (stateset) { stateSetStack.push_front(stateset); } sg = sg->_parent; } // Update the overall lighting-enabled value: bool lightingEnabled = ( getModeValue(stateSetStack, GL_LIGHTING) & osg::StateAttribute::ON ) != 0; if ( lightingEnabled != _lightingEnabled || !_applied ) { _lightingEnabled = lightingEnabled; if ( _useUpdateTrav ) _dirty = true; else _lightingEnabledUniform->set( _lightingEnabled ); } // Update the list of enabled lights: for( int i=0; i < _maxLights; ++i ) { bool enabled = ( getModeValue( stateSetStack, GL_LIGHT0 + i ) & osg::StateAttribute::ON ) != 0; if ( _lightEnabled[i] != enabled || !_applied ) { _lightEnabled[i] = enabled; if ( _useUpdateTrav ) _dirty = true; else _lightEnabledUniform->setElement( i, _lightEnabled[i] ); } } // apply if necessary: if ( !_applied && !_useUpdateTrav ) { OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _stateSetMutex ); if (!_applied) { node->getOrCreateStateSet()->addUniform( _lightingEnabledUniform.get() ); node->getStateSet()->addUniform( _lightEnabledUniform.get() ); _applied = true; } } } }
void UpdateLightingUniformsHelper::updateTraverse | ( | osg::Node * | node | ) |
Definition at line 152 of file ShaderUtils.cpp.
{ if ( _dirty ) { _lightingEnabledUniform->set( _lightingEnabled ); for( int i=0; i < _maxLights; ++i ) _lightEnabledUniform->setElement( i, _lightEnabled[i] ); _dirty = false; if ( !_applied ) { osg::StateSet* stateSet = node->getOrCreateStateSet(); stateSet->addUniform( _lightingEnabledUniform.get() ); stateSet->addUniform( _lightEnabledUniform.get() ); } } }
bool osgEarth::UpdateLightingUniformsHelper::_applied [protected] |
Definition at line 48 of file ShaderUtils.
bool osgEarth::UpdateLightingUniformsHelper::_dirty [protected] |
Definition at line 47 of file ShaderUtils.
bool* osgEarth::UpdateLightingUniformsHelper::_lightEnabled [protected] |
Definition at line 45 of file ShaderUtils.
osg::ref_ptr<osg::Uniform> osgEarth::UpdateLightingUniformsHelper::_lightEnabledUniform [protected] |
Definition at line 53 of file ShaderUtils.
bool osgEarth::UpdateLightingUniformsHelper::_lightingEnabled [protected] |
Definition at line 46 of file ShaderUtils.
osg::ref_ptr<osg::Uniform> osgEarth::UpdateLightingUniformsHelper::_lightingEnabledUniform [protected] |
Definition at line 52 of file ShaderUtils.
int osgEarth::UpdateLightingUniformsHelper::_maxLights [protected] |
Definition at line 44 of file ShaderUtils.
OpenThreads::Mutex osgEarth::UpdateLightingUniformsHelper::_stateSetMutex [protected] |
Definition at line 50 of file ShaderUtils.
bool osgEarth::UpdateLightingUniformsHelper::_useUpdateTrav [protected] |
Definition at line 49 of file ShaderUtils.