diff --git a/include/osgUtil/SceneView b/include/osgUtil/SceneView index f08dee03c..dd1f5d617 100644 --- a/include/osgUtil/SceneView +++ b/include/osgUtil/SceneView @@ -135,10 +135,12 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced, public osg::CullSetting { FRAME_NUMBER_UNIFORM = 0x1, FRAME_TIME_UNIFORM = 0x2, - VIEW_MATRIX_UNIFORM = 0x4, - INVERSE_VIEW_MATRIX_UNIFORM = 0x8, + DELTA_FRAME_TIME_UNIFORM = 0x4, + VIEW_MATRIX_UNIFORM = 0x8, + INVERSE_VIEW_MATRIX_UNIFORM = 0x16, DEFAULT_UNIFORMS = FRAME_NUMBER_UNIFORM | FRAME_TIME_UNIFORM | + DELTA_FRAME_TIME_UNIFORM | VIEW_MATRIX_UNIFORM | INVERSE_VIEW_MATRIX_UNIFORM, ALL_UNIFORMS = 0xFFFFFFFF @@ -507,7 +509,8 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced, public osg::CullSetting bool _requiresFlush; - int _activeUniforms; + int _activeUniforms; + double _previousFrameTime; }; diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index b1cc34f51..339a60923 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -54,6 +54,8 @@ SceneView::SceneView(DisplaySettings* ds) _requiresFlush = true; _activeUniforms = DEFAULT_UNIFORMS; + + _previousFrameTime = 0; } @@ -207,7 +209,16 @@ void SceneView::updateUniforms() osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_FrameTime",osg::Uniform::FLOAT); uniform->set(static_cast(_frameStamp->getReferenceTime())); } - + + if ((_activeUniforms & DELTA_FRAME_TIME_UNIFORM) && _frameStamp.valid()) + { + float delta_frame_time = (_previousFrameTime != 0.0) ? static_cast(_frameStamp->getReferenceTime()-_previousFrameTime) : 0.0f; + _previousFrameTime = _frameStamp->getReferenceTime(); + + osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_DeltaFrameTime",osg::Uniform::FLOAT); + uniform->set(delta_frame_time); + } + if (_activeUniforms & VIEW_MATRIX_UNIFORM) { osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_ViewMatrix",osg::Uniform::FLOAT_MAT4);