/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This application is open source and may be redistributed and/or modified * freely and without restriction, both in commericial and non commericial applications, * as long as this copyright notice is maintained. * * This application is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include #include #include #include #include #include #include #include #include #include #include #include class CEGUIDrawable : public osg::Drawable { public: CEGUIDrawable(); /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ CEGUIDrawable(const CEGUIDrawable& drawable,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): Drawable(drawable,copyop) {} META_Object(osg,CEGUIDrawable); void loadScheme(const std::string& scheme); void loadFont(const std::string& font); void loadLayout(const std::string& layout); void drawImplementation(osg::State& state) const; protected: virtual ~CEGUIDrawable(); unsigned int _activeContextID; }; struct CEGUIEventCallback : public osgGA::GUIEventHandler { CEGUIEventCallback() {} /** do customized Event code. */ virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv) { osgGA::EventVisitor* ev = dynamic_cast(nv); CEGUIDrawable* cd = dynamic_cast(obj); if (!ev || !cd) return false; switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::DRAG): case(osgGA::GUIEventAdapter::MOVE): CEGUI::System::getSingleton().injectMousePosition(ea.getX(),ea.getY()); return true; case(osgGA::GUIEventAdapter::PUSH): { CEGUI::System::getSingleton().injectMousePosition(ea.getX(), ea.getY()); if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton); else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton); else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton); return true; } case(osgGA::GUIEventAdapter::RELEASE): { CEGUI::System::getSingleton().injectMousePosition(ea.getX(), ea.getY()); if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton); else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton); else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton); return true; } case(osgGA::GUIEventAdapter::DOUBLECLICK): { // do we need to do something special here to handle double click??? Will just assume button down for now. CEGUI::System::getSingleton().injectMousePosition(ea.getX(), ea.getY()); if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton); else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton); else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton); return true; } case(osgGA::GUIEventAdapter::KEYDOWN): CEGUI::System::getSingleton().injectKeyDown( static_cast(ea.getKey()) ); CEGUI::System::getSingleton().injectChar( static_cast( ea.getKey() ) ); return true; case(osgGA::GUIEventAdapter::KEYUP): CEGUI::System::getSingleton().injectKeyUp( static_cast(ea.getKey()) ); return true; default: break; } return false; } }; CEGUIDrawable::CEGUIDrawable() { setSupportsDisplayList(false); setEventCallback(new CEGUIEventCallback()); new CEGUI::System( new CEGUI::OpenGLRenderer(0) ); _activeContextID = 0; } CEGUIDrawable::~CEGUIDrawable() { // delete CEGUI?? } void CEGUIDrawable::loadScheme(const std::string& scheme) { try { CEGUI::SchemeManager::getSingleton().loadScheme(scheme.c_str()); } catch (CEGUI::Exception e) { std::cout<<"CEGUIDrawable::loadScheme Error: "<setApplicationName(arguments.getApplicationName()); arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the standard OpenSceneGraph example which loads and visualises 3d models."); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); arguments.getApplicationUsage()->addCommandLineOption("--image ","Load an image and render it on a quad"); arguments.getApplicationUsage()->addCommandLineOption("--dem ","Load an image/DEM and render it on a HeightField"); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display command line parameters"); arguments.getApplicationUsage()->addCommandLineOption("--help-env","Display environmental variables available"); arguments.getApplicationUsage()->addCommandLineOption("--help-keys","Display keyboard & mouse bindings available"); arguments.getApplicationUsage()->addCommandLineOption("--help-all","Display all command line, env vars and keyboard & mouse bindings."); // construct the viewer. osgProducer::Viewer viewer(arguments); // set up the value with sensible default event handlers. viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); // get details on keyboard and mouse bindings used by the viewer. viewer.getUsage(*arguments.getApplicationUsage()); // if user request help write it out to cout. bool helpAll = arguments.read("--help-all"); unsigned int helpType = ((helpAll || arguments.read("-h") || arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) | ((helpAll || arguments.read("--help-env"))? osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE : 0 ) | ((helpAll || arguments.read("--help-keys"))? osg::ApplicationUsage::KEYBOARD_MOUSE_BINDING : 0 ); if (helpType) { arguments.getApplicationUsage()->write(std::cout, helpType); return 1; } osg::ref_ptr geode = new osg::Geode; osg::ref_ptr cd = new CEGUIDrawable(); geode->addDrawable(cd.get()); std::string scheme; while(arguments.read("--scheme",scheme)) { cd->loadScheme(scheme); } std::string font; while(arguments.read("--font",font)) { cd->loadFont(font); } std::string layout; while(arguments.read("--layout",layout)) { cd->loadLayout(layout); } // report any errors if they have occurred when parsing the program arguments. if (arguments.errors()) { arguments.writeErrorMessages(std::cout); return 1; } if (arguments.argc()<=1) { arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION); return 1; } osg::Timer_t start_tick = osg::Timer::instance()->tick(); // read the scene from the list of file specified command line args. osg::ref_ptr loadedModel = osgDB::readNodeFiles(arguments); // if no model has been successfully loaded report failure. if (!loadedModel) { std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl; return 1; } osg::ref_ptr group = new osg::Group; group->addChild(loadedModel.get()); group->addChild(geode.get()); // any option left unread are converted into errors to write out later. arguments.reportRemainingOptionsAsUnrecognized(); // report any errors if they have occurred when parsing the program arguments. if (arguments.errors()) { arguments.writeErrorMessages(std::cout); } osg::Timer_t end_tick = osg::Timer::instance()->tick(); std::cout << "Time to load = "<delta_s(start_tick,end_tick)<