diff --git a/src/osgProducer/ViewerEventHandler.cpp b/src/osgProducer/ViewerEventHandler.cpp index 18942db64..cd5a472a0 100644 --- a/src/osgProducer/ViewerEventHandler.cpp +++ b/src/osgProducer/ViewerEventHandler.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -67,6 +68,11 @@ public: _stateset = new osg::StateSet; _viewport = new osg::Viewport(0,0,1280,1024); _stateset->setAttribute(_viewport.get()); + _stateset->setAttribute(new osg::BlendFunc()); + _stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); + + _projection = new osg::RefMatrix(osg::Matrix::ortho2D(0.0,1280,0,1024)); + _modelview = new osg::RefMatrix(); //createHelpText(); //createStatsText(); @@ -93,6 +99,8 @@ protected: osg::ref_ptr _stateset; osg::ref_ptr _viewport; + osg::ref_ptr _projection; + osg::ref_ptr _modelview; // help related methods and data void displayHelp(); @@ -120,6 +128,7 @@ protected: TextList _cullTimeText; CameraTimes _drawTimes; TextList _drawTimeText; + std::vector _fs; unsigned int _index; @@ -139,17 +148,27 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::operator()( const Producer::C OsgSceneHandler* osh = _veh->getOsgCameraGroup()->getSceneHandlerList()[_cameraNumber].get(); osgUtil::SceneView* sv = osh->getSceneView(); - sv->getState()->pushStateSet(_stateset.get()); - - if (_veh->getDisplayHelp()) displayHelp(); + osg::State& state = *(sv->getState()); + + state.applyProjectionMatrix(_projection.get()); + state.applyModelViewMatrix(_modelview.get()); + + state.pushStateSet(_stateset.get()); + state.apply(); + if (_veh->getFrameStatsMode()!=ViewerEventHandler::NO_STATS && camera.getInstrumentationMode()) { - sv->getState()->apply(); displayStats(); } + + if (_veh->getDisplayHelp()) + { + displayHelp(); + } + - sv->getState()->popStateSet(); + state.popStateSet(); } @@ -160,23 +179,6 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayHelp() OsgSceneHandler* osh = _veh->getOsgCameraGroup()->getSceneHandlerList()[_cameraNumber].get(); osgUtil::SceneView* sv = osh->getSceneView(); - // should possibly update _viewport... - - // Set up the Orthographic view - glMatrixMode( GL_PROJECTION ); - glPushMatrix(); - glLoadIdentity(); - glOrtho( 0.0, 1280.0, 0.0, 1024, -1.0, 1.0 ); - - glPushAttrib( GL_ENABLE_BIT ); - glDisable( GL_LIGHTING ); - glDisable( GL_DEPTH_TEST ); - glEnable( GL_BLEND ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - for(TextList::iterator ditr=_descriptionList.begin(); ditr!=_descriptionList.end(); @@ -198,14 +200,6 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayHelp() { (*eitr)->draw(*(sv->getState())); } - - - glPopMatrix(); - glMatrixMode( GL_PROJECTION ); - glPopMatrix(); - glMatrixMode( GL_MODELVIEW ); - - glPopAttrib(); } void ViewerEventHandler::StatsAndHelpDrawCallback::createHelpText() @@ -364,103 +358,6 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats() OsgSceneHandler* osh = _veh->getOsgCameraGroup()->getSceneHandlerList()[_cameraNumber].get(); osgUtil::SceneView* sv = osh->getSceneView(); - // render the text - if (_veh->getFrameStatsMode()>=ViewerEventHandler::FRAME_RATE) - { - // Set up the Orthographic view - glMatrixMode( GL_PROJECTION ); - glPushMatrix(); - glLoadIdentity(); - glOrtho( 0.0, 1280.0, 0.0, 1024, -1.0, 1.0 ); - - glPushAttrib( GL_ENABLE_BIT ); - glDisable( GL_LIGHTING ); - glDisable( GL_DEPTH_TEST ); - glEnable( GL_BLEND ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); - - - // update and draw the frame rate text. - - char tmpText[128]; - - _frameRateLabelText->draw(*(sv->getState())); - - if (_fs.size()>1) - { - unsigned int lindex = (_index + 1) % _fs.size(); - double timeForFrames = (_fs[_index]._startOfFrame-_fs[lindex]._startOfFrame); - double timePerFrame = timeForFrames/(double)(_fs.size()-1); - sprintf(tmpText,"%4.2f",1.0/timePerFrame); - _frameRateCounterText->setText(tmpText); - } - _frameRateCounterText->draw(*(sv->getState())); - - - if (_veh->getFrameStatsMode()>=ViewerEventHandler::CAMERA_STATS) - { - - TextList::iterator itr; - for(itr=_statsLabelList.begin(); - itr!=_statsLabelList.end(); - ++itr) - { - (*itr)->draw(*(sv->getState())); - } - - double updateTime = 0.0; - std::fill(_cullTimes.begin(),_cullTimes.end(),0.0); - std::fill(_drawTimes.begin(),_drawTimes.end(),0.0); - - for(unsigned int frame = 0; frame < _fs.size(); frame++ ) - { - Producer::CameraGroup::FrameStats fs = _fs[frame]; - updateTime += (fs._endOfUpdate-fs._startOfUpdate); - - for(unsigned int i = 0; i < fs.getNumFrameTimeStampSets(); i++ ) - { - Producer::Camera::FrameTimeStampSet fts = fs.getFrameTimeStampSet(i); - - _cullTimes[i] += fts[Producer::Camera::EndCull]-fts[Producer::Camera::BeginCull]; - _drawTimes[i] += fts[Producer::Camera::EndDraw]-fts[Producer::Camera::BeginDraw]; - } - } - - sprintf(tmpText,"%4.2f",1000.0*updateTime/(double)_fs.size()); - _updateTimeText->setText(tmpText); - - _updateTimeText->draw(*(sv->getState())); - - CameraTimes::iterator titr; - for(itr=_cullTimeText.begin(),titr = _cullTimes.begin(); - itr!=_cullTimeText.end() && titr!=_cullTimes.end(); - ++itr,++titr) - { - sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size()); - (*itr)->setText(tmpText); - (*itr)->draw(*(sv->getState())); - } - for(itr=_drawTimeText.begin(),titr = _drawTimes.begin(); - itr!=_drawTimeText.end() && titr!=_cullTimes.end(); - ++itr,++titr) - { - sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size()); - (*itr)->setText(tmpText); - (*itr)->draw(*(sv->getState())); - } - } - - glPopMatrix(); - glMatrixMode( GL_PROJECTION ); - glPopMatrix(); - glMatrixMode( GL_MODELVIEW ); - - glPopAttrib(); - } - // render graphs if (_veh->getFrameStatsMode()>=ViewerEventHandler::CAMERA_STATS) { @@ -471,14 +368,6 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats() glLoadIdentity(); glOrtho( -.025, .128, 600.0, -10.0, -1.0, 1.0 ); - glPushAttrib( GL_ENABLE_BIT ); - glDisable( GL_LIGHTING ); - glDisable( GL_DEPTH_TEST ); - glEnable( GL_BLEND ); - - glMatrixMode( GL_MODELVIEW ); - glPushMatrix(); - glLoadIdentity(); unsigned int lindex = (_index + 1) % _fs.size(); Producer::Camera::TimeStamp zero = _fs[lindex]._startOfFrame; @@ -565,14 +454,87 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats() glEnd(); - glPopMatrix(); glMatrixMode( GL_PROJECTION ); glPopMatrix(); glMatrixMode( GL_MODELVIEW ); - - glPopAttrib(); } + + // render the text + if (_veh->getFrameStatsMode()>=ViewerEventHandler::FRAME_RATE) + { + // update and draw the frame rate text. + + char tmpText[128]; + + _frameRateLabelText->draw(*(sv->getState())); + + if (_fs.size()>1) + { + unsigned int lindex = (_index + 1) % _fs.size(); + double timeForFrames = (_fs[_index]._startOfFrame-_fs[lindex]._startOfFrame); + double timePerFrame = timeForFrames/(double)(_fs.size()-1); + sprintf(tmpText,"%4.2f",1.0/timePerFrame); + _frameRateCounterText->setText(tmpText); + } + _frameRateCounterText->draw(*(sv->getState())); + + + if (_veh->getFrameStatsMode()>=ViewerEventHandler::CAMERA_STATS) + { + + TextList::iterator itr; + for(itr=_statsLabelList.begin(); + itr!=_statsLabelList.end(); + ++itr) + { + (*itr)->draw(*(sv->getState())); + } + + double updateTime = 0.0; + std::fill(_cullTimes.begin(),_cullTimes.end(),0.0); + std::fill(_drawTimes.begin(),_drawTimes.end(),0.0); + + for(unsigned int frame = 0; frame < _fs.size(); frame++ ) + { + Producer::CameraGroup::FrameStats fs = _fs[frame]; + updateTime += (fs._endOfUpdate-fs._startOfUpdate); + + for(unsigned int i = 0; i < fs.getNumFrameTimeStampSets(); i++ ) + { + Producer::Camera::FrameTimeStampSet fts = fs.getFrameTimeStampSet(i); + + _cullTimes[i] += fts[Producer::Camera::EndCull]-fts[Producer::Camera::BeginCull]; + _drawTimes[i] += fts[Producer::Camera::EndDraw]-fts[Producer::Camera::BeginDraw]; + } + } + + sprintf(tmpText,"%4.2f",1000.0*updateTime/(double)_fs.size()); + _updateTimeText->setText(tmpText); + + _updateTimeText->draw(*(sv->getState())); + + CameraTimes::iterator titr; + for(itr=_cullTimeText.begin(),titr = _cullTimes.begin(); + itr!=_cullTimeText.end() && titr!=_cullTimes.end(); + ++itr,++titr) + { + sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size()); + (*itr)->setText(tmpText); + (*itr)->draw(*(sv->getState())); + } + for(itr=_drawTimeText.begin(),titr = _drawTimes.begin(); + itr!=_drawTimeText.end() && titr!=_cullTimes.end(); + ++itr,++titr) + { + sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size()); + (*itr)->setText(tmpText); + (*itr)->draw(*(sv->getState())); + } + } + + } + } void ViewerEventHandler::StatsAndHelpDrawCallback::createStatsText()