/** Run the dynamics for a cycle. */ void run( Real dt ) { // fetch the command in the buffer //get_command(); #ifdef USE_OSG if (ONSCREEN_RENDER) { if (viewer.done()) return; viewer.frame(); } #endif // Note: research how the original driver sets up all the parameters that // drive step size. sim->step(dt) is not sufficient in and of itself so // there must be another or more parameters that manipulate this state info //sim->step( dt ); // step the sim forward STEP_SIZE = dt; step((void*) &sim); // publish any state change //publish_state(); //#ifdef USE_OSG //usleep(DYNAMICS_FREQ); //#endif }
int main(int argc, char** argv) { viewer.setSceneData(root.get()); filename = argv[1]; startMenu = new StartMenu(&viewer, startApplication); root->addChild(startMenu->_camera); if(root.valid()) { //viewer.setCameraManipulator(new osgGA::TrackballManipulator()); viewer.realize(); while(!viewer.done()) { viewer.frame(); //update(); } } else { std::cout << "Invalid Graph!" << std::endl; } return 0; }
// Step the dynamics forward void step( const Real &dt ) { #ifdef USE_OSG if( ONSCREEN_RENDER ) { if( viewer.done( ) ) return; viewer.frame( ); } #endif // step the sim forward STEP_SIZE = dt; step( (void*) &sim ); }
/** Run the dynamics for a cycle. */ void run( void ) { // fetch the command in the buffer get_command(); #ifdef USE_OSG if (ONSCREEN_RENDER) { if (viewer.done()) return; viewer.frame(); } #endif // step the sim forward step((void*) &sim); // publish any state change publish_state(); //#ifdef USE_OSG //usleep(DYNAMICS_FREQ); //#endif }
int main( int argc, char **argv ) { int windowWidth, windowHeight; std::string osgEarthFileName = "D:/Dev/csp/csp/examples/cspEarth/data/srtm.earth"; // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); // Allow a debugger to be attached before the interesting parts start if (arguments.read("-p")) { std::cout << "Attach debugger and press a key..." << std::endl; std::getchar(); } // if an .earth file definition was specified, use this one instead of the default arguments.read("-file", osgEarthFileName); // get screen size arguments.read("-window", windowWidth, windowHeight); // ===================================================================== // SETUP // Make it possible for this application to locate images bound // to textures. std::string search_path = ";"; csp::ospath::addpath(search_path, "./data/images/"); csp::ospath::addpath(search_path, "./data/models/"); csp::ObjectModel::setDataFilePathList(search_path); // Set paths for shader files. Shader::instance()->setShaderPath("./data/shaders/"); // ===================================================================== // Manual creation of a object model. Ref<ObjectModel> my_model = new ObjectModel(); // An external is used to handle the path to the scene graph file. // It is also ensuring that paths is handled independent on operating // system. External modelPath; modelPath.setSource("industry/refinery_column01/refinery_column01.osg"); my_model->setModelPath(modelPath); my_model->setSmooth(true); // Load the model from disc. This will also apply needed shaders. // smoothing and more things. my_model->loadModel(); // read osgEarth config file and create the globe std::cout << "reading osgEarth config file: " << osgEarthFileName << std::endl; osg::ref_ptr<osg::Node> globe = osgDB::readNodeFile(osgEarthFileName); osg::ref_ptr<osg::Node> topNode = new osg::Node; osg::Group* group = new osg::Group; group->setName("root group"); // ===================================================================== // construct the viewer viewer.addEventHandler(new osgViewer::StatsHandler); viewer.addEventHandler(new osgViewer::HelpHandler); viewer.addEventHandler(new osgViewer::WindowSizeHandler); viewer.addEventHandler(new osgViewer::ScreenCaptureHandler); // modify the key mapping of an osg default event handler // this is just to demonstrate the principle, no real use case behind it... osgViewer::View::EventHandlers eventHandlers = viewer.getEventHandlers(); // iterate through the viewer's event handlers and modify their default behavior for (osgViewer::View::EventHandlers::iterator it = eventHandlers.begin(); it != eventHandlers.end(); ++it) { // EventHandlers is a list of osgGA::GUIEventHandlers, so RTTI is used to find out the derived class if(osgViewer::WindowSizeHandler *winSizeHandler = dynamic_cast<osgViewer::WindowSizeHandler *>(it->get())) { winSizeHandler->setKeyEventToggleFullscreen(osgGA::GUIEventAdapter::KEY_F2); } } // Create overlay data osg::ref_ptr<osg::Geode> statsGeometry = createStatsGeometry(); group->addChild( statsGeometry ); // add the osgEarth globe to the scene group->addChild( globe.get() ); group->addChild( my_model->getModel().get() ); //viewer.setSceneData(my_model->getModel().get()); viewer.setSceneData( group ); //viewer.setSceneData(globe.get()); // create camera and context setupCameraAndContext( viewer, windowWidth, windowHeight ); // the overlay geometry is added to an individual camera // QUESTION: But why isn't it rendered by the primary cam?!? statsCamera->addChild( statsGeometry ); //viewer.setCameraManipulator(new osgGA::FlightManipulator); osgEarth::MapNode* mapNode = osgEarth::MapNode::findMapNode(globe); manip = new osgEarthUtil::EarthManipulator(); manip->setNode(globe); if ( mapNode->getMap()->isGeocentric() ) { manip->setHomeViewpoint( osgEarthUtil::Viewpoint( osg::Vec3d( -90, 0, 0 ), 0.0, -90.0, 5e7 ) ); } manip->getSettings()->bindMouseDoubleClick( osgEarthUtil::EarthManipulator::ACTION_GOTO, osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON ); viewer.setCameraManipulator(manip); viewer.addEventHandler(new inputHandler()); // run the viewers frame loop viewer.realize(); // main loop (note, window toolkits which take control over the main loop will require // a window redraw callback containing the code below.) while(!viewer.done()) { viewer.frame(); } }
int Metrics::run(osgViewer::Viewer& viewer) { if (Metrics::enabled()) { if (!viewer.isRealized()) { viewer.realize(); } // If Metrics are enabled, enable stats on the Viewer so that it we can report them for the Metrics if (Metrics::enabled()) { osgViewer::ViewerBase::Scenes scenes; viewer.getScenes(scenes); for (osgViewer::ViewerBase::Scenes::iterator itr = scenes.begin(); itr != scenes.end(); ++itr) { osgViewer::Scene* scene = *itr; osgDB::DatabasePager* dp = scene->getDatabasePager(); if (dp && dp->isRunning()) { dp->resetStats(); } } viewer.getViewerStats()->collectStats("frame_rate", true); viewer.getViewerStats()->collectStats("event", true); viewer.getViewerStats()->collectStats("update", true); viewer.getCamera()->getStats()->collectStats("rendering", true); viewer.getCamera()->getStats()->collectStats("gpu", true); } // Report memory and fps every 10 frames. unsigned int reportEvery = 10; while (!viewer.done()) { { METRIC_SCOPED_EX("frame", 1, "number", toString<int>(viewer.getFrameStamp()->getFrameNumber()).c_str()); { METRIC_SCOPED("advance"); viewer.advance(); } { METRIC_SCOPED("event"); viewer.eventTraversal(); } { METRIC_SCOPED("update"); viewer.updateTraversal(); } { METRIC_SCOPED("render"); viewer.renderingTraversals(); } } // Report memory and fps periodically. periodically. if (viewer.getFrameStamp()->getFrameNumber() % reportEvery == 0) { // Only report the metrics if they are enabled to avoid computing the memory. if (Metrics::enabled()) { Metrics::counter("Memory::WorkingSet", "WorkingSet", Memory::getProcessPhysicalUsage() / 1048576); Metrics::counter("Memory::PrivateBytes", "PrivateBytes", Memory::getProcessPrivateUsage() / 1048576); Metrics::counter("Memory::PeakPrivateBytes", "PeakPrivateBytes", Memory::getProcessPeakPrivateUsage() / 1048576); } } double eventTime = 0.0; if (viewer.getViewerStats()->getAttribute(viewer.getViewerStats()->getLatestFrameNumber(), "Event traversal time taken", eventTime)) { Metrics::counter("Viewer::Event", "Event", eventTime * 1000.0); } double updateTime = 0.0; if (viewer.getViewerStats()->getAttribute(viewer.getViewerStats()->getLatestFrameNumber(), "Update traversal time taken", updateTime)) { Metrics::counter("Viewer::Update", "Update", updateTime * 1000.0); } double cullTime = 0.0; if (viewer.getCamera()->getStats()->getAttribute(viewer.getCamera()->getStats()->getLatestFrameNumber(), "Cull traversal time taken", cullTime)) { Metrics::counter("Viewer::Cull", "Cull", cullTime * 1000.0); } double drawTime = 0.0; if (viewer.getCamera()->getStats()->getAttribute(viewer.getCamera()->getStats()->getLatestFrameNumber(), "Draw traversal time taken", drawTime)) { Metrics::counter("Viewer::Draw", "Draw", drawTime * 1000.0); } double gpuTime = 0.0; if (viewer.getCamera()->getStats()->getAttribute(viewer.getCamera()->getStats()->getLatestFrameNumber()-1, "GPU draw time taken", gpuTime)) { Metrics::counter("Viewer::GPU", "GPU", gpuTime * 1000.0); } double frameRate = 0.0; if (viewer.getViewerStats()->getAttribute(viewer.getViewerStats()->getLatestFrameNumber() - 1, "Frame rate", frameRate)) { Metrics::counter("Viewer::FPS", "FPS", frameRate); } } return 0; } else { return viewer.run(); } }