- osg::ref_ptr<osg::GraphicsContext::Traits> traits;
- traits = new osg::GraphicsContext::Traits;
- traits->readDISPLAY();
- int cbits = (bpp <= 16) ? 5 : 8;
- int zbits = (bpp <= 16) ? 16 : 24;
- traits->red = traits->green = traits->blue = cbits;
- traits->depth = zbits;
- if (alpha)
- traits->alpha = 8;
- if (stencil)
- traits->stencil = 8;
- traits->doubleBuffer = true;
- traits->mipMapGeneration = true;
- traits->windowName = "FlightGear";
- traits->sampleBuffers = fgGetBool("/sim/rendering/multi-sample-buffers", traits->sampleBuffers);
- traits->samples = fgGetBool("/sim/rendering/multi-samples", traits->samples);
- traits->vsync = fgGetBool("/sim/rendering/vsync-enable", traits->vsync);
-
- if (fullscreen) {
- unsigned width = 0;
- unsigned height = 0;
- wsi->getScreenResolution(*traits, width, height);
- traits->windowDecoration = false;
- traits->width = width;
- traits->height = height;
- traits->supportsResize = false;
- } else {
- traits->windowDecoration = true;
- traits->width = w;
- traits->height = h;
-#if defined(WIN32) || defined(__APPLE__)
- // Ugly Hack, why does CW_USEDEFAULT works like phase of the moon?
- // Mac also needs this to show window frame, menubar and Docks
- traits->x = 100;
- traits->y = 100;
-#endif
- traits->supportsResize = true;
- }
-
- osg::Camera::ProjectionResizePolicy rsp = osg::Camera::VERTICAL;
-
- // Ok, first the children.
- // that achieves some magic ordering og the slaves so that we end up
- // in the main window more often.
- // This can be sorted out better when we got rid of glut and sdl.
- FGManipulator* manipulator = globals->get_renderer()->getManipulator();
- int nCameras = 0;
- if (fgHasNode("/sim/rendering/camera")) {
- SGPropertyNode* renderingNode = fgGetNode("/sim/rendering");
- for (int i = 0; i < renderingNode->nChildren(); ++i) {
- SGPropertyNode* cameraNode = renderingNode->getChild(i);
- if (strcmp(cameraNode->getName(), "camera") != 0)
- continue;
-
- nCameras++;
- // get a new copy of the traits struct
- osg::ref_ptr<osg::GraphicsContext::Traits> cameraTraits;
- cameraTraits = new osg::GraphicsContext::Traits(*traits);
-
- double shearx = cameraNode->getDoubleValue("shear-x", 0);
- double sheary = cameraNode->getDoubleValue("shear-y", 0);
- cameraTraits->hostName
- = cameraNode->getStringValue("host-name", traits->hostName.c_str());
- cameraTraits->displayNum
- = cameraNode->getIntValue("display", traits->displayNum);
- cameraTraits->screenNum
- = cameraNode->getIntValue("screen", traits->screenNum);
- if (cameraNode->getBoolValue("fullscreen", fullscreen)) {
- unsigned width = 0;
- unsigned height = 0;
- wsi->getScreenResolution(*cameraTraits, width, height);
- cameraTraits->windowDecoration = false;
- cameraTraits->width = width;
- cameraTraits->height = height;
- cameraTraits->supportsResize = false;
- } else {
- cameraTraits->windowDecoration = true;
- cameraTraits->width = cameraNode->getIntValue("width", w);
- cameraTraits->height = cameraNode->getIntValue("height", h);
- cameraTraits->supportsResize = true;
+ WindowBuilder::initWindowBuilder(stencil);
+ WindowBuilder *windowBuilder = WindowBuilder::getWindowBuilder();
+
+ // Look for windows, camera groups, and the old syntax of
+ // top-level cameras
+ SGPropertyNode* renderingNode = fgGetNode("/sim/rendering");
+ SGPropertyNode* cgroupNode = renderingNode->getNode("camera-group", true);
+ bool oldSyntax = !cgroupNode->hasChild("camera");
+ if (oldSyntax) {
+ for (int i = 0; i < renderingNode->nChildren(); ++i) {
+ SGPropertyNode* propNode = renderingNode->getChild(i);
+ const char* propName = propNode->getName();
+ if (!strcmp(propName, "window") || !strcmp(propName, "camera")) {
+ SGPropertyNode* copiedNode
+ = cgroupNode->getNode(propName, propNode->getIndex(), true);
+ copyProperties(propNode, copiedNode);
+ }