From 7ce1e100d734478b5ff058a9eb67c331f978fdbe Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Wed, 6 Feb 2013 01:22:44 +0100 Subject: [PATCH] Reapply canvas placements upon aircraft-model reinit --- src/Canvas/canvas_mgr.cxx | 17 ++++++++++++++++- src/Canvas/canvas_mgr.hxx | 6 ++++++ src/Model/acmodel.cxx | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Canvas/canvas_mgr.cxx b/src/Canvas/canvas_mgr.cxx index ca4515e9a..8da7a5a85 100644 --- a/src/Canvas/canvas_mgr.cxx +++ b/src/Canvas/canvas_mgr.cxx @@ -25,15 +25,22 @@ #include +using simgear::canvas::Canvas; + //------------------------------------------------------------------------------ CanvasMgr::CanvasMgr(): simgear::canvas::CanvasMgr ( fgGetNode("/canvas/by-index", true), simgear::canvas::SystemAdapterPtr( new canvas::FGCanvasSystemAdapter ) + ), + _cb_model_reinit + ( + this, + &CanvasMgr::handleModelReinit, + fgGetNode("/sim/signals/model-reinit", true) ) { - using simgear::canvas::Canvas; Canvas::addPlacementFactory ( "object", @@ -75,3 +82,11 @@ CanvasMgr::getCanvasTexId(const simgear::canvas::CanvasPtr& canvas) const return tobj->_id; } + +//---------------------------------------------------------------------------- +void CanvasMgr::handleModelReinit(SGPropertyNode*) +{ + for(size_t i = 0; i < _elements.size(); ++i) + boost::static_pointer_cast(_elements[i]) + ->reloadPlacements("object"); +} diff --git a/src/Canvas/canvas_mgr.hxx b/src/Canvas/canvas_mgr.hxx index fd4768c34..c1bf7e785 100644 --- a/src/Canvas/canvas_mgr.hxx +++ b/src/Canvas/canvas_mgr.hxx @@ -38,6 +38,12 @@ class CanvasMgr: * @return OpenGL texture name */ unsigned int getCanvasTexId(const simgear::canvas::CanvasPtr& canvas) const; + + protected: + + SGPropertyChangeCallback _cb_model_reinit; + + void handleModelReinit(SGPropertyNode*); }; #endif /* CANVAS_MGR_H_ */ diff --git a/src/Model/acmodel.cxx b/src/Model/acmodel.cxx index b585df060..c25802f4f 100644 --- a/src/Model/acmodel.cxx +++ b/src/Model/acmodel.cxx @@ -102,6 +102,8 @@ FGAircraftModel::reinit() deinit(); _fx->reinit(); init(); + // TODO globally create signals for all subsystems (re)initialized + fgSetBool("/sim/signals/model-reinit", true); } void -- 2.39.5