20,741
edits
Line 251: | Line 251: | ||
<syntaxhighlight lang="diff"> | <syntaxhighlight lang="diff"> | ||
diff --git a/src/Canvas/FGCanvasSystemAdapter.cxx b/src/Canvas/FGCanvasSystemAdapter.cxx | diff --git a/src/Canvas/FGCanvasSystemAdapter.cxx b/src/Canvas/FGCanvasSystemAdapter.cxx | ||
index 72b20747e..9e04dbd14 100644 | |||
--- a/src/Canvas/FGCanvasSystemAdapter.cxx | |||
+++ b/src/Canvas/FGCanvasSystemAdapter.cxx | |||
@@ -23,9 +23,18 @@ | |||
#include <Network/HTTPClient.hxx> | |||
#include <Viewer/renderer.hxx> | |||
+ | |||
+#include <Viewer/view.hxx> | |||
+#include <Viewer/viewmgr.hxx> | |||
+#include <simgear/scene/util/OsgMath.hxx> | |||
+ | |||
+ | |||
+ | |||
#include <osgDB/ReadFile> | |||
#include <stdexcept> | |||
+#include <simgear/scene/model/modellib.hxx> | |||
+ | |||
namespace canvas | |||
{ | |||
//---------------------------------------------------------------------------- | |||
@@ -64,9 +73,9 @@ namespace canvas | |||
} | |||
//---------------------------------------------------------------------------- | |||
- void FGCanvasSystemAdapter::addCamera(osg::Camera* camera) const | |||
+ void FGCanvasSystemAdapter::addCamera(osg::Camera* camera, bool useSceneData) const | |||
{ | |||
- globals->get_renderer()->addCamera(camera, false); | |||
+ globals->get_renderer()->addCamera(camera, useSceneData); | |||
} | |||
//---------------------------------------------------------------------------- | |||
@@ -100,6 +109,46 @@ namespace canvas | |||
return 0; | |||
} | |||
+ //---------------------------------------------------------------------------- | |||
+ // From http://wiki.flightgear.org/Howto:Extending_Canvas_to_support_rendering_3D_models#Extending_FGCanvasSystemAdapter | |||
+ osg::Node* FGCanvasSystemAdapter::getModel(const std::string& path) const | |||
+ { | |||
+ const char *model_path = "Models/Geometry/glider.ac"; | |||
+ SGPath p(SGPath::fromUtf8(path)); | |||
+ | |||
+ if( p.isAbsolute() ) | |||
+ { | |||
+ SGPath valid_path = fgValidatePath(p, false); | |||
+ if( !valid_path.isNull() ) | |||
+ try { | |||
+ std::string fullPath = simgear::SGModelLib::findDataFile(valid_path.local8BitStr()); | |||
+ osg::Node * object = simgear::SGModelLib::loadDeferredModel(fullPath, globals->get_props()); | |||
+ return object; | |||
+ } catch (const sg_throwable& t) { | |||
+ SG_LOG(SG_IO, SG_ALERT, "Error loading " << model_path << ":\n " << t.getFormattedMessage() << t.getOrigin()); | |||
+ return 0; | |||
+ } // error loading from absolute path | |||
+ SG_LOG(SG_IO, SG_ALERT, "canvas::Model: reading '" << path << "' denied"); | |||
+ } // absolute path handling | |||
+ else | |||
+ { | |||
+ SGPath tpath = globals->resolve_resource_path(path); | |||
+ if( !tpath.isNull() ) | |||
+ try { | |||
+ std::string fullPath = simgear::SGModelLib::findDataFile(path.c_str()); | |||
+ osg::Node * object = simgear::SGModelLib::loadDeferredModel(fullPath, globals->get_props()); | |||
+ return object; | |||
+ } catch (const sg_throwable& t) { | |||
+ SG_LOG(SG_IO, SG_ALERT, "Error loading " << model_path << ":\n " << t.getFormattedMessage() << t.getOrigin()); | |||
+ return 0; | |||
+ } // error loading from relative path | |||
+ | |||
+ SG_LOG(SG_IO, SG_ALERT, "canvas::Model: No such model: '" << path << "'"); | |||
+ } // relative path handling | |||
+ | |||
+ return 0; | |||
+ } | |||
+ | |||
//---------------------------------------------------------------------------- | |||
SGSubsystem* | |||
FGCanvasSystemAdapter::getSubsystem(const std::string& name) const | |||
@@ -121,4 +170,16 @@ namespace canvas | |||
return 0; | |||
} | |||
+ osg::Matrix FGCanvasSystemAdapter::getViewMatrix(int view_number, double dt) const | |||
+ { | |||
+ flightgear::View *view = globals->get_viewmgr()->get_view(view_number); | |||
+ view->update(dt); | |||
+ | |||
+ osg::Vec3f position( toOsg(view->getViewPosition()) ); | |||
+ osg::Quat orientation( toOsg(view->getViewOrientation()) ); | |||
+ osg::Matrix viewMatrix( osg::Matrix::translate(-position) * osg::Matrix::rotate(orientation.inverse()) ); | |||
+ | |||
+ return viewMatrix; | |||
+ } | |||
+ | |||
} | |||
diff --git a/src/Canvas/FGCanvasSystemAdapter.hxx b/src/Canvas/FGCanvasSystemAdapter.hxx | |||
index 4c1fd6210..24ececb41 100644 | |||
--- a/src/Canvas/FGCanvasSystemAdapter.hxx | |||
+++ b/src/Canvas/FGCanvasSystemAdapter.hxx | |||
@@ -28,11 +28,13 @@ namespace canvas | |||
{ | |||
public: | |||
virtual simgear::canvas::FontPtr getFont(const std::string& name) const; | |||
- virtual void addCamera(osg::Camera* camera) const; | |||
+ virtual void addCamera(osg::Camera* camera, bool useSceneData = false) const; | |||
virtual void removeCamera(osg::Camera* camera) const; | |||
virtual osg::ref_ptr<osg::Image> getImage(const std::string& path) const; | |||
+ virtual osg::Node* getModel(const std::string& path) const; | |||
virtual SGSubsystem* getSubsystem(const std::string& name) const; | |||
virtual simgear::HTTP::Client* getHTTPClient() const; | |||
+ virtual osg::Matrix getViewMatrix(int view_number, double dt) const; | |||
}; | |||
} | |||
diff --git a/src/Viewer/renderer.cxx b/src/Viewer/renderer.cxx | |||
index d9e8f351f..b9b3fc6a0 100644 | |||
--- a/src/Viewer/renderer.cxx | |||
+++ b/src/Viewer/renderer.cxx | |||
@@ -1845,6 +1845,8 @@ FGRenderer::setEventHandler(FGEventHandler* eventHandler_) | |||
void | |||
FGRenderer::addCamera(osg::Camera* camera, bool useSceneData) | |||
{ | |||
+ if (useSceneData) | |||
+ camera->addChild(globals->get_scenery()->get_scene_graph()); | |||
_viewerSceneRoot->addChild(camera); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
fgdata | |||
<syntaxhighlight lang="diff"> | <syntaxhighlight lang="diff"> | ||
diff --git a/Nasal/canvas/api.nas b/Nasal/canvas/api.nas | diff --git a/Nasal/canvas/api.nas b/Nasal/canvas/api.nas |