-namespace
-{
-// If a camera group isn't specified, build one from the top-level
-// camera specs and then add a camera aligned with the master camera
-// if it doesn't seem to exist.
-CameraGroup* buildDefaultCameraGroup(osgViewer::Viewer* viewer,
- const SGPropertyNode* gnode)
-{
- WindowSystemAdapter* wsa = WindowSystemAdapter::getWSA();
- CameraGroup* cgroup = CameraGroup::buildCameraGroup(viewer, gnode);
- // Look for a camera with no shear
- Camera* masterCamera = 0;
- for (CameraGroup::CameraIterator citer = cgroup->camerasBegin(),
- e = cgroup->camerasEnd();
- citer != e;
- ++citer) {
- const View::Slave& slave = viewer->getSlave((*citer)->slaveIndex);
- if (slave._projectionOffset.isIdentity()) {
- masterCamera = (*citer)->camera.get();
- break;
- }
- }
- if (!masterCamera) {
- // No master camera found; better add one.
- GraphicsWindow* window
- = WindowBuilder::getWindowBuilder()->getDefaultWindow();
- masterCamera = new Camera();
- masterCamera->setGraphicsContext(window->gc.get());
- const GraphicsContext::Traits *traits = window->gc->getTraits();
- masterCamera->setViewport(new Viewport(0, 0,
- traits->width, traits->height));
- cgroup->addCamera(CameraGroup::DO_INTERSECTION_TEST, masterCamera,
- Matrix(), Matrix());
- }
- // Find window on which the GUI is drawn.
- WindowVector::iterator iter = wsa->windows.begin();
- WindowVector::iterator end = wsa->windows.end();
- for (; iter != end; ++iter) {
- if ((*iter)->gc.get() == masterCamera->getGraphicsContext())
- break;
- }
- if (iter != end) { // Better not happen
- (*iter)->flags |= GraphicsWindow::GUI;
- cgroup->buildGUICamera(0, iter->get());
- }
- return cgroup;
-}
-}
-