FlightGear next
canvas_mgr.cxx
Go to the documentation of this file.
1/*
2 * SPDX-FileName: canvas_mgr.cxx
3 * SPDX-FileComment: Canvas with 2D rendering api
4 * SPDX-FileCopyrightText: Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "canvas_mgr.hxx"
9
10#include <Main/fg_props.hxx>
13#include <Model/modelmgr.hxx>
14
15#include <simgear/canvas/Canvas.hxx>
16#include <simgear/scene/model/placement.hxx>
17
18#include "texture_replace.hxx"
19
20namespace sc = simgear::canvas;
21using namespace canvas;
22
23//------------------------------------------------------------------------------
24static sc::Placements addSceneObjectPlacement( SGPropertyNode* placement,
25 sc::CanvasPtr canvas )
26{
27 int module_id = placement->getIntValue("module-id", -1);
28 if( module_id < 0 )
29 return sc::Placements();
30
31 FGNasalModelData* model_data =
32 FGNasalModelData::getByModuleId( static_cast<unsigned int>(module_id) );
33
34 if( !model_data )
35 return sc::Placements();
36
37 if( !model_data->getNode() )
38 return sc::Placements();
39
40 return set_texture
41 (
42 model_data->getNode(),
43 placement,
44 canvas->getTexture(),
45 canvas->getCullCallback(),
46 canvas
47 );
48}
49
50
51//------------------------------------------------------------------------------
52static sc::Placements addDynamicModelPlacement(SGPropertyNode* placement,
53 sc::CanvasPtr canvas)
54{
55 const std::string dyn_model_path = placement->getStringValue("model-path");
56 if (dyn_model_path.empty())
57 return {};
58
59 auto modelmgr = globals->get_subsystem<FGModelMgr>();
60 if (!modelmgr)
61 return {};
62
63 FGModelMgr::Instance* model_instance = modelmgr->findInstanceByNodePath(dyn_model_path);
64 if (!model_instance || !model_instance->model || !model_instance->model->getSceneGraph())
65 return {};
66
67 return set_texture(
68 model_instance->model->getSceneGraph(),
69 placement,
70 canvas->getTexture(),
71 canvas->getCullCallback(),
72 canvas);
73}
74
75//------------------------------------------------------------------------------
77 simgear::canvas::CanvasMgr( fgGetNode("/canvas/by-index", true) ),
79 (
80 this,
82 fgGetNode("/sim/signals/model-reinit", true)
83 )
84{
85}
86
87//----------------------------------------------------------------------------
89{
90 // add our two placement factories
91 sc::Canvas::addPlacementFactory
92 (
93 "object", [](SGPropertyNode* placement, sc::CanvasPtr canvas) {
94 return set_aircraft_texture(placement,
95 canvas->getTexture(),
96 canvas->getCullCallback(),
97 canvas);
98 });
99 sc::Canvas::addPlacementFactory("scenery-object", &addSceneObjectPlacement);
100 sc::Canvas::addPlacementFactory("dynamic-model", &addDynamicModelPlacement);
101
102 simgear::canvas::CanvasMgr::init();
103}
104
105//----------------------------------------------------------------------------
107{
108 simgear::canvas::CanvasMgr::shutdown();
109
110 sc::Canvas::removePlacementFactory("object");
111 sc::Canvas::removePlacementFactory("scenery-object");
112 sc::Canvas::removePlacementFactory("dynamic-model");
113}
114
115//------------------------------------------------------------------------------
116unsigned int
117CanvasMgr::getCanvasTexId(const simgear::canvas::CanvasPtr& canvas) const
118{
119 if( !canvas )
120 return 0;
121
122 osg::Texture2D* tex = canvas->getTexture();
123 if( !tex )
124 return 0;
125
126// osgViewer::Viewer::Contexts contexts;
127// globals->get_renderer()->getViewer()->getContexts(contexts);
128//
129// if( contexts.empty() )
130// return 0;
131
133 if (!guiCamera)
134 return 0;
135
136 osg::State* state = guiCamera->getGraphicsContext()->getState(); //contexts[0]->getState();
137 if( !state )
138 return 0;
139
140 osg::Texture::TextureObject* tobj =
141 tex->getTextureObject( state->getContextID() );
142 if( !tobj )
143 return 0;
144
145 return tobj->_id;
146}
147
148//----------------------------------------------------------------------------
149void CanvasMgr::handleModelReinit(SGPropertyNode*)
150{
151 for (size_t i = 0; i < _elements.size(); ++i)
152 {
153 sc::Canvas* element = static_cast<sc::Canvas*>(_elements[i].get());
154 if (element)
155 element->reloadPlacements("object");
156 }
157}
158
159
160// Register the subsystem.
161SGSubsystemMgr::Registrant<CanvasMgr> registrantCanvasMgr(
162 SGSubsystemMgr::DISPLAY);
#define i(x)
static sc::Placements addSceneObjectPlacement(SGPropertyNode *placement, sc::CanvasPtr canvas)
SGSubsystemMgr::Registrant< CanvasMgr > registrantCanvasMgr(SGSubsystemMgr::DISPLAY)
static sc::Placements addDynamicModelPlacement(SGPropertyNode *placement, sc::CanvasPtr canvas)
void handleModelReinit(SGPropertyNode *)
unsigned int getCanvasTexId(const simgear::canvas::CanvasPtr &canvas) const
Get OpenGL texture name for given canvas.
void init() override
void shutdown() override
SGPropertyChangeCallback< CanvasMgr > _cb_model_reinit
Manage a list of user-specified models.
Definition modelmgr.hxx:26
Nasal model data container.
static FGNasalModelData * getByModuleId(unsigned int id)
Get FGNasalModelData for model with the given module id.
osg::Node * getNode()
Get osg scenegraph node of model.
static CameraGroup * getDefault()
Get the default CameraGroup.
FGGlobals * globals
Definition globals.cxx:142
simgear::canvas::Placements set_texture(osg::Node *branch, const char *name, osg::Texture2D *new_texture)
Replace an opengl texture name inside a given branch of the scene graph.
simgear::canvas::Placements set_aircraft_texture(const char *name, osg::Texture2D *new_texture)
Replace an opengl texture name inside the aircraft scene graph.
osg::Camera * getGUICamera(CameraGroup *cgroup)
Get the osg::Camera that draws the GUI, if any, from a camera group.
SGPropertyNode * fgGetNode(const char *path, bool create)
Get a property node.
Definition proptest.cpp:27
A dynamically-placed model using properties.
Definition modelmgr.hxx:43
SGModelPlacement * model
Definition modelmgr.hxx:45