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.
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include <osgViewer/Viewer>
|
||||
#include <osgViewer/StatsHandler>
|
||||
#include <osgViewer/HelpHandler>
|
||||
#include <osgViewer/ViewerEventHandler>
|
||||
|
||||
#include <osgGA/TrackballManipulator>
|
||||
#include <osgGA/FlightManipulator>
|
||||
@@ -30,172 +31,6 @@
|
||||
|
||||
#include <iostream>
|
||||
|
||||
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<osgViewer::Viewer*>(&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."<<std::endl;
|
||||
break;
|
||||
case(osgViewer::Viewer::CullDrawThreadPerContext):
|
||||
viewer->setThreadingModel(osgViewer::Viewer::DrawThreadPerContext);
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'DrawThreadPerContext' selected."<<std::endl;
|
||||
break;
|
||||
case(osgViewer::Viewer::DrawThreadPerContext):
|
||||
viewer->setThreadingModel(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext);
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'CullThreadPerCameraDrawThreadPerContext' selected."<<std::endl;
|
||||
break;
|
||||
case(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext):
|
||||
viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'SingleThreaded' selected."<<std::endl;
|
||||
break;
|
||||
case(osgViewer::Viewer::AutomaticSelection):
|
||||
viewer->setThreadingModel(viewer->suggestBestThreadingModel());
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'AutomaticSelection' selected."<<std::endl;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (ea.getKey()=='e')
|
||||
{
|
||||
switch(viewer->getEndBarrierPosition())
|
||||
{
|
||||
case(osgViewer::Viewer::BeforeSwapBuffers):
|
||||
viewer->setEndBarrierPosition(osgViewer::Viewer::AfterSwapBuffers);
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'AfterSwapBuffers' selected."<<std::endl;
|
||||
break;
|
||||
case(osgViewer::Viewer::AfterSwapBuffers):
|
||||
viewer->setEndBarrierPosition(osgViewer::Viewer::BeforeSwapBuffers);
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'BeforeSwapBuffers' selected."<<std::endl;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Get the keyboard and mouse usage of this manipulator.*/
|
||||
virtual void getUsage(osg::ApplicationUsage& usage) const
|
||||
{
|
||||
usage.addKeyboardMouseBinding("m","Toggle threading model.");
|
||||
usage.addKeyboardMouseBinding("e","Toggle the placement of the end of frame barrier.");
|
||||
}
|
||||
|
||||
osg::Timer_t _tickOrLastKeyPress;
|
||||
bool _done;
|
||||
};
|
||||
|
||||
|
||||
class FullScreenToggleHandler : public osgGA::GUIEventHandler
|
||||
{
|
||||
public:
|
||||
|
||||
FullScreenToggleHandler() {}
|
||||
|
||||
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
|
||||
{
|
||||
osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&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."<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int screen_width, screen_height;
|
||||
wsi->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);
|
||||
|
||||
|
||||
@@ -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<osg::Vec2> _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
|
||||
|
||||
@@ -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<osgViewer::Viewer *>(&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."<<std::endl;
|
||||
break;
|
||||
}
|
||||
return (true);
|
||||
return true;
|
||||
}
|
||||
if (_changeEndBarrierPosition == true && ea.getKey() == _keyEventChangeEndBarrierPosition)
|
||||
{
|
||||
@@ -332,14 +332,14 @@ bool ThreadingHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIAction
|
||||
osg::notify(osg::NOTICE)<<"Threading model 'BeforeSwapBuffers' selected."<<std::endl;
|
||||
break;
|
||||
}
|
||||
return (true);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return (false);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user