Hi
I've added a -hf (or --HeightField) and -shp command line options to
respectively specify the height field and shape files to load. Default
behavior is kept (ie loading files from David's computer :) ).
I've also added a polygon offset to force the mapped shapefiles to be
over the terrain.
--
Jean-Christophe Lombardo
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This application is open source and may be redistributed and/or modified
* freely and without restriction, both in commericial and non commericial
applications,
* as long as this copyright notice is maintained.
*
* This application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>
#include <osg/Material>
#include <osg/PolygonOffset>
#include <osg/Vec4>
#include <osg/Switch>
#include <osgText/Text>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <vpb/HeightFieldMapper>
#include <iostream>
#include <osg/Geometry>
#include <osg/ShapeDrawable>
#include <osg/Shape>
#include <osg/Geode>
#include <osg/PolygonMode>
osg::Geode * createSceneGraph()
{
osg::Geometry * geo = new osg::Geometry;
osg::Vec3Array * vertexArray = new osg::Vec3Array;
vertexArray->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
vertexArray->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
vertexArray->push_back(osg::Vec3(1.0f, 1.0f, 0.0f));
vertexArray->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
geo->setVertexArray(vertexArray);
osg::DrawElementsUInt * de = new
osg::DrawElementsUInt(osg::PrimitiveSet::QUADS);
de->push_back(0);
de->push_back(1);
de->push_back(2);
de->push_back(3);
geo->addPrimitiveSet(de);
osg::Vec3Array * colorArray = new osg::Vec3Array;
colorArray->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
colorArray->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
colorArray->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
colorArray->push_back(osg::Vec3(1.0f, 1.0f, 1.0f));
geo->setColorArray(colorArray);
geo->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
osg::Geode * geode = new osg::Geode;
geode->addDrawable(geo);
return geode;
}
int main(int argc, char** argv)
{
// use an ArgumentParser object to manage the program arguments.
osg::ArgumentParser arguments(&argc,argv);
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+"
is the standard OpenSceneGraph example which loads and visualises 3d models.");
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
[options] filename ...");
arguments.getApplicationUsage()->addCommandLineOption("-h or
--help","Display command line parameters");
arguments.getApplicationUsage()->addCommandLineOption("--help-env","Display
environmental variables available");
arguments.getApplicationUsage()->addCommandLineOption("--help-keys","Display
keyboard & mouse bindings available");
arguments.getApplicationUsage()->addCommandLineOption("--help-all","Display
all command line, env vars and keyboard & mouse bindings.");
arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select
SingleThreaded threading model for viewer.");
arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select
CullDrawThreadPerContext threading model for viewer.");
arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select
DrawThreadPerContext threading model for viewer.");
arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select
CullThreadPerCameraDrawThreadPerContext threading model for viewer.");
arguments.getApplicationUsage()->addCommandLineOption("-hf or --HeightField
<height field>","Load the height field.");
arguments.getApplicationUsage()->addCommandLineOption("-shp <shape
file>","The geometry to reproject.");
// if user request help write it out to cout.
bool helpAll = arguments.read("--help-all");
unsigned int helpType = ((helpAll || arguments.read("-h") ||
arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) |
((helpAll || arguments.read("--help-env"))?
osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE : 0 ) |
((helpAll || arguments.read("--help-keys"))?
osg::ApplicationUsage::KEYBOARD_MOUSE_BINDING : 0 );
if (helpType)
{
arguments.getApplicationUsage()->write(std::cout, helpType);
return 1;
}
osgViewer::Viewer viewer(arguments);
// report any errors if they have occurred when parsing the program
arguments.
if (arguments.errors())
{
arguments.writeErrorMessages(std::cout);
return 1;
}
if (arguments.argc()<=1)
{
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
return 1;
}
// set up the camera manipulators.
{
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> 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 thread model handler
viewer.addEventHandler(new osgViewer::ThreadingHandler);
// add the window size toggle handler
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
// add the stats handler
viewer.addEventHandler(new osgViewer::StatsHandler);
// add the help handler
viewer.addEventHandler(new
osgViewer::HelpHandler(arguments.getApplicationUsage()));
// add the record camera path handler
viewer.addEventHandler(new osgViewer::RecordCameraPathHandler);
// load the data
// osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
std::string modelFile("/home/ledocc/Work/VPB/data/lines.shp");
osg::ref_ptr<osg::Group> loadedModel;
while (arguments.read("-shp",modelFile)) {
osg::ref_ptr<osg::Node> shp = osgDB::readNodeFile(modelFile);
if (shp.valid()) {
if (!loadedModel.valid()) {
loadedModel = new osg::Group;
osg::StateSet *sset = loadedModel->getOrCreateStateSet();
sset->setRenderBinDetails(sset->getBinNumber()+1,
sset->getBinName());
sset->setAttributeAndModes(new osg::PolygonOffset(-1.0, -2.0));
}
loadedModel->addChild(shp.get());
}
}
if (!loadedModel->getNumChildren())
{
std::cout << arguments.getApplicationName() <<": No data loaded" <<
std::endl;
return 1;
}
std::string heightFieldFile("/home/ledocc/Work/VPB/data/dtm_200m.tif.gdal");
if (!arguments.read("-hf", heightFieldFile))
arguments.read("--HeightField", heightFieldFile);
osg::ref_ptr<osg::HeightField> hf =
osgDB::readHeightFieldFile(heightFieldFile);
if (!hf.valid()) {
osg::notify(osg::FATAL)<<"Unable to load the height field
<"<<heightFieldFile<<">"<<std::endl
<<"NB: The .gdal pseudo loader might be useful..."<<std::endl;
return -1;
}
// ** map loaded model on HeightField
vpb::HeightFieldMapper hfm(*hf.get());
vpb::HeightFieldMapperVisitor hfmv(hfm);
loadedModel->accept(hfmv);
osg::Material * mat = new osg::Material;
osg::Vec4 red(1.0,0.0,0.0,1.0);
mat->setDiffuse(osg::Material::FRONT, red);
osg::StateSet * ss = loadedModel->getOrCreateStateSet();
ss->setAttributeAndModes(mat, osg::StateAttribute::ON);
// ** make scene graph
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(new osg::ShapeDrawable(hf.get()));
osg::StateSet *sset = geode->getOrCreateStateSet();
sset->setRenderBinDetails(sset->getBinNumber()-1, sset->getBinName());
sset->setAttributeAndModes(new osg::PolygonOffset(1.0, 2.0));
osg::ref_ptr<osg::Group> group(new osg::Group);
group->addChild(loadedModel.get());
group->addChild(geode.get());
// any option left unread are converted into errors to write out later.
arguments.reportRemainingOptionsAsUnrecognized();
// report any errors if they have occurred when parsing the program
arguments.
if (arguments.errors())
{
arguments.writeErrorMessages(std::cout);
return 1;
}
// optimize the scene graph, remove redundant nodes and state etc.
osgUtil::Optimizer optimizer;
optimizer.optimize(group.get());
viewer.setSceneData( group.get() );
// add the state manipulator
viewer.addEventHandler( new
osgGA::StateSetManipulator(loadedModel->getOrCreateStateSet()) );
viewer.realize();
viewer.run();
}
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org