#include #include #include "customviewereventhandler.h" using namespace osg; CustomViewerEventHandler::CustomViewerEventHandler(osgProducer::OsgCameraGroup* cg) : osgProducer::ViewerEventHandler(cg) { } void CustomViewerEventHandler::getUsage(osg::ApplicationUsage& usage) const { usage.addKeyboardMouseBinding("f","Toggle fullscreen"); usage.addKeyboardMouseBinding("h","Display help"); usage.addKeyboardMouseBinding("O/PrintScreen","Screen capture to \"saved_image*.jpg\""); usage.addKeyboardMouseBinding("Space","Toggle surface data time stepping"); usage.addKeyboardMouseBinding("c","Toggle steep surface triangle culling"); usage.addKeyboardMouseBinding("w","Toggle wireframe mode for surface triangles"); usage.addKeyboardMouseBinding("1","Toggle recording."); usage.addKeyboardMouseBinding("2","Toggle playback of recorded information"); usage.addKeyboardMouseBinding("3","Save recorded macro to \"movie.swm\""); } bool CustomViewerEventHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { if(!_cg) return false; if(ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN) { switch( ea.getKey() ) { case 's' : { FrameStatsMode newFrameStatsMode = (FrameStatsMode)((_frameStatsMode+1)%3); setFrameStatsMode(newFrameStatsMode); return true; } case 'f' : { Producer::CameraConfig* cfg = _cg->getCameraConfig(); bool shouldBeFullScreen = false; bool flag = true; for( unsigned int i = 0; i < cfg->getNumberOfCameras(); ++i ) { Producer::Camera *cam = cfg->getCamera(i); Producer::RenderSurface* rs = cam->getRenderSurface(); if( rs->getDrawableType() != Producer::RenderSurface::DrawableType_Window ) continue; if( flag ) { shouldBeFullScreen =! rs->isFullScreen(); // Remember the initial state of the first render surface flag = false; } if ( shouldBeFullScreen!=rs->isFullScreen() ) // If the current render surface hasn't been modified already { if (_firstTimeTogglingFullScreen && rs->isFullScreen()) { unsigned int screenWidth; unsigned int screenHeight; unsigned int windowWidth; unsigned int windowHeight; rs->getScreenSize( screenWidth, screenHeight ); if( screenHeight > screenWidth ) { windowWidth = (unsigned int)((float)screenWidth * 0.625); windowHeight = (unsigned int)((float)windowWidth * 0.75); } else { windowHeight = (unsigned int)((float)screenHeight * 0.625); windowWidth = (unsigned int)((float)windowHeight * 1.334); } int x = (screenWidth - windowWidth) >> 1; int y = (screenHeight - windowHeight) >> 1; #ifndef WIN32 rs->useBorder(true); #else rs->fullScreen(false); #endif rs->setWindowRectangle( x, y, windowWidth, windowHeight ); } else { rs->fullScreen(!rs->isFullScreen()); } } } _firstTimeTogglingFullScreen = false; return true; } case osgGA::GUIEventAdapter::KEY_Print : case 'O' : { setWriteImageOnNextFrame(true); return true; } case '+' : { //_camera->setFusionDistanceRatio(_camera->getFusionDistanceRatio()*1.25f); return true; } case '-' : { //_camera->setFusionDistanceRatio(_camera->getFusionDistanceRatio()/1.25f); return true; } case osgGA::GUIEventAdapter::KEY_Help : case 'h' : { setDisplayHelp(!getDisplayHelp()); return true; } default: break; } } return false; }