#include <osg/View>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/Viewer>
-#include <osgGA/MatrixManipulator>
+#include <osgViewer/GraphicsWindow>
-#include <Include/general.hxx>
#include <Scenery/scenery.hxx>
#include "fg_os.hxx"
#include "fg_props.hxx"
#include "WindowBuilder.hxx"
#include "WindowSystemAdapter.hxx"
+// Static linking of OSG needs special macros
+#ifdef OSG_LIBRARY_STATIC
+#include <osgDB/Registry>
+USE_GRAPHICSWINDOW();
+// Image formats
+USE_OSGPLUGIN(bmp);
+USE_OSGPLUGIN(dds);
+USE_OSGPLUGIN(hdr);
+USE_OSGPLUGIN(pic);
+USE_OSGPLUGIN(pnm);
+USE_OSGPLUGIN(rgb);
+USE_OSGPLUGIN(tga);
+#ifdef OSG_JPEG_ENABLED
+ USE_OSGPLUGIN(jpeg);
+#endif
+#ifdef OSG_PNG_ENABLED
+ USE_OSGPLUGIN(png);
+#endif
+#ifdef OSG_TIFF_ENABLED
+ USE_OSGPLUGIN(tiff);
+#endif
+// Model formats
+USE_OSGPLUGIN(3ds);
+USE_OSGPLUGIN(ac);
+USE_OSGPLUGIN(ive);
+USE_OSGPLUGIN(osg);
+USE_OSGPLUGIN(txf);
+#endif
+
// fg_os implementation using OpenSceneGraph's osgViewer::Viewer class
// to create the graphics window and run the event/update/render loop.
static osg::ref_ptr<osgViewer::Viewer> viewer;
static osg::ref_ptr<osg::Camera> mainCamera;
+static void setStereoMode( const char * mode )
+{
+ DisplaySettings::StereoMode stereoMode = DisplaySettings::QUAD_BUFFER;
+ bool stereoOn = true;
+
+ if (strcmp(mode,"QUAD_BUFFER")==0)
+ {
+ stereoMode = DisplaySettings::QUAD_BUFFER;
+ }
+ else if (strcmp(mode,"ANAGLYPHIC")==0)
+ {
+ stereoMode = DisplaySettings::ANAGLYPHIC;
+ }
+ else if (strcmp(mode,"HORIZONTAL_SPLIT")==0)
+ {
+ stereoMode = DisplaySettings::HORIZONTAL_SPLIT;
+ }
+ else if (strcmp(mode,"VERTICAL_SPLIT")==0)
+ {
+ stereoMode = DisplaySettings::VERTICAL_SPLIT;
+ }
+ else if (strcmp(mode,"LEFT_EYE")==0)
+ {
+ stereoMode = DisplaySettings::LEFT_EYE;
+ }
+ else if (strcmp(mode,"RIGHT_EYE")==0)
+ {
+ stereoMode = DisplaySettings::RIGHT_EYE;
+ }
+ else if (strcmp(mode,"HORIZONTAL_INTERLACE")==0)
+ {
+ stereoMode = DisplaySettings::HORIZONTAL_INTERLACE;
+ }
+ else if (strcmp(mode,"VERTICAL_INTERLACE")==0)
+ {
+ stereoMode = DisplaySettings::VERTICAL_INTERLACE;
+ }
+ else if (strcmp(mode,"CHECKERBOARD")==0)
+ {
+ stereoMode = DisplaySettings::CHECKERBOARD;
+ } else {
+ stereoOn = false;
+ }
+ DisplaySettings::instance()->setStereo( stereoOn );
+ DisplaySettings::instance()->setStereoMode( stereoMode );
+}
+
+static const char * getStereoMode()
+{
+ DisplaySettings::StereoMode stereoMode = DisplaySettings::instance()->getStereoMode();
+ bool stereoOn = DisplaySettings::instance()->getStereo();
+ if( !stereoOn ) return "OFF";
+ if( stereoMode == DisplaySettings::QUAD_BUFFER ) {
+ return "QUAD_BUFFER";
+ } else if( stereoMode == DisplaySettings::ANAGLYPHIC ) {
+ return "ANAGLYPHIC";
+ } else if( stereoMode == DisplaySettings::HORIZONTAL_SPLIT ) {
+ return "HORIZONTAL_SPLIT";
+ } else if( stereoMode == DisplaySettings::VERTICAL_SPLIT ) {
+ return "VERTICAL_SPLIT";
+ } else if( stereoMode == DisplaySettings::LEFT_EYE ) {
+ return "LEFT_EYE";
+ } else if( stereoMode == DisplaySettings::RIGHT_EYE ) {
+ return "RIGHT_EYE";
+ } else if( stereoMode == DisplaySettings::HORIZONTAL_INTERLACE ) {
+ return "HORIZONTAL_INTERLACE";
+ } else if( stereoMode == DisplaySettings::VERTICAL_INTERLACE ) {
+ return "VERTICAL_INTERLACE";
+ } else if( stereoMode == DisplaySettings::CHECKERBOARD ) {
+ return "CHECKERBOARD";
+ }
+ return "OFF";
+}
+
void fgOSOpenWindow(bool stencil)
{
viewer = new osgViewer::Viewer;
viewer->setSceneData(new osg::Group);
globals->get_renderer()->setViewer(viewer.get());
CameraGroup::setDefault(cameraGroup);
- viewer->setLightingMode(View::NO_LIGHT);
+
+ DisplaySettings * displaySettings = DisplaySettings::instance();
+ fgTie("/sim/rendering/osg-displaysettings/eye-separation", displaySettings, &DisplaySettings::getEyeSeparation, &DisplaySettings::setEyeSeparation );
+ fgTie("/sim/rendering/osg-displaysettings/screen-distance", displaySettings, &DisplaySettings::getScreenDistance, &DisplaySettings::setScreenDistance );
+ fgTie("/sim/rendering/osg-displaysettings/screen-width", displaySettings, &DisplaySettings::getScreenWidth, &DisplaySettings::setScreenWidth );
+ fgTie("/sim/rendering/osg-displaysettings/screen-height", displaySettings, &DisplaySettings::getScreenHeight, &DisplaySettings::setScreenHeight );
+ fgTie("/sim/rendering/osg-displaysettings/stereo-mode", getStereoMode, setStereoMode );
+ fgTie("/sim/rendering/osg-displaysettings/double-buffer", displaySettings, &DisplaySettings::getDoubleBuffer, &DisplaySettings::setDoubleBuffer );
+ fgTie("/sim/rendering/osg-displaysettings/depth-buffer", displaySettings, &DisplaySettings::getDepthBuffer, &DisplaySettings::setDepthBuffer );
+ fgTie("/sim/rendering/osg-displaysettings/rgb", displaySettings, &DisplaySettings::getRGB, &DisplaySettings::setRGB );
}
+
static int status = 0;
void fgOSExit(int code)
status = code;
}
-void fgOSMainLoop()
+int fgOSMainLoop()
{
ref_ptr<FGEventHandler> manipulator
= globals->get_renderer()->getEventHandler();
viewer->realize();
while (!viewer->done()) {
fgIdleHandler idleFunc = manipulator->getIdleHandler();
- fgDrawHandler drawFunc = manipulator->getDrawHandler();
if (idleFunc)
(*idleFunc)();
- if (drawFunc)
- (*drawFunc)();
+ globals->get_renderer()->update();
viewer->frame();
}
- fgExit(status);
+
+ return status;
}
int fgGetKeyModifiers()
{
+ if (!globals->get_renderer()) { // happens during shutdown
+ return 0;
+ }
+
return globals->get_renderer()->getEventHandler()->getCurrentModifiers();
}
void fgOSInit(int* argc, char** argv)
{
+ globals->get_renderer()->init();
WindowSystemAdapter::setWSA(new WindowSystemAdapter);
}
{
}
-static void setMouseCursor(osg::Camera* camera, int cursor)
+static void setMouseCursor(osgViewer::GraphicsWindow* gw, int cursor)
{
- if (!camera)
- return;
- osg::GraphicsContext* gc = camera->getGraphicsContext();
- if (!gc)
- return;
- osgViewer::GraphicsWindow* gw;
- gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc);
- if (!gw)
+ if (!gw) {
return;
-
+ }
+
osgViewer::GraphicsWindow::MouseCursor mouseCursor;
mouseCursor = osgViewer::GraphicsWindow::InheritCursor;
- if (cursor == MOUSE_CURSOR_NONE)
+ if (cursor == MOUSE_CURSOR_NONE)
mouseCursor = osgViewer::GraphicsWindow::NoCursor;
else if(cursor == MOUSE_CURSOR_POINTER)
+#ifdef SG_MAC
+ // osgViewer-Cocoa lacks RightArrowCursor, use Left
+ mouseCursor = osgViewer::GraphicsWindow::LeftArrowCursor;
+#else
mouseCursor = osgViewer::GraphicsWindow::RightArrowCursor;
+#endif
else if(cursor == MOUSE_CURSOR_WAIT)
mouseCursor = osgViewer::GraphicsWindow::WaitCursor;
else if(cursor == MOUSE_CURSOR_CROSSHAIR)
void fgSetMouseCursor(int cursor)
{
_cursor = cursor;
- setMouseCursor(viewer->getCamera(), cursor);
- for (unsigned i = 0; i < viewer->getNumSlaves(); ++i)
- setMouseCursor(viewer->getSlave(i)._camera.get(), cursor);
+
+ std::vector<osgViewer::GraphicsWindow*> windows;
+ viewer->getWindows(windows);
+ BOOST_FOREACH(osgViewer::GraphicsWindow* gw, windows) {
+ setMouseCursor(gw, cursor);
+ }
}
int fgGetMouseCursor()