X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCanvas%2Fcanvas_mgr.cxx;h=6646b7762d42b86e39bc22fe15a5eb4010b97407;hb=45ab3a20a2e49dbaad3cda7acaef5d71e2713d54;hp=a175076237112b4583c097e2069a582a8ac682fc;hpb=83bbd9e45c1f04dbeac986a383cd6e253a7f9590;p=flightgear.git diff --git a/src/Canvas/canvas_mgr.cxx b/src/Canvas/canvas_mgr.cxx index a17507623..6646b7762 100644 --- a/src/Canvas/canvas_mgr.cxx +++ b/src/Canvas/canvas_mgr.cxx @@ -17,50 +17,126 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "canvas_mgr.hxx" -#include "canvas.hxx" -#include +#include +#include
+#include +#include -typedef boost::shared_ptr CanvasPtr; -CanvasPtr canvasFactory(SGPropertyNode* node) +#include + +namespace sc = simgear::canvas; + +//------------------------------------------------------------------------------ +static sc::Placements addSceneObjectPlacement( SGPropertyNode* placement, + sc::CanvasPtr canvas ) { - return CanvasPtr(new Canvas(node)); -} + 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(): - PropertyBasedMgr("/canvas/by-index", "texture", &canvasFactory) + simgear::canvas::CanvasMgr( fgGetNode("/canvas/by-index", true) ), + _cb_model_reinit + ( + this, + &CanvasMgr::handleModelReinit, + fgGetNode("/sim/signals/model-reinit", true) + ) +{ + +} + +//---------------------------------------------------------------------------- +void CanvasMgr::init() { - Canvas::addPlacementFactory + _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(); } -//------------------------------------------------------------------------------ -CanvasPtr CanvasMgr::getCanvas(size_t index) const +//---------------------------------------------------------------------------- +void CanvasMgr::shutdown() { - if( index >= _elements.size() - || !_elements[index] ) - return CanvasPtr(); + simgear::canvas::CanvasMgr::shutdown(); + + sc::Canvas::removePlacementFactory("object"); + sc::Canvas::removePlacementFactory("scenery-object"); - return boost::static_pointer_cast(_elements[index]); + _gui_camera = 0; } //------------------------------------------------------------------------------ -unsigned int CanvasMgr::getCanvasTexId(size_t index) const +unsigned int +CanvasMgr::getCanvasTexId(const simgear::canvas::CanvasPtr& canvas) const { - CanvasPtr canvas = getCanvas(index); - if( canvas ) - return canvas->getTexId(); - else + if( !canvas ) + return 0; + + osg::Texture2D* tex = canvas->getTexture(); + if( !tex ) + return 0; + +// osgViewer::Viewer::Contexts contexts; +// globals->get_renderer()->getViewer()->getContexts(contexts); +// +// if( contexts.empty() ) +// return 0; + + osg::ref_ptr guiCamera; + if( !_gui_camera.lock(guiCamera) ) return 0; + + osg::State* state = guiCamera->getGraphicsContext()->getState(); //contexts[0]->getState(); + if( !state ) + return 0; + + osg::Texture::TextureObject* tobj = + tex->getTextureObject( state->getContextID() ); + if( !tobj ) + return 0; + + return tobj->_id; +} + +//---------------------------------------------------------------------------- +void CanvasMgr::handleModelReinit(SGPropertyNode*) +{ + for(size_t i = 0; i < _elements.size(); ++i) + static_cast(_elements[i].get())->reloadPlacements("object"); }