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

Reply via email to