Show
Ignore:
Timestamp:
10/09/09 15:39:11 (5 years ago)
Author:
robert
Message:

Introduced new uniforms for tracking the modelview and project matrices in shaders using non built-ins.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osg/State.cpp

    r10614 r10621  
    4545    _modelView = _identity; 
    4646 
     47    _modelViewMatrixUniform = new Uniform(Uniform::FLOAT_MAT4,"osg_ModelViewMatrix"); 
     48    _projectionMatrixUniform = new Uniform(Uniform::FLOAT_MAT4,"osg_ProjectionMatrix"); 
     49    _modelViewProjectionMatrixUniform = new Uniform(Uniform::FLOAT_MAT4,"osg_ModelViewProjectionMatrix"); 
     50 
    4751    _abortRenderingPtr = false;     
    4852 
     
    9195    _maxTexturePoolSize = 0; 
    9296    _maxBufferObjectPoolSize = 0; 
     97 
     98 
    9399} 
    94100 
     
    421427    //popStateSet(); 
    422428    //return; 
    423      
     429 
    424430    if (dstate) 
    425431    { 
     
    441447                if (unit<ds_textureModeList.size()) applyModeList(getOrCreateTextureModeMap(unit),ds_textureModeList[unit]); 
    442448                else if (unit<_textureModeMapList.size()) applyModeMap(_textureModeMapList[unit]); 
    443                  
     449 
    444450                if (unit<ds_textureAttributeList.size()) applyAttributeList(getOrCreateTextureAttributeMap(unit),ds_textureAttributeList[unit]); 
    445451                else if (unit<_textureAttributeMapList.size()) applyAttributeMap(_textureAttributeMapList[unit]); 
    446452            } 
    447453        } 
    448          
    449 #if 1         
     454 
    450455        applyUniformList(_uniformMap,dstate->getUniformList()); 
    451 #else                 
    452         if (_lastAppliedProgramObject) 
    453         { 
    454             for(StateSetStack::iterator sitr=_stateStateStack.begin(); 
    455                 sitr!=_stateStateStack.end(); 
    456                 ++sitr) 
    457             { 
    458                 const StateSet* stateset = *sitr; 
    459                 const StateSet::UniformList& uniformList = stateset->getUniformList(); 
    460                 for(StateSet::UniformList::const_iterator itr=uniformList.begin(); 
    461                     itr!=uniformList.end(); 
    462                     ++itr) 
    463                 { 
    464                     _lastAppliedProgramObject->apply(*(itr->second.first)); 
    465                 } 
    466             } 
    467  
    468             const StateSet::UniformList& uniformList = dstate->getUniformList(); 
    469             for(StateSet::UniformList::const_iterator itr=uniformList.begin(); 
    470                 itr!=uniformList.end(); 
    471                 ++itr) 
    472             { 
    473                 _lastAppliedProgramObject->apply(*(itr->second.first)); 
    474             } 
    475         } 
    476 #endif 
    477  
    478456    } 
    479457    else 
     
    509487    } 
    510488 
    511 #if 1         
    512489    applyUniformMap(_uniformMap); 
    513 #else         
    514     if (_lastAppliedProgramObject && !_stateStateStack.empty()) 
    515     { 
    516         for(StateSetStack::iterator sitr=_stateStateStack.begin(); 
    517             sitr!=_stateStateStack.end(); 
    518             ++sitr) 
    519         { 
    520             const StateSet* stateset = *sitr; 
    521             const StateSet::UniformList& uniformList = stateset->getUniformList(); 
    522             for(StateSet::UniformList::const_iterator itr=uniformList.begin(); 
    523                 itr!=uniformList.end(); 
    524                 ++itr) 
    525             { 
    526                 _lastAppliedProgramObject->apply(*(itr->second.first)); 
    527             } 
    528         } 
    529     } 
    530 #endif 
    531  
    532490 
    533491    if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("end of State::apply()"); 
     
    1034992 
    1035993 
     994void State::applyModelViewAndProjectionUniformsIfRequired() 
     995{ 
     996    if (!_lastAppliedProgramObject) return; 
     997 
     998    if (_modelViewMatrixUniform.valid()) _lastAppliedProgramObject->apply(*_modelViewMatrixUniform); 
     999    if (_projectionMatrixUniform) _lastAppliedProgramObject->apply(*_projectionMatrixUniform); 
     1000    if (_modelViewProjectionMatrixUniform) _lastAppliedProgramObject->apply(*_modelViewProjectionMatrixUniform); 
     1001}