app::perf::perf(SDL_Window *w, int n) : window(w), num(0), tot(0), lim(n), val(0), avg(0) { if (NVPMInit() == NVPM_OK) { NVPMGetNumCounters(&num); NVPMEnumCounters(counter); val = new NVPMSampleValue[num]; avg = new NVPMSampleValue[num]; memset(val, 0, num * sizeof (NVPMSampleValue)); memset(avg, 0, num * sizeof (NVPMSampleValue)); } }
int main(int argc, char **argv) { OSG::osgInit(argc,argv); if(argc > 1 && !strcmp(argv[1],"-s")) { show = false; argv++; argc--; } if(argc > 1 && !strcmp(argv[1],"-d")) { debug = true; argv++; argc--; } if(argc > 1) { scene = OSG::Node::create(); OSG::GroupUnrecPtr g = OSG::Group::create(); scene->setCore(g); for(OSG::UInt16 i = 1; i < argc; ++i) scene->addChild(OSG::SceneFileHandler::the()->read(argv[i])); } else { scene = OSG::makeTorus(.5, 3, 16, 16); } // GLUT init glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(1024, 768); mainwinid = glutCreateWindow("OpenSG"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(idle); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); OSG::GLUTWindowUnrecPtr mainwin=OSG::GLUTWindow::create(); mainwin->setGlutId(mainwinid); mainwin->init(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // create the window and initial camera/viewport mgr->setWindow(mainwin); // tell the manager what to manage mgr->setRoot (scene); OSG::commitChanges(); // show the whole scene mgr->showAll(); mgr->setUseTraversalAction(true); tact = OSG::RenderAction::create(); #ifdef OSG_OLD_RENDER_ACTION act = OSG::RenderAction::create(); #endif debugact = OSG::RenderAction::create(); tact->setOcclusionCulling(true); // Open the debug window if(debug) { OSG::traverse(scene, initMask); glutInitWindowSize(800, 400); debugwinid = glutCreateWindow("OpenSG Occlusion Debugging"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); glutKeyboardFunc(keyboard); debugwin=OSG::GLUTWindow::create(); debugwin->setGlutId(debugwinid); debugwin->init(); OSG::ViewportUnrecPtr vp = mainwin->getPort(0); OSG::ViewportUnrecPtr newvp = OSG::Viewport::create(); newvp->setLeft(0); newvp->setRight(0.5); newvp->setBottom(0); newvp->setTop(1); newvp->setRoot(vp->getRoot()); newvp->setCamera(vp->getCamera()); newvp->setBackground(vp->getBackground()); newvp->setTravMask(0x1); debugwin->addPort(newvp); newvp = OSG::Viewport::create(); newvp->setLeft(0.5); newvp->setRight(1); newvp->setBottom(0); newvp->setTop(1); newvp->setRoot(vp->getRoot()); newvp->setCamera(vp->getCamera()); newvp->setBackground(vp->getBackground()); newvp->setTravMask(0x2); debugwin->addPort(newvp); tact->setOcclusionCullingDebug(true); tact->setOcclusionDebugMasks(0x1, 0x2, 0x4); } // add the statistics forground statfg = OSG::SimpleStatisticsForeground::create(); statfg->setSize(25); statfg->setColor(OSG::Color4f(0,1,0,0.7f)); statfg->addElement(OSG::RenderAction::statDrawTime, "Draw FPS: %r.3f"); statfg->addElement(OSG::RenderAction::statNMatrices, "Matrix Changes: %d"); statfg->addElement(OSG::RenderAction::statNStates, "State Changes: %d"); statfg->addElement(OSG::RenderPartition::statCullTestedNodes, "Cull-tested Nodes: %d"); statfg->addElement(OSG::RenderPartition::statCulledNodes, "Culled Nodes: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccNodes, "Nodes in DrawTree: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccTests, "Occ Tests: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccInvisible, "Invisible Nodes: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccSuccessTestPer, "OCC Success rate: %per%%"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccTriangles, "Triangles culled: %d"); collector = statfg->getCollector(); tact->setStatCollector(collector); #ifdef OSG_OLD_RENDER_ACTION act ->setStatCollector(collector); #endif mgr->setAction(tact); #ifdef OSG_OLD_RENDER_ACTION mgr->setAction( act); #endif //tact->setOcclusionCullingMinimumFeatureSize(15); //tact->setOcclusionCullingVisibilityThreshold(15); //tact->setScreenLODCoverageThreshold(0.005); if(show) { mainwin->getPort(0)->addForeground(statfg); } #ifdef OSG_WITH_NVPERFSDK NVPMRESULT status; status = NVPMInit(); if (status != NVPM_OK) { FFATAL(("NVPerfSDK failed to initialize - no GPU data will be available")); } else { nvDataProvider->add("gpu_idle"); nvDataProvider->add("pixel_shader_busy"); nvDataProvider->add("vertex_shader_busy"); nvDataProvider->add("shader_waits_for_texture"); if (!nvDataProvider->add("OGL FPS")) FLOG(("nvDataProvider::add: 'OGL FPS' failed!\n")); statfg->addElement(GPUIdleStat); statfg->addElement(PSBusyStat); statfg->addElement(VSBusyStat); statfg->addElement(TextureWaitStat); statfg->addElement(OGLFPSStat); } #endif // GLUT main loop glutMainLoop(); return 0; }