From 701ea582e5488c1a3370299eeaa08e08695ca55a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 14 May 2007 15:07:04 +0000 Subject: [PATCH] Renamed the ScreenHandler to WindowSizeHandler, fixed the code style to be conform more to the rest of the OSG, and moved the osgviewer across to using the event handlers in osgViewer. --- applications/osgviewer/osgviewer.cpp | 175 +-------------------------- include/osgViewer/ViewerEventHandler | 35 +++--- src/osgViewer/ViewerEventHandler.cpp | 62 +++++----- 3 files changed, 54 insertions(+), 218 deletions(-) diff --git a/applications/osgviewer/osgviewer.cpp b/applications/osgviewer/osgviewer.cpp index 1f3a662ae..a0f8c2b8b 100644 --- a/applications/osgviewer/osgviewer.cpp +++ b/applications/osgviewer/osgviewer.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -30,172 +31,6 @@ #include -class ThreadingHandler : public osgGA::GUIEventHandler -{ -public: - - ThreadingHandler() - { - _tickOrLastKeyPress = osg::Timer::instance()->tick(); - } - - - bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) - { - osgViewer::Viewer* viewer = dynamic_cast(&aa); - if (!viewer) return false; - - switch(ea.getEventType()) - { - case(osgGA::GUIEventAdapter::KEYUP): - { - - double delta = osg::Timer::instance()->delta_s(_tickOrLastKeyPress, osg::Timer::instance()->tick()); - - if (ea.getKey()=='m' && delta>1.0) - { - - _tickOrLastKeyPress = osg::Timer::instance()->tick(); - - switch(viewer->getThreadingModel()) - { - case(osgViewer::Viewer::SingleThreaded): - viewer->setThreadingModel(osgViewer::Viewer::CullDrawThreadPerContext); - osg::notify(osg::NOTICE)<<"Threading model 'CullDrawThreadPerContext' selected."<setThreadingModel(osgViewer::Viewer::DrawThreadPerContext); - osg::notify(osg::NOTICE)<<"Threading model 'DrawThreadPerContext' selected."<setThreadingModel(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext); - osg::notify(osg::NOTICE)<<"Threading model 'CullThreadPerCameraDrawThreadPerContext' selected."<setThreadingModel(osgViewer::Viewer::SingleThreaded); - osg::notify(osg::NOTICE)<<"Threading model 'SingleThreaded' selected."<setThreadingModel(viewer->suggestBestThreadingModel()); - osg::notify(osg::NOTICE)<<"Threading model 'AutomaticSelection' selected."<getEndBarrierPosition()) - { - case(osgViewer::Viewer::BeforeSwapBuffers): - viewer->setEndBarrierPosition(osgViewer::Viewer::AfterSwapBuffers); - osg::notify(osg::NOTICE)<<"Threading model 'AfterSwapBuffers' selected."<setEndBarrierPosition(osgViewer::Viewer::BeforeSwapBuffers); - osg::notify(osg::NOTICE)<<"Threading model 'BeforeSwapBuffers' selected."<(&aa); - if (!viewer) return false; - - switch(ea.getEventType()) - { - case(osgGA::GUIEventAdapter::KEYUP): - { - if (ea.getKey()=='f') - { - osgViewer::Viewer::Windows windows; - viewer->getWindows(windows); - - for(osgViewer::Viewer::Windows::iterator itr = windows.begin(); - itr != windows.end(); - ++itr) - { - toggleFullscreen(*itr); - } - } - } - default: break; - } - - return false; - } - - /** Get the keyboard and mouse usage of this manipulator.*/ - virtual void getUsage(osg::ApplicationUsage& usage) const - { - usage.addKeyboardMouseBinding("f","Toggle full screen."); - } - - - void toggleFullscreen(osgViewer::GraphicsWindow* window) - { - - osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); - if (!wsi) - { - osg::notify(osg::NOTICE)<<"Error, no WindowSystemInterface available, cannot toggle window fullscreen."<getScreenResolution(*(window->getTraits()), screen_width, screen_height); - - int x, y, width, height; - window->getWindowRectangle(x, y, width, height); - - bool isFullScreen = x==0 && y==0 && width==screen_width && height==screen_height; - if (isFullScreen) - { - window->setWindowRectangle(screen_width/4, screen_height/4, screen_width/2, screen_height/2); - window->setWindowDecoration(true); - } - else - { - window->setWindowDecoration(false); - window->setWindowRectangle(0, 0, screen_width, screen_height); - } - - window->grabFocusIfPointerInWindow(); - - return; - - } - - - - bool _done; -}; - int main(int argc, char** argv) { // use an ArgumentParser object to manage the program arguments. @@ -271,11 +106,11 @@ int main(int argc, char** argv) viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) ); // add the thread model handler - viewer.addEventHandler(new ThreadingHandler); + viewer.addEventHandler(new osgViewer::ThreadingHandler); - // add the full screen toggle handler - viewer.addEventHandler(new FullScreenToggleHandler); - + // add the window size toggle handler + viewer.addEventHandler(new osgViewer::WindowSizeHandler); + // add the stats handler viewer.addEventHandler(new osgViewer::StatsHandler); diff --git a/include/osgViewer/ViewerEventHandler b/include/osgViewer/ViewerEventHandler index cbd3e041c..e59e2156e 100644 --- a/include/osgViewer/ViewerEventHandler +++ b/include/osgViewer/ViewerEventHandler @@ -18,14 +18,14 @@ namespace osgViewer { - /** - Handler allowing to change the screen resolution (in windowed mode) and toggle between fullscreen and windowed mode. - */ - class OSGVIEWER_EXPORT ScreenHandler : public osgGA::GUIEventHandler - { - public: +/** +Handler allowing to change the screen resolution (in windowed mode) and toggle between fullscreen and windowed mode. +*/ +class OSGVIEWER_EXPORT WindowSizeHandler : public osgGA::GUIEventHandler +{ +public: - ScreenHandler(); + WindowSizeHandler(); /** Get the keyboard and mouse usage of this manipulator.*/ virtual void getUsage(osg::ApplicationUsage &usage) const; @@ -46,7 +46,7 @@ namespace osgViewer { virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); - protected: +protected: void toggleFullscreen(osgViewer::GraphicsWindow *window); void changeWindowedResolution(osgViewer::GraphicsWindow *window, bool increase); @@ -61,14 +61,14 @@ namespace osgViewer { bool _changeWindowedResolution; std::vector _resolutionList; int _currentResolutionIndex; - }; +}; - /** - Handler allowing to change the viewer threading model - */ - class OSGVIEWER_EXPORT ThreadingHandler : public osgGA::GUIEventHandler - { - public: +/** +Handler allowing to change the viewer threading model +*/ +class OSGVIEWER_EXPORT ThreadingHandler : public osgGA::GUIEventHandler +{ +public: ThreadingHandler(); @@ -89,7 +89,7 @@ namespace osgViewer { bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); - protected: +protected: int _keyEventChangeThreadingModel; bool _changeThreadingModel; @@ -99,7 +99,8 @@ namespace osgViewer { osg::Timer_t _tickOrLastKeyPress; bool _done; - }; +}; + } #endif diff --git a/src/osgViewer/ViewerEventHandler.cpp b/src/osgViewer/ViewerEventHandler.cpp index ca1b8471f..35363c071 100644 --- a/src/osgViewer/ViewerEventHandler.cpp +++ b/src/osgViewer/ViewerEventHandler.cpp @@ -18,16 +18,16 @@ namespace osgViewer { /* -** ScreenHandler +** WindowSizeHandler */ -ScreenHandler::ScreenHandler() : -_keyEventToggleFullscreen('f'), -_toggleFullscreen(true), -_keyEventWindowedResolutionUp('>'), -_keyEventWindowedResolutionDown('<'), -_changeWindowedResolution(true), -_currentResolutionIndex(-1) +WindowSizeHandler::WindowSizeHandler() : + _keyEventToggleFullscreen('f'), + _toggleFullscreen(true), + _keyEventWindowedResolutionUp('>'), + _keyEventWindowedResolutionDown('<'), + _changeWindowedResolution(true), + _currentResolutionIndex(-1) { _resolutionList.push_back(osg::Vec2(640, 480)); _resolutionList.push_back(osg::Vec2(800, 600)); @@ -50,20 +50,20 @@ _currentResolutionIndex(-1) _resolutionList.push_back(osg::Vec2(3840, 2400)); } -void ScreenHandler::getUsage(osg::ApplicationUsage &usage) const +void WindowSizeHandler::getUsage(osg::ApplicationUsage &usage) const { usage.addKeyboardMouseBinding("f", "Toggle full screen."); usage.addKeyboardMouseBinding(">", "Increase the screen resolution (in windowed mode)."); usage.addKeyboardMouseBinding("<", "Decrease the screen resolution (in windowed mode)."); } -bool ScreenHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) +bool WindowSizeHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { osgViewer::Viewer *viewer = dynamic_cast(&aa); if (viewer == NULL) { - return (false); + return false; } switch(ea.getEventType()) @@ -79,9 +79,9 @@ bool ScreenHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAda itr != windows.end(); ++itr) { - this->toggleFullscreen(*itr); + toggleFullscreen(*itr); } - return (true); + return true; } else if (_changeWindowedResolution == true && ea.getKey() == _keyEventWindowedResolutionUp) { @@ -93,9 +93,9 @@ bool ScreenHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAda itr != windows.end(); ++itr) { - this->changeWindowedResolution(*itr, true); + changeWindowedResolution(*itr, true); } - return (true); + return true; } else if (_changeWindowedResolution == true && ea.getKey() == _keyEventWindowedResolutionDown) { @@ -107,19 +107,19 @@ bool ScreenHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAda itr != windows.end(); ++itr) { - this->changeWindowedResolution(*itr, false); + changeWindowedResolution(*itr, false); } - return (true); + return true; } break; } default: break; } - return (false); + return false; } -void ScreenHandler::toggleFullscreen(osgViewer::GraphicsWindow *window) +void WindowSizeHandler::toggleFullscreen(osgViewer::GraphicsWindow *window) { osg::GraphicsContext::WindowingSystemInterface *wsi = osg::GraphicsContext::getWindowingSystemInterface(); @@ -149,7 +149,7 @@ void ScreenHandler::toggleFullscreen(osgViewer::GraphicsWindow *window) if (_currentResolutionIndex == -1) { - _currentResolutionIndex = this->getNearestResolution(screenWidth, screenHeight, screenWidth / 2, screenHeight / 2); + _currentResolutionIndex = getNearestResolution(screenWidth, screenHeight, screenWidth / 2, screenHeight / 2); } resolution = _resolutionList[_currentResolutionIndex]; window->setWindowDecoration(true); @@ -165,7 +165,7 @@ void ScreenHandler::toggleFullscreen(osgViewer::GraphicsWindow *window) window->grabFocusIfPointerInWindow(); } -void ScreenHandler::changeWindowedResolution(osgViewer::GraphicsWindow *window, bool increase) +void WindowSizeHandler::changeWindowedResolution(osgViewer::GraphicsWindow *window, bool increase) { osg::GraphicsContext::WindowingSystemInterface *wsi = osg::GraphicsContext::getWindowingSystemInterface(); @@ -195,7 +195,7 @@ void ScreenHandler::changeWindowedResolution(osgViewer::GraphicsWindow *window, if (_currentResolutionIndex == -1) { - _currentResolutionIndex = this->getNearestResolution(screenWidth, screenHeight, width, height); + _currentResolutionIndex = getNearestResolution(screenWidth, screenHeight, width, height); } if (increase == true) @@ -232,7 +232,7 @@ void ScreenHandler::changeWindowedResolution(osgViewer::GraphicsWindow *window, } } -unsigned int ScreenHandler::getNearestResolution(int screenWidth, int screenHeight, int width, int height) const +unsigned int WindowSizeHandler::getNearestResolution(int screenWidth, int screenHeight, int width, int height) const { unsigned int position = 0; unsigned int result = 0; @@ -261,10 +261,10 @@ unsigned int ScreenHandler::getNearestResolution(int screenWidth, int screenHeig */ ThreadingHandler::ThreadingHandler() : -_keyEventChangeThreadingModel('m'), -_changeThreadingModel(true), -_keyEventChangeEndBarrierPosition('e'), -_changeEndBarrierPosition(true) + _keyEventChangeThreadingModel('m'), + _changeThreadingModel(true), + _keyEventChangeEndBarrierPosition('e'), + _changeEndBarrierPosition(true) { _tickOrLastKeyPress = osg::Timer::instance()->tick(); } @@ -281,7 +281,7 @@ bool ThreadingHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIAction if (viewer == NULL) { - return (false); + return false; } switch(ea.getEventType()) @@ -317,7 +317,7 @@ bool ThreadingHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIAction osg::notify(osg::NOTICE)<<"Threading model 'AutomaticSelection' selected."<