From 18984499490a2b1dbbe4764e910fc6cb2c979682 Mon Sep 17 00:00:00 2001 From: James Turner Date: Thu, 7 Feb 2013 16:01:36 +0000 Subject: [PATCH] Map OSG notification system to Simgear logging. With this, OSG notifications can be captured / buffered in-line with our other log messages, which should help debugging and feedback. --- src/Viewer/fg_os_osgviewer.cxx | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Viewer/fg_os_osgviewer.cxx b/src/Viewer/fg_os_osgviewer.cxx index 196f63426..d754c5f98 100644 --- a/src/Viewer/fg_os_osgviewer.cxx +++ b/src/Viewer/fg_os_osgviewer.cxx @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -175,8 +176,42 @@ static const char * getStereoMode() return "OFF"; } +/** + * merge OSG output into our logging system, so it gets recorded to file, + * and so we can display a GUI console with renderer issues, especially + * shader compilation warnings and errors. + */ +class NotifyLogger : public osg::NotifyHandler +{ +public: + // note this callback will be invoked by OSG from multiple threads. + // fortunately our Simgear logging implementation already handles + // that internally, so we simply pass the message on. + virtual void notify(osg::NotifySeverity severity, const char *message) + { + SG_LOG(SG_GL, translateSeverity(severity), message); + } + +private: + sgDebugPriority translateSeverity(osg::NotifySeverity severity) + { + switch (severity) { + case osg::ALWAYS: + case osg::FATAL: return SG_ALERT; + case osg::WARN: return SG_WARN; + case osg::NOTICE: + case osg::INFO: return SG_INFO; + case osg::DEBUG_FP: + case osg::DEBUG_INFO: return SG_DEBUG; + } + } +}; + void fgOSOpenWindow(bool stencil) { + osg::setNotifyHandler(new NotifyLogger); + //osg::setNotifyLevel(osg::DEBUG_INFO); + viewer = new osgViewer::Viewer; viewer->setDatabasePager(FGScenery::getPagerSingleton()); CameraGroup* cameraGroup = 0;