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:
Robert Osfield
2007-05-14 15:07:04 +00:00
parent 43549f3df6
commit 701ea582e5
3 changed files with 54 additions and 218 deletions

View File

@@ -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);