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/include/osg/State

    r10601 r10621  
    167167            if (_projection!=matrix) 
    168168            { 
     169                if (matrix) 
     170                { 
     171                    _projection=matrix; 
     172                } 
     173                else 
     174                { 
     175                    _projection=_identity; 
     176                } 
     177 
     178                if (_projectionMatrixUniform.valid()) _projectionMatrixUniform->set(*_projection); 
     179                if (_modelViewProjectionMatrixUniform.valid()) _modelViewProjectionMatrixUniform->set((*_modelView) * (*_projection)); 
     180 
    169181                glMatrixMode( GL_PROJECTION ); 
     182                    glLoadMatrix(_projection->ptr()); 
     183                glMatrixMode( GL_MODELVIEW ); 
     184            } 
     185        } 
     186 
     187        inline const osg::Matrix& getProjectionMatrix() const 
     188        { 
     189            return *_projection; 
     190        } 
     191 
     192        inline void applyModelViewMatrix(const osg::RefMatrix* matrix) 
     193        { 
     194            if (_modelView!=matrix) 
     195            { 
    170196                if (matrix) 
    171197                { 
    172                     _projection=matrix; 
    173                     glLoadMatrix(matrix->ptr()); 
     198                    _modelView=matrix; 
    174199                } 
    175200                else 
    176201                { 
    177                     _projection=_identity; 
    178                     glLoadIdentity(); 
    179                 } 
    180                 glMatrixMode( GL_MODELVIEW ); 
    181             } 
    182         } 
    183  
    184         inline const osg::Matrix& getProjectionMatrix() const 
    185         { 
    186             return *_projection; 
    187         } 
    188  
    189         inline void applyModelViewMatrix(const osg::RefMatrix* matrix) 
    190         { 
    191             if (_modelView!=matrix) 
    192             { 
    193                 if (matrix) 
    194                 { 
    195                     _modelView=matrix; 
    196                     glLoadMatrix(matrix->ptr()); 
    197                 } 
    198                 else 
    199                 { 
    200202                    _modelView=_identity; 
    201                     glLoadIdentity(); 
    202                 } 
     203                } 
     204 
     205                if (_modelViewMatrixUniform.valid()) _modelViewMatrixUniform->set(*_modelView); 
     206                if (_modelViewProjectionMatrixUniform.valid()) _modelViewProjectionMatrixUniform->set((*_modelView) * (*_projection)); 
     207 
     208                glLoadMatrix(_modelView->ptr()); 
    203209            } 
    204210        } 
     
    208214            return *_modelView; 
    209215        } 
     216 
     217        void applyModelViewAndProjectionUniformsIfRequired(); 
     218 
     219        osg::Uniform* getModelViewMatrixUniform() { return _modelViewMatrixUniform.get(); } 
     220        osg::Uniform* getProjectionMatrixUniform() { return _projectionMatrixUniform.get(); } 
     221        osg::Uniform* getModelViewProjectionMatrixUniform() { return _modelViewProjectionMatrixUniform.get(); } 
    210222 
    211223 
     
    10881100        ref_ptr<const RefMatrix>    _projection; 
    10891101        ref_ptr<const RefMatrix>    _modelView; 
     1102 
     1103        ref_ptr<Uniform>            _modelViewMatrixUniform; 
     1104        ref_ptr<Uniform>            _projectionMatrixUniform; 
     1105        ref_ptr<Uniform>            _modelViewProjectionMatrixUniform; 
    10901106 
    10911107        Matrix                      _initialInverseViewMatrix;