diff --git a/include/osgViewer/ViewerEventHandlers b/include/osgViewer/ViewerEventHandlers index bbe87bd04..ea567702b 100644 --- a/include/osgViewer/ViewerEventHandlers +++ b/include/osgViewer/ViewerEventHandlers @@ -379,6 +379,29 @@ class OSGVIEWER_EXPORT LODScaleHandler : public osgGA::GUIEventHandler int _keyEventDecreaseLODScale; +}; + +/** Event handler for toggling SyncToVBlank.*/ +class OSGVIEWER_EXPORT ToggleSyncToVBlankHandler : public osgGA::GUIEventHandler +{ + public: + + ToggleSyncToVBlankHandler(); + + void setKeyEventToggleSyncToVBlankHandler(int key) { _keyEventToggleSyncToVBlank = key; } + int getKeyEventToggleSyncToVBlankHandler() const { return _keyEventToggleSyncToVBlank; } + + bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa); + + /** Get the keyboard and mouse usage of this manipulator.*/ + virtual void getUsage(osg::ApplicationUsage& usage) const; + + protected: + + + int _keyEventToggleSyncToVBlank; + + }; diff --git a/include/osgViewer/api/Cocoa/GraphicsWindowCocoa b/include/osgViewer/api/Cocoa/GraphicsWindowCocoa index 54510c074..ae847342f 100644 --- a/include/osgViewer/api/Cocoa/GraphicsWindowCocoa +++ b/include/osgViewer/api/Cocoa/GraphicsWindowCocoa @@ -163,7 +163,7 @@ class GraphicsWindowCocoa : public osgViewer::GraphicsWindow, public osgViewer:: GraphicsWindowCocoaWindow* getWindow() { return _window; } NSOpenGLPixelFormat* getPixelFormat() { return _pixelformat; } - void setVSync(bool f); + virtual void setSyncToVBlank(bool f); /** adapts a resize / move of the window, coords in global screen space */ void adaptResize(int x, int y, int w, int h); diff --git a/src/osgViewer/GraphicsWindowCocoa.mm b/src/osgViewer/GraphicsWindowCocoa.mm index ea986eb81..b653ac381 100644 --- a/src/osgViewer/GraphicsWindowCocoa.mm +++ b/src/osgViewer/GraphicsWindowCocoa.mm @@ -1048,7 +1048,7 @@ bool GraphicsWindowCocoa::realizeImplementation() useCursor(_traits->useCursor); setWindowName(_traits->windowName); - setVSync(_traits->vsync); + setSyncToVBlank(_traits->vsync); MenubarController::instance()->update(); @@ -1419,11 +1419,12 @@ void GraphicsWindowCocoa::setCursor(MouseCursor mouseCursor) // ---------------------------------------------------------------------------------------------------------- -// setVSync +// setSyncToVBlank // ---------------------------------------------------------------------------------------------------------- -void GraphicsWindowCocoa::setVSync(bool f) +void GraphicsWindowCocoa::setSyncToVBlank(bool f) { + if (_traits.valid()) _traits->vsync = f; GLint VBL(f?1:0); [_context setValues:&VBL forParameter:NSOpenGLCPSwapInterval]; } diff --git a/src/osgViewer/ViewerEventHandlers.cpp b/src/osgViewer/ViewerEventHandlers.cpp index c31663812..715bd5988 100644 --- a/src/osgViewer/ViewerEventHandlers.cpp +++ b/src/osgViewer/ViewerEventHandlers.cpp @@ -626,6 +626,66 @@ void LODScaleHandler::getUsage(osg::ApplicationUsage& usage) const } } +ToggleSyncToVBlankHandler::ToggleSyncToVBlankHandler(): + _keyEventToggleSyncToVBlank('v') +{ +} + +bool ToggleSyncToVBlankHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) +{ + osgViewer::View* view = dynamic_cast(&aa); + if (!view) return false; + + osgViewer::ViewerBase* viewer = view->getViewerBase(); + + if (viewer == NULL) + { + return false; + } + + if (ea.getHandled()) return false; + + switch(ea.getEventType()) + { + case(osgGA::GUIEventAdapter::KEYUP): + { + if (ea.getKey() == _keyEventToggleSyncToVBlank) + { + // Increase resolution + osgViewer::Viewer::Windows windows; + + viewer->getWindows(windows); + for(osgViewer::Viewer::Windows::iterator itr = windows.begin(); + itr != windows.end(); + ++itr) + { + (*itr)->setSyncToVBlank( !(*itr)->getSyncToVBlank() ); + } + + aa.requestRedraw(); + return true; + } + + break; + } + default: + break; + } + + return false; +} + + +void ToggleSyncToVBlankHandler::getUsage(osg::ApplicationUsage& usage) const +{ + { + std::ostringstream ostr; + ostr<