From 2c3ead29fa4d875097a48b2833264506471b11fa Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 14 Mar 2007 12:43:29 +0000 Subject: [PATCH] Added osgterrain example --- examples/osgterrain/osgterrain.cpp | 132 +++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 examples/osgterrain/osgterrain.cpp diff --git a/examples/osgterrain/osgterrain.cpp b/examples/osgterrain/osgterrain.cpp new file mode 100644 index 000000000..8a31f4b44 --- /dev/null +++ b/examples/osgterrain/osgterrain.cpp @@ -0,0 +1,132 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include + +#include + +osg::Node* createEarth() +{ + osg::TessellationHints* hints = new osg::TessellationHints; + hints->setDetailRatio(5.0f); + + + osg::ShapeDrawable* sd = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0,0.0,0.0), osg::WGS_84_RADIUS_POLAR), hints); + + osg::Geode* geode = new osg::Geode; + geode->addDrawable(sd); + + std::string filename = osgDB::findDataFile("Images/land_shallow_topo_2048.jpg"); + geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, new osg::Texture2D(osgDB::readImageFile(filename))); + + osg::CoordinateSystemNode* csn = new osg::CoordinateSystemNode; + csn->setEllipsoidModel(new osg::EllipsoidModel()); + csn->addChild(geode); + + return csn; + +} + +osgText::Text* createText(osg::EllipsoidModel* ellipsoid, double latitude, double longitude, double height, const std::string& str) +{ + double X,Y,Z; + ellipsoid->convertLatLongHeightToXYZ( osg::DegreesToRadians(latitude), osg::DegreesToRadians(longitude), height, X, Y, Z); + + + osgText::Text* text = new osgText::FadeText; + + osg::Vec3 normal = ellipsoid->computeLocalUpVector( X, Y, Z); + text->setCullCallback(new osg::ClusterCullingCallback(osg::Vec3(X,Y,Z), normal, 0.0)); + + text->setText(str); + text->setFont("fonts/arial.ttf"); + text->setPosition(osg::Vec3(X,Y,Z)); + text->setCharacterSize(300000.0f); + text->setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT); + text->setAutoRotateToScreen(true); + + return text; +} + +osg::Node* createFadeText(osg::EllipsoidModel* ellipsoid) +{ + osg::Group* group = new osg::Group; + + group->getOrCreateStateSet()->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); + + osg::Geode* geode = new osg::Geode; + group->addChild(geode); + + std::vector textList; + textList.push_back("Town"); + textList.push_back("City"); + textList.push_back("Village"); + textList.push_back("River"); + textList.push_back("Mountain"); + textList.push_back("Road"); + textList.push_back("Lake"); + + unsigned int numLat = 15; + unsigned int numLong = 20; + double latitude = 0.0; + double longitude = -100.0; + double deltaLatitude = 1.0f; + double deltaLongitude = 1.0f; + + unsigned int t = 0; + for(unsigned int i = 0; i < numLat; ++i, latitude += deltaLatitude) + { + double lgnt = longitude; + for(unsigned int j = 0; j < numLong; ++j, ++t, lgnt += deltaLongitude) + { + geode->addDrawable( createText( ellipsoid, latitude, lgnt, 0, textList[t % textList.size()]) ); + } + } + + return group; +} + + +int main(int, char**) +{ + // construct the viewer. + osgViewer::Viewer viewer; + + viewer.getCamera()->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES); + viewer.getCamera()->setNearFarRatio(0.00001f); + + // read the scene from the list of file specified commandline args. + osg::ref_ptr root = createEarth(); + + if (!root) return 0; + + // add a viewport to the viewer and attach the scene graph. + viewer.setSceneData(root.get()); + + osg::CoordinateSystemNode* csn = dynamic_cast(root.get()); + if (csn) + { + // add fade text around the globe + csn->addChild(createFadeText(csn->getEllipsoidModel())); + } + + viewer.setCameraManipulator(new osgGA::TerrainManipulator); + + return viewer.run(); +}