int main(int argc, char* argv[]) { ref_ptr<Group> root = new Group; viewer.setUpViewInWindow(0, 0, 640, 480); viewer.realize(); ref_ptr<Camera> cam = viewer.getCamera(); ref_ptr<Geode> geode = new Geode; root->addChild(geode.get()); for (int i=0; i < 10; i++) { osg::Sphere* sphere = new osg::Sphere( Vec3f(i+1,10,0), .1*i); osg::ShapeDrawable* sphereDrawable = new osg::ShapeDrawable(sphere); geode->addDrawable(sphereDrawable); } // osg::Sphere* sphere = new osg::Sphere( Vec3f(10,10,0), .2); // osg::ShapeDrawable* sphereDrawable = new osg::ShapeDrawable(sphere); // sphereDrawable->setColor(osg::Vec4f(1,0,0,1)); // geode->addDrawable(sphereDrawable); ref_ptr<osgGA::TrackballManipulator> manip = new osgGA::TrackballManipulator(); viewer.setCameraManipulator(manip); viewer.setSceneData(root.get()); cam->setViewMatrixAsLookAt(Vec3f(10,0,0), Vec3f(10,1,0), Vec3f(0,0,1)); //manip->setHomePosition(Vec3f(10,0,0), Vec3f(11,1,0), Vec3f(10,0,1)); // cam->setProjectionMatrixAsPerspective(49,640/480., .1, 10); viewer.run(); }
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; }
//----------------------------------------------------------------------------- // Dynamics plugin entry point. void init( int argc, char** argv ) { //+++++++++++++++++++++++++++++++++++++++ dyn_error_log = log_c( FD_ERROR_LOG ); if( dyn_error_log.open( ) != LOG_ERROR_NONE ) { // Note: this is not really necessary printf( "(dynamics.cpp) ERROR: init(argc,argv) failed calling log_c.open() on FD_ERROR_LOG\n" ); } //+++++++++++++++++++++++++++++++++++++++ const unsigned ONECHAR_ARG = 3, TWOCHAR_ARG = 4; #ifdef USE_OSG viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer_pointer = &viewer; #endif // setup some default options std::string scene_path; THREED_IVAL = 0; IMAGE_IVAL = 0; // check that syntax is ok if (argc < 2) { std::cerr << "syntax: driver [OPTIONS] <xml file>" << std::endl; std::cerr << " (see README for OPTIONS)" << std::endl; return; } // get all options for (int i=1; i< argc-1; i++) { // get the option std::string option(argv[i]); // process options if (option == "-r") { ONSCREEN_RENDER = true; UPDATE_GRAPHICS = true; check_osg(); } else if (option.find("-of") != std::string::npos) { OUTPUT_FRAME_RATE = true; } else if (option.find("-ot") != std::string::npos) { OUTPUT_TIMINGS = true; } else if (option.find("-oi") != std::string::npos) { OUTPUT_ITER_NUM = true; } else if (option.find("-or") != std::string::npos) { OUTPUT_SIM_RATE = true; } else if (option.find("-v=") != std::string::npos) { UPDATE_GRAPHICS = true; check_osg(); THREED_IVAL = std::atoi(&argv[i][ONECHAR_ARG]); //assert(THREED_IVAL >= 0); // Note: remarked because always true } else if (option.find("-i=") != std::string::npos) { check_osg(); UPDATE_GRAPHICS = true; IMAGE_IVAL = std::atoi(&argv[i][ONECHAR_ARG]); //assert(IMAGE_IVAL >= 0); // Note: remarked because always true } else if (option.find("-t") != std::string::npos) { OUTPUT_TO_TIME = true; } else if (option.find("-s=") != std::string::npos) { STEP_SIZE = std::atof(&argv[i][ONECHAR_ARG]); assert(STEP_SIZE >= 0.0 && STEP_SIZE < 1); } else if (option.find("-lf=") != std::string::npos) { std::string fname(&argv[i][TWOCHAR_ARG]); OutputToFile::stream.open(fname.c_str()); } else if (option.find("-l=") != std::string::npos) { LOG_REPORTING_LEVEL = std::atoi(&argv[i][ONECHAR_ARG]); Log<OutputToFile>::reporting_level = LOG_REPORTING_LEVEL; } else if (option.find("-lt=") != std::string::npos) { LOG_START = std::atoi(&argv[i][TWOCHAR_ARG]); } else if (option.find("-lp=") != std::string::npos) { LOG_STOP = std::atoi(&argv[i][TWOCHAR_ARG]); } else if (option.find("-mi=") != std::string::npos) { MAX_ITER = std::atoi(&argv[i][TWOCHAR_ARG]); assert(MAX_ITER > 0); } else if (option.find("-mt=") != std::string::npos) { MAX_TIME = std::atof(&argv[i][TWOCHAR_ARG]); assert(MAX_TIME > 0); } else if (option.find("-x=") != std::string::npos) { check_osg(); scene_path = std::string(&argv[i][ONECHAR_ARG]); } else if (option.find("-p=") != std::string::npos) { /// read_plugin(&argv[i][ONECHAR_ARG]); } else if (option.find("-y=") != std::string::npos) { strcpy(THREED_EXT, &argv[i][ONECHAR_ARG]); } else if (option.find("-vcp") != std::string::npos) { RENDER_CONTACT_POINTS = true; } } // setup the simulation READ_MAP = XMLReader::read(std::string(argv[argc-1])); // setup the offscreen renderer if necessary #ifdef USE_OSG if (IMAGE_IVAL > 0) { // TODO: setup offscreen renderer here } #endif // get the (only) simulation object for (std::map<std::string, BasePtr>::const_iterator i = READ_MAP.begin(); i != READ_MAP.end(); i++) { sim = boost::dynamic_pointer_cast<Simulator>(i->second); if (sim) break; } // make sure that a simulator was found if (!sim) { std::cerr << "driver: no simulator found in " << argv[argc-1] << std::endl; //return -1; return; } // setup osg window if desired #ifdef USE_OSG if (ONSCREEN_RENDER) { // setup any necessary handlers here viewer.setCameraManipulator(new osgGA::TrackballManipulator()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); viewer.addEventHandler(new osgViewer::WindowSizeHandler); viewer.addEventHandler(new osgViewer::StatsHandler); } // init the main group MAIN_GROUP = new osg::Group; #endif // look for a scene description file #ifdef USE_OSG if (scene_path != "") { std::ifstream in(scene_path.c_str()); if (in.fail()) { std::cerr << "driver: unable to find scene description from " << scene_path << std::endl; add_lights(); } else { in.close(); osg::Node* node = osgDB::readNodeFile(scene_path); if (!node) { std::cerr << "driver: unable to open scene description file!" << std::endl; add_lights(); } else MAIN_GROUP->addChild(node); } } else { add_lights(); } #endif // process XML options process_xml_options(std::string(argv[argc-1])); // get the simulator visualization #ifdef USE_OSG MAIN_GROUP->addChild(sim->get_persistent_vdata()); MAIN_GROUP->addChild(sim->get_transient_vdata()); #endif // setup the timers FIRST_STEP_TIME = get_current_time(); LAST_STEP_TIME = FIRST_STEP_TIME; // begin timing start_time = clock(); // prepare to render #ifdef USE_OSG if (ONSCREEN_RENDER) { viewer.setSceneData(MAIN_GROUP); viewer.realize(); } #endif // custom implementation follows // Get reference to the pendulum for usage in the command publish and response if( READ_MAP.find("pendulum") == READ_MAP.end() ) { sprintf( strbuffer, "(dynamics.cpp) init(argc,argv) failed- unable to find pendulum in xml!\n" ); dyn_error_log.write( strbuffer ); // TODO : return error condition } pendulum = dynamic_pointer_cast<Moby::RCArticulatedBody>( READ_MAP.find("pendulum")->second ); if( !pendulum ) { sprintf( strbuffer, "(dynamics.cpp) init(argc,argv)- unable to cast pendulum to type RCArticulatedBody\n" ); dyn_error_log.write( strbuffer ); // TODO : return error condition } // open the command buffer dyn_amsgbuffer = actuator_msg_buffer_c( ACTUATOR_MSG_BUFFER_NAME, ACTUATOR_MSG_BUFFER_MUTEX_NAME, false ); if( dyn_amsgbuffer.open( ) != BUFFER_ERROR_NONE) { sprintf( strbuffer, "(dynamics.cpp) init(argc,argv) failed calling actuator_msg_buffer_c.open(...,false)\n" ); dyn_error_log.write( strbuffer ); // TODO : return error condition } printf( "(dynamics::initialized)\n" ); }
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(); } }
// dynamics plugin entry point, signature per tas plugin requirement as defined in coordinator void init( int argc, char** argv ) { const unsigned ONECHAR_ARG = 3, TWOCHAR_ARG = 4; #ifdef USE_OSG viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer_pointer = &viewer; #endif // setup some default options std::string scene_path; THREED_IVAL = 0; IMAGE_IVAL = 0; // check that syntax is ok if (argc < 2) { std::cerr << "syntax: driver [OPTIONS] <xml file>" << std::endl; std::cerr << " (see README for OPTIONS)" << std::endl; //return -1; return; } // get all options for (int i=1; i< argc-1; i++) { // get the option std::string option(argv[i]); // process options if (option == "-r") { ONSCREEN_RENDER = true; UPDATE_GRAPHICS = true; check_osg(); } else if (option.find("-of") != std::string::npos) OUTPUT_FRAME_RATE = true; else if (option.find("-ot") != std::string::npos) OUTPUT_TIMINGS = true; else if (option.find("-oi") != std::string::npos) OUTPUT_ITER_NUM = true; else if (option.find("-or") != std::string::npos) OUTPUT_SIM_RATE = true; else if (option.find("-v=") != std::string::npos) { UPDATE_GRAPHICS = true; check_osg(); THREED_IVAL = std::atoi(&argv[i][ONECHAR_ARG]); assert(THREED_IVAL >= 0); } else if (option.find("-i=") != std::string::npos) { check_osg(); UPDATE_GRAPHICS = true; IMAGE_IVAL = std::atoi(&argv[i][ONECHAR_ARG]); assert(IMAGE_IVAL >= 0); } else if (option.find("-t") != std::string::npos) OUTPUT_TO_TIME = true; else if (option.find("-s=") != std::string::npos) { STEP_SIZE = std::atof(&argv[i][ONECHAR_ARG]); assert(STEP_SIZE >= 0.0 && STEP_SIZE < 1); } else if (option.find("-lf=") != std::string::npos) { std::string fname(&argv[i][TWOCHAR_ARG]); OutputToFile::stream.open(fname.c_str()); } else if (option.find("-l=") != std::string::npos) { LOG_REPORTING_LEVEL = std::atoi(&argv[i][ONECHAR_ARG]); Log<OutputToFile>::reporting_level = LOG_REPORTING_LEVEL; } else if (option.find("-lt=") != std::string::npos) { LOG_START = std::atoi(&argv[i][TWOCHAR_ARG]); } else if (option.find("-lp=") != std::string::npos) { LOG_STOP = std::atoi(&argv[i][TWOCHAR_ARG]); } else if (option.find("-mi=") != std::string::npos) { MAX_ITER = std::atoi(&argv[i][TWOCHAR_ARG]); assert(MAX_ITER > 0); } else if (option.find("-mt=") != std::string::npos) { MAX_TIME = std::atof(&argv[i][TWOCHAR_ARG]); assert(MAX_TIME > 0); } else if (option.find("-x=") != std::string::npos) { check_osg(); scene_path = std::string(&argv[i][ONECHAR_ARG]); } else if (option.find("-p=") != std::string::npos) { /// read_plugin(&argv[i][ONECHAR_ARG]); } else if (option.find("-y=") != std::string::npos) { strcpy(THREED_EXT, &argv[i][ONECHAR_ARG]); } else if (option.find("-vcp") != std::string::npos) RENDER_CONTACT_POINTS = true; } // setup the simulation READ_MAP = XMLReader::read(std::string(argv[argc-1])); // setup the offscreen renderer if necessary #ifdef USE_OSG if (IMAGE_IVAL > 0) { // TODO: setup offscreen renderer here } #endif // get the (only) simulation object for (std::map<std::string, BasePtr>::const_iterator i = READ_MAP.begin(); i != READ_MAP.end(); i++) { sim = boost::dynamic_pointer_cast<Simulator>(i->second); if (sim) break; } // make sure that a simulator was found if (!sim) { std::cerr << "driver: no simulator found in " << argv[argc-1] << std::endl; //return -1; return; } // setup osg window if desired #ifdef USE_OSG if (ONSCREEN_RENDER) { // setup any necessary handlers here viewer.setCameraManipulator(new osgGA::TrackballManipulator()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); viewer.addEventHandler(new osgViewer::WindowSizeHandler); viewer.addEventHandler(new osgViewer::StatsHandler); } // init the main group MAIN_GROUP = new osg::Group; #endif /** // Note: In this architecture, Moby doesn't have any direct relationship to // controllers, so the ability to load control plugins is removed // call the initializers, if any if (!INIT.empty()) { #ifdef USE_OSG BOOST_FOREACH(init_t i, INIT) (*i)(MAIN_GROUP, READ_MAP, STEP_SIZE); #else BOOST_FOREACH(init_t i, INIT) (*i)(NULL, READ_MAP, STEP_SIZE); #endif } */ // look for a scene description file #ifdef USE_OSG if (scene_path != "") { std::ifstream in(scene_path.c_str()); if (in.fail()) { std::cerr << "driver: unable to find scene description from " << scene_path << std::endl; add_lights(); } else { in.close(); osg::Node* node = osgDB::readNodeFile(scene_path); if (!node) { std::cerr << "driver: unable to open scene description file!" << std::endl; add_lights(); } else MAIN_GROUP->addChild(node); } } else add_lights(); #endif // process XML options process_xml_options(std::string(argv[argc-1])); // get the simulator visualization #ifdef USE_OSG MAIN_GROUP->addChild(sim->get_persistent_vdata()); MAIN_GROUP->addChild(sim->get_transient_vdata()); #endif // setup the timers FIRST_STEP_TIME = get_current_time(); LAST_STEP_TIME = FIRST_STEP_TIME; // begin timing start_time = clock(); // prepare to render #ifdef USE_OSG if (ONSCREEN_RENDER) { viewer.setSceneData(MAIN_GROUP); viewer.realize(); } #endif // custom implementation follows // Get reference to the pendulum for usage in the command publish and response if( READ_MAP.find("pendulum") == READ_MAP.end() ) printf( "dynamics.cpp:init()- unable to find pendulum!\n" ); pendulum = dynamic_pointer_cast<Moby::RCArticulatedBody>( READ_MAP.find("pendulum")->second ); if( !pendulum ) printf( "dynamics.cpp:init()- unable to cast pendulum to type RCArticulatedBody\n" ); // open the command buffer cmdbuffer = CommandBuffer( getpid( ) ); cmdbuffer.open(); // TODO : sanity/safety checking //printf( "(dynamics::initialized)\n" ); }
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(); } }