diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 64647bf30..671ff2d7c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -101,7 +101,7 @@ IF(DYNAMIC_OPENSCENEGRAPH) ADD_SUBDIRECTORY(osgspotlight) ADD_SUBDIRECTORY(osgstereoimage) ADD_SUBDIRECTORY(osgstereomatch) - # ADD_SUBDIRECTORY(osgterrain) + ADD_SUBDIRECTORY(osgterrain) ADD_SUBDIRECTORY(osgthreadedterrain) ADD_SUBDIRECTORY(osgtext) ADD_SUBDIRECTORY(osgtext3D) diff --git a/examples/osgterrain/CMakeLists.txt b/examples/osgterrain/CMakeLists.txt new file mode 100644 index 000000000..550c633a4 --- /dev/null +++ b/examples/osgterrain/CMakeLists.txt @@ -0,0 +1,6 @@ +SET(TARGET_SRC osgterrain.cpp) + +SET(TARGET_ADDED_LIBRARIES osgTerrain ) + +#### end var setup ### +SETUP_EXAMPLE(osgterrain) diff --git a/examples/osgterrain/osgterrain.cpp b/examples/osgterrain/osgterrain.cpp new file mode 100644 index 000000000..c2f4a9a36 --- /dev/null +++ b/examples/osgterrain/osgterrain.cpp @@ -0,0 +1,166 @@ +/* OpenSceneGraph example, osgterrain. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +template +class FindTopMostNodeOfTypeVisitor : public osg::NodeVisitor +{ +public: + FindTopMostNodeOfTypeVisitor(): + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), + _foundNode(0) + {} + + void apply(osg::Node& node) + { + T* result = dynamic_cast(&node); + if (result) + { + _foundNode = result; + } + else + { + traverse(node); + } + } + + T* _foundNode; +}; + +template +T* findTopMostNodeOfType(osg::Node* node) +{ + if (!node) return 0; + + FindTopMostNodeOfTypeVisitor fnotv; + node->accept(fnotv); + + return fnotv._foundNode; +} + +int main(int argc, char** argv) +{ + osg::ArgumentParser arguments(&argc, argv); + + // construct the viewer. + osgViewer::Viewer viewer(arguments); + + // set up the camera manipulators. + { + osg::ref_ptr keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator; + + keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); + keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() ); + keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() ); + keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() ); + + std::string pathfile; + char keyForAnimationPath = '5'; + while (arguments.read("-p",pathfile)) + { + osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile); + if (apm || !apm->valid()) + { + unsigned int num = keyswitchManipulator->getNumMatrixManipulators(); + keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm ); + keyswitchManipulator->selectMatrixManipulator(num); + ++keyForAnimationPath; + } + } + + viewer.setCameraManipulator( keyswitchManipulator.get() ); + } + + + // add the state manipulator + viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) ); + + // add the stats handler + viewer.addEventHandler(new osgViewer::StatsHandler); + + // add the record camera path handler + viewer.addEventHandler(new osgViewer::RecordCameraPathHandler); + + // obtain the vertical scale + float verticalScale = 1.0f; + while(arguments.read("-v",verticalScale)) {} + + // obtain the sample ratio + float sampleRatio = 1.0f; + while(arguments.read("-r",sampleRatio)) {} + + osgTerrain::TerrainTile::BlendingPolicy blendingPolicy = osgTerrain::TerrainTile::INHERIT; + std::string strBlendingPolicy; + while(arguments.read("--blending-policy", strBlendingPolicy)) + { + if (strBlendingPolicy == "INHERIT") blendingPolicy = osgTerrain::TerrainTile::INHERIT; + else if (strBlendingPolicy == "DO_NOT_SET_BLENDING") blendingPolicy = osgTerrain::TerrainTile::DO_NOT_SET_BLENDING; + else if (strBlendingPolicy == "ENABLE_BLENDING") blendingPolicy = osgTerrain::TerrainTile::ENABLE_BLENDING; + else if (strBlendingPolicy == "ENABLE_BLENDING_WHEN_ALPHA_PRESENT") blendingPolicy = osgTerrain::TerrainTile::ENABLE_BLENDING_WHEN_ALPHA_PRESENT; + } + + // load the nodes from the commandline arguments. + osg::Node* rootnode = osgDB::readNodeFiles(arguments); + + if (!rootnode) + { + osg::notify(osg::NOTICE)<<"Warning: no valid data loaded, please specify a database on the command line."<(rootnode); + if (!terrain) + { + terrain = new osgTerrain::Terrain; + terrain->addChild(rootnode); + + rootnode = terrain; + } + + terrain->setSampleRatio(sampleRatio); + terrain->setVerticalScale(verticalScale); + terrain->setBlendingPolicy(blendingPolicy); + + // add a viewport to the viewer and attach the scene graph. + viewer.setSceneData( rootnode ); + + + // run the viewers main loop + return viewer.run(); + +}