From 7613cb3ce733a93c2eda4db8e7dd8a33d1f923a6 Mon Sep 17 00:00:00 2001 From: James Turner Date: Wed, 9 Mar 2022 16:45:41 +0000 Subject: [PATCH] Canvas GUIMgr: remove coupling on FGRenderer --- src/Canvas/gui_mgr.cxx | 35 ++++++++++++++++++++--------------- src/Canvas/gui_mgr.hxx | 6 ++++++ src/GUI/new_gui.cxx | 22 ++++++++++++---------- src/Main/fg_init.cxx | 5 ++++- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/Canvas/gui_mgr.cxx b/src/Canvas/gui_mgr.cxx index 282af1266..6e6db2b3b 100644 --- a/src/Canvas/gui_mgr.cxx +++ b/src/Canvas/gui_mgr.cxx @@ -21,8 +21,6 @@ #include
#include
#include
-#include -#include #include #include @@ -32,6 +30,7 @@ #include #include +#include #include class DesktopGroup; @@ -117,7 +116,7 @@ class DesktopGroup: public sc::Group { public: - DesktopGroup(); + DesktopGroup(osgViewer::View* view); void setFocusWindow(const sc::WindowPtr& window); @@ -203,7 +202,7 @@ bool GUIEventHandler::handle( const osgEA& ea, } //------------------------------------------------------------------------------ -DesktopGroup::DesktopGroup(): +DesktopGroup::DesktopGroup(osgViewer::View* view): Group(sc::CanvasPtr(), fgGetNode("/sim/gui/canvas", true)), _cb_mouse_mode( this, &DesktopGroup::handleMouseMode, @@ -211,7 +210,7 @@ DesktopGroup::DesktopGroup(): _width(_node, "size[0]"), _height(_node, "size[1]") { - auto camera = flightgear::getGUICamera(flightgear::CameraGroup::getDefault()); + auto camera = view->getCamera(); if( !camera ) { SG_LOG(SG_GUI, SG_WARN, "DesktopGroup: failed to get GUI camera."); @@ -642,6 +641,12 @@ GUIMgr::GUIMgr() } +//------------------------------------------------------------------------------ +void GUIMgr::setGUIView(osgViewer::View* view) +{ + _viewerView = view; +} + //------------------------------------------------------------------------------ sc::WindowPtr GUIMgr::createWindow(const std::string& name) { @@ -654,13 +659,14 @@ sc::WindowPtr GUIMgr::createWindow(const std::string& name) //------------------------------------------------------------------------------ void GUIMgr::init() { - if( _desktop && _event_handler ) + assert(_viewerView); + if( _desktop && _event_handler ) { SG_LOG(SG_GUI, SG_WARN, "GUIMgr::init() already initialized."); return; } - DesktopPtr desktop( new DesktopGroup ); + DesktopPtr desktop( new DesktopGroup(_viewerView) ); desktop->handleResize ( 0, @@ -671,9 +677,7 @@ void GUIMgr::init() _desktop = desktop; _event_handler = new GUIEventHandler(desktop); - globals->get_renderer() - ->getView() - ->getEventHandlers() + _viewerView->getEventHandlers() // GUI is on top of everything so lets install as first event handler .push_front( _event_handler ); @@ -705,11 +709,11 @@ void GUIMgr::shutdown() if( _event_handler ) { - globals->get_renderer() - ->getView() - ->removeEventHandler( _event_handler ); + _viewerView->removeEventHandler( _event_handler ); _event_handler = 0; } + + _viewerView = nullptr; } //------------------------------------------------------------------------------ @@ -766,5 +770,6 @@ GUIMgr::addWindowPlacement( SGPropertyNode* placement, // Register the subsystem. SGSubsystemMgr::Registrant registrantGUIMgr( SGSubsystemMgr::DISPLAY, - {{"viewer", SGSubsystemMgr::Dependency::HARD}, - {"FGRenderer", SGSubsystemMgr::Dependency::NONSUBSYSTEM_HARD}}); + { + {"viewer", SGSubsystemMgr::Dependency::HARD}, + }); diff --git a/src/Canvas/gui_mgr.hxx b/src/Canvas/gui_mgr.hxx index f44c3d200..0abf86887 100644 --- a/src/Canvas/gui_mgr.hxx +++ b/src/Canvas/gui_mgr.hxx @@ -28,6 +28,7 @@ #include #include +namespace osgViewer { class View; } namespace osgGA { class GUIEventAdapter; @@ -70,9 +71,14 @@ public: */ void ungrabPointer(const simgear::canvas::WindowPtr& window); + /** + * specify the osgViewer::View which contains the GUI. + */ + void setGUIView(osgViewer::View* view); protected: simgear::canvas::GroupPtr _desktop; osg::ref_ptr _event_handler; + osg::ref_ptr _viewerView;; simgear::canvas::Placements addWindowPlacement( SGPropertyNode* placement, diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index 984a2cc4b..24633678e 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -126,18 +126,20 @@ NewGUI::init () SGPath p(globals->get_fg_root(), "gui/dialogs"); readDir(p); - SGPath aircraftDialogDir(fgGetString("/sim/aircraft-dir"), "gui/dialogs"); - if (aircraftDialogDir.exists()) { - readDir(aircraftDialogDir); - } + if (fgGetBool("/sim/gui/startup") == false) { + SGPath aircraftDialogDir(fgGetString("/sim/aircraft-dir"), "gui/dialogs"); + if (aircraftDialogDir.exists()) { + readDir(aircraftDialogDir); + } - // Read XML dialogs made available by registered add-ons - const auto& addonManager = flightgear::addons::AddonManager::instance(); - for (const auto& addon: addonManager->registeredAddons()) { - SGPath addonDialogDir = addon->getBasePath() / "gui/dialogs"; + // Read XML dialogs made available by registered add-ons + const auto& addonManager = flightgear::addons::AddonManager::instance(); + for (const auto& addon: addonManager->registeredAddons()) { + SGPath addonDialogDir = addon->getBasePath() / "gui/dialogs"; - if (addonDialogDir.exists()) { - readDir(addonDialogDir); + if (addonDialogDir.exists()) { + readDir(addonDialogDir); + } } } diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index b91e38ed9..3244670cd 100755 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -1103,7 +1103,10 @@ void fgCreateSubsystems(bool duringReset) { simgear::canvas::SystemAdapterPtr(new canvas::FGCanvasSystemAdapter) ); globals->add_subsystem("Canvas", new CanvasMgr, SGSubsystemMgr::DISPLAY); - globals->add_subsystem("CanvasGUI", new GUIMgr, SGSubsystemMgr::DISPLAY); + + auto canvasGui = new GUIMgr; + globals->add_subsystem("CanvasGUI", canvasGui, SGSubsystemMgr::DISPLAY); + canvasGui->setGUIView(globals->get_renderer()->getView()); #ifdef ENABLE_AUDIO_SUPPORT globals->add_subsystem("voice", new FGVoiceMgr, SGSubsystemMgr::DISPLAY);