int main(void) { srand(time(NULL)); // initialize pseudo random number generator ref_ptr<CompositeViewer> viewer = new CompositeViewer(); ref_ptr<ph::MainView> mainView = new ph::MainView(); ref_ptr<ph::ShipView> shipView = new ph::ShipView(mainView->getScene()); ref_ptr<ph::KeyboardEventHandler> handler = new ph::KeyboardEventHandler(mainView.get()); shipView->addEventHandler(handler.get()); unsigned int width, height; GraphicsContext::WindowingSystemInterface* wsi = GraphicsContext::getWindowingSystemInterface(); wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height); // setup window properties ref_ptr<GraphicsContext::Traits> traits = new GraphicsContext::Traits; traits->x = 0; traits->y = 0; traits->width = width; traits->height = height; traits->windowDecoration = false; traits->doubleBuffer = true; traits->sharedContext = 0; ref_ptr<GraphicsContext> context = GraphicsContext::createGraphicsContext(traits.get()); shipView->getCamera()->setGraphicsContext(context.get()); mainView->getCamera()->setGraphicsContext(context.get()); shipView->getCamera()->setViewport(new Viewport(0, 0, width, height)); viewer->addView(shipView); // x, y mainView->getCamera()->setViewport(new Viewport(width-20-width/4, 20, // width, height width/4, height/4)); viewer->addView(mainView); return viewer->run(); }
// Standard OSG code for initializing osgViewer::Viewer with explicit // creation of own graphics context. This is also a good time to test // for valid frame buffer configurations; we have a valid graphics // context, but multithreading hasn't started, etc. GraphicsContext* setupGC(osgViewer::Viewer& viewer, ArgumentParser& arguments) { int x = -1, y = -1, width = -1, height = -1; while (arguments.read("--window",x,y,width,height)) {} GraphicsContext::WindowingSystemInterface* wsi = GraphicsContext::getWindowingSystemInterface(); if (!wsi) { OSG_NOTIFY(NOTICE)<<"View::setUpViewOnSingleScreen() : Error, no WindowSystemInterface available, cannot create windows."<<std::endl; return 0; } DisplaySettings* ds = viewer.getDisplaySettings() ? viewer.getDisplaySettings() : DisplaySettings::instance().get(); GraphicsContext::ScreenIdentifier si; si.readDISPLAY(); // displayNum has not been set so reset it to 0. if (si.displayNum<0) si.displayNum = 0; bool decoration = true; if (x < 0) { unsigned int w, h; wsi->getScreenResolution(si, w, h); x = 0; y = 0; width = w; height = h; decoration = false; } ref_ptr<GraphicsContext::Traits> traits = new GraphicsContext::Traits(ds); traits->hostName = si.hostName; traits->displayNum = si.displayNum; traits->screenNum = si.screenNum; traits->x = x; traits->y = y; traits->width = width; traits->height = height; traits->windowDecoration = decoration; traits->doubleBuffer = true; traits->sharedContext = 0; ref_ptr<GraphicsContext> gc = GraphicsContext::createGraphicsContext(traits.get()); osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get()); if (gw) { OSG_NOTIFY(INFO)<<"View::setUpViewOnSingleScreen - GraphicsWindow has been created successfully."<<std::endl; gw->getEventQueue()->getCurrentEventState() ->setWindowRectangle(0, 0, width, height); } else { OSG_NOTIFY(NOTICE)<<" GraphicsWindow has not been created successfully."<<std::endl; } double fovy, aspectRatio, zNear, zFar; viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio, zNear, zFar); double newAspectRatio = double(traits->width) / double(traits->height); double aspectRatioChange = newAspectRatio / aspectRatio; if (aspectRatioChange != 1.0) { viewer.getCamera()->getProjectionMatrix() *= Matrix::scale(1.0/aspectRatioChange,1.0,1.0); } // Context has to be current to test for extensions gc->realize(); gc->makeCurrent(); unsigned int contextID = gc->getState()->getContextID(); FBOExtensions* fboe = FBOExtensions::instance(contextID, true); if (!fboe->isSupported()) { OSG_NOTIFY(NOTICE) << "Frame buffer objects are not supported\n"; gc->releaseContext(); gc->close(true); return 0; } if (isGLExtensionSupported(contextID, "GL_ARB_depth_buffer_float")) depthTextureEnum = GL_DEPTH_COMPONENT32F; else if (isGLExtensionSupported(contextID, "GL_NV_depth_buffer_float")) depthTextureEnum = GL_DEPTH_COMPONENT32F_NV; BufferConfigList colorConfigs; BufferConfigList depthConfigs; vector<int> coverageConfigs; getPossibleConfigs(gc.get(), colorConfigs, depthConfigs, coverageConfigs); int coverageSampleConfigs = (coverageConfigs.size() - 4) / 2; cout << "color configs\nname\tbits\n"; for (BufferConfigList::const_iterator colorItr = colorConfigs.begin(), colorEnd = colorConfigs.end(); colorItr != colorEnd; ++colorItr) { for (BufferConfigList::const_iterator depthItr = depthConfigs.begin(), depthEnd = depthConfigs.end(); depthItr != depthEnd; ++depthItr) { string root = colorItr->name + " " + depthItr->name; FboConfig config(root, colorItr->format, depthItr->format, colorItr->bits, depthItr->bits); FboData data; if (createFBO(gc.get(), config, data)) validConfigs.push_back(config); destroyFBO(gc.get(), data); if (coverageConfigs.size() > 0) { //CSAA provides a list of all supported AA modes for //quick enumeration for (int kk = 0; kk < coverageSampleConfigs; kk++) { stringstream msText; msText << root; config.depthSamples = coverageConfigs[kk*2+1]; config.coverageSamples = coverageConfigs[kk*2]; if ( config.coverageSamples == config.depthSamples ) { // Normal antialiasing msText << " - " << config.depthSamples << " MSAA"; } else { // coverage antialiasing msText << " - " << config.coverageSamples << "/" << config.depthSamples << " CSAA"; } config.name = msText.str(); if (createFBO(gc.get(), config, data)) { validConfigs.push_back( config); } destroyFBO(gc.get(), data); } } } } if (validConfigs.empty()) { cout << "no valid frame buffer configurations!\n"; return 0; } cout << "valid frame buffer configurations:\n"; for (vector<FboConfig>::iterator itr = validConfigs.begin(), end = validConfigs.end(); itr != end; ++itr) cout << itr->name << "\n"; gc->releaseContext(); return gc.release(); }