1 // Integrate Canvas into FlightGear
3 // Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License as
7 // published by the Free Software Foundation; either version 2 of the
8 // License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful, but
11 // WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 #include "FGCanvasSystemAdapter.hxx"
21 #include <Main/globals.hxx>
22 #include <Main/util.hxx>
23 #include <Scripting/NasalSys.hxx>
24 #include <Viewer/renderer.hxx>
26 #include <osgDB/ReadFile>
31 //----------------------------------------------------------------------------
32 simgear::canvas::FontPtr
33 FGCanvasSystemAdapter::getFont(const std::string& name) const
35 SGPath path = globals->resolve_resource_path("Fonts/" + name);
42 "canvas::Text: No such font: " << name
44 return simgear::canvas::FontPtr();
51 "canvas::Text: using font file " << path.str()
54 simgear::canvas::FontPtr font = osgText::readFontFile(path.c_str());
60 "canvas::Text: Failed to open font file " << path.c_str()
66 //----------------------------------------------------------------------------
67 void FGCanvasSystemAdapter::addCamera(osg::Camera* camera) const
69 globals->get_renderer()->addCamera(camera, false);
72 //----------------------------------------------------------------------------
73 void FGCanvasSystemAdapter::removeCamera(osg::Camera* camera) const
75 globals->get_renderer()->removeCamera(camera);
78 //----------------------------------------------------------------------------
79 osg::Image* FGCanvasSystemAdapter::getImage(const std::string& path) const
81 if( SGPath(path).isAbsolute() )
83 const char* valid_path = fgValidatePath(path.c_str(), false);
85 return osgDB::readImageFile(valid_path);
87 SG_LOG(SG_IO, SG_ALERT, "canvas::Image: reading '" << path << "' denied");
91 SGPath tpath = globals->resolve_resource_path(path);
93 return osgDB::readImageFile(tpath.c_str());
95 SG_LOG(SG_IO, SG_ALERT, "canvas::Image: No such image: '" << path << "'");
102 * Get current FGNasalSys instance.
104 static FGNasalSys* getNasalSys()
106 static FGNasalSys* nasal_sys = 0;
107 // TODO if Nasal is able to be removed and/or recreated at runtime we need
108 // to ensure that always the current instance is used
111 nasal_sys = dynamic_cast<FGNasalSys*>(globals->get_subsystem("nasal"));
113 throw std::runtime_error("FGCanvasSystemAdapter: no NasalSys");
119 //----------------------------------------------------------------------------
120 naContext FGCanvasSystemAdapter::getNasalContext() const
122 return getNasalSys()->context();
125 //----------------------------------------------------------------------------
126 int FGCanvasSystemAdapter::gcSave(naRef r)
128 return getNasalSys()->gcSave(r);
131 //----------------------------------------------------------------------------
132 void FGCanvasSystemAdapter::gcRelease(int key)
134 getNasalSys()->gcRelease(key);
137 //------------------------------------------------------------------------------
138 naRef FGCanvasSystemAdapter::callMethod( naRef code,
144 return getNasalSys()->callMethod(code, self, argc, args, locals);