X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCanvas%2Fcanvas_mgr.cxx;h=6646b7762d42b86e39bc22fe15a5eb4010b97407;hb=45ab3a20a2e49dbaad3cda7acaef5d71e2713d54;hp=1bf143e5c52da2f04248d07782cbae661bffb19f;hpb=28779e7a5141e03175c3ab4d52222b27b6af65e5;p=flightgear.git diff --git a/src/Canvas/canvas_mgr.cxx b/src/Canvas/canvas_mgr.cxx index 1bf143e5c..6646b7762 100644 --- a/src/Canvas/canvas_mgr.cxx +++ b/src/Canvas/canvas_mgr.cxx @@ -18,40 +18,93 @@ #include "canvas_mgr.hxx" -#include #include #include
+#include #include #include +namespace sc = simgear::canvas; + +//------------------------------------------------------------------------------ +static sc::Placements addSceneObjectPlacement( SGPropertyNode* placement, + sc::CanvasPtr canvas ) +{ + int module_id = placement->getIntValue("module-id", -1); + if( module_id < 0 ) + return sc::Placements(); + + FGNasalModelData* model_data = + FGNasalModelData::getByModuleId( static_cast(module_id) ); + + if( !model_data ) + return sc::Placements(); + + if( !model_data->getNode() ) + return sc::Placements(); + + return FGODGauge::set_texture + ( + model_data->getNode(), + placement, + canvas->getTexture(), + canvas->getCullCallback(), + canvas + ); +} + //------------------------------------------------------------------------------ CanvasMgr::CanvasMgr(): - simgear::canvas::CanvasMgr + simgear::canvas::CanvasMgr( fgGetNode("/canvas/by-index", true) ), + _cb_model_reinit ( - fgGetNode("/canvas/by-index", true), - simgear::canvas::SystemAdapterPtr( new canvas::FGCanvasSystemAdapter ) + this, + &CanvasMgr::handleModelReinit, + fgGetNode("/sim/signals/model-reinit", true) ) { - using simgear::canvas::Canvas; - Canvas::addPlacementFactory + +} + +//---------------------------------------------------------------------------- +void CanvasMgr::init() +{ + _gui_camera = flightgear::getGUICamera(flightgear::CameraGroup::getDefault()); + assert(_gui_camera.valid()); + + sc::Canvas::addPlacementFactory ( "object", boost::bind ( - &FGODGauge::set_texture, + &FGODGauge::set_aircraft_texture, _1, - boost::bind(&Canvas::getTexture, _2), - boost::bind(&Canvas::getCullCallback, _2) + boost::bind(&sc::Canvas::getTexture, _2), + boost::bind(&sc::Canvas::getCullCallback, _2), + _2 ) ); + sc::Canvas::addPlacementFactory("scenery-object", &addSceneObjectPlacement); + + simgear::canvas::CanvasMgr::init(); } -//------------------------------------------------------------------------------ -unsigned int CanvasMgr::getCanvasTexId(size_t index) const +//---------------------------------------------------------------------------- +void CanvasMgr::shutdown() { - simgear::canvas::CanvasPtr canvas = getCanvas(index); + simgear::canvas::CanvasMgr::shutdown(); + + sc::Canvas::removePlacementFactory("object"); + sc::Canvas::removePlacementFactory("scenery-object"); + + _gui_camera = 0; +} +//------------------------------------------------------------------------------ +unsigned int +CanvasMgr::getCanvasTexId(const simgear::canvas::CanvasPtr& canvas) const +{ if( !canvas ) return 0; @@ -65,8 +118,9 @@ unsigned int CanvasMgr::getCanvasTexId(size_t index) const // if( contexts.empty() ) // return 0; - osg::Camera* guiCamera = - flightgear::getGUICamera(flightgear::CameraGroup::getDefault()); + osg::ref_ptr guiCamera; + if( !_gui_camera.lock(guiCamera) ) + return 0; osg::State* state = guiCamera->getGraphicsContext()->getState(); //contexts[0]->getState(); if( !state ) @@ -79,3 +133,10 @@ unsigned int CanvasMgr::getCanvasTexId(size_t index) const return tobj->_id; } + +//---------------------------------------------------------------------------- +void CanvasMgr::handleModelReinit(SGPropertyNode*) +{ + for(size_t i = 0; i < _elements.size(); ++i) + static_cast(_elements[i].get())->reloadPlacements("object"); +}