From a1caa14a611d1fad8ca9709bf207fca1bdd29f69 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 18 Apr 2004 16:15:49 +0000 Subject: [PATCH] Added osgsimplifier example. --- Make/makedirdefs | 1 + examples/osgsimplifier/GNUmakefile | 18 ++++ examples/osgsimplifier/GNUmakefile.inst | 13 +++ examples/osgsimplifier/osgsimplifier.cpp | 118 +++++++++++++++++++++++ include/osgUtil/Simplifier | 3 + src/osgTerrain/DataSet.cpp | 4 +- src/osgUtil/Simplifier.cpp | 6 +- 7 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 examples/osgsimplifier/GNUmakefile create mode 100644 examples/osgsimplifier/GNUmakefile.inst create mode 100644 examples/osgsimplifier/osgsimplifier.cpp diff --git a/Make/makedirdefs b/Make/makedirdefs index 94946a39d..0d8c6a089 100644 --- a/Make/makedirdefs +++ b/Make/makedirdefs @@ -173,6 +173,7 @@ EXAMPLE_DIRS = \ osgshape\ osgsimple\ osgsimplepager\ + osgsimplifier\ osgsimulation\ osgspacewarp\ osgspheresegment\ diff --git a/examples/osgsimplifier/GNUmakefile b/examples/osgsimplifier/GNUmakefile new file mode 100644 index 000000000..c188fa384 --- /dev/null +++ b/examples/osgsimplifier/GNUmakefile @@ -0,0 +1,18 @@ +TOPDIR = ../.. +include $(TOPDIR)/Make/makedefs + +CXXFILES =\ + osgsimplifier.cpp\ + +LIBS += -losgProducer -lProducer -losgText -losgGA -losgDB -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) + +INSTFILES = \ + $(CXXFILES)\ + GNUmakefile.inst=GNUmakefile + +EXEC = osgsimplifier + +INC += $(X_INC) + +include $(TOPDIR)/Make/makerules + diff --git a/examples/osgsimplifier/GNUmakefile.inst b/examples/osgsimplifier/GNUmakefile.inst new file mode 100644 index 000000000..2cf967bf6 --- /dev/null +++ b/examples/osgsimplifier/GNUmakefile.inst @@ -0,0 +1,13 @@ +TOPDIR = ../.. +include $(TOPDIR)/Make/makedefs + +CXXFILES =\ + osgsimplifier.cpp\ + +LIBS += -losgProducer -lProducer -losgDB -losgText -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) + +EXEC = osgsimplifier + +INC += $(X_INC) + +include $(TOPDIR)/Make/makerules diff --git a/examples/osgsimplifier/osgsimplifier.cpp b/examples/osgsimplifier/osgsimplifier.cpp new file mode 100644 index 000000000..d73fbc99f --- /dev/null +++ b/examples/osgsimplifier/osgsimplifier.cpp @@ -0,0 +1,118 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 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 +#include +#include +#include + +int main( int argc, char **argv ) +{ + + // use an ArgumentParser object to manage the program arguments. + osg::ArgumentParser arguments(&argc,argv); + + // set up the usage document, in case we need to print out how to use this program. + 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 this information"); + + + float sampleRatio = 0.5f; + + // construct the viewer. + osgProducer::Viewer viewer(arguments); + + // set up the value with sensible default event handlers. + viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); + + // get details on keyboard and mouse bindings used by the viewer. + viewer.getUsage(*arguments.getApplicationUsage()); + + // read the sample ratio if one is supplied + while (arguments.read("-s",sampleRatio)) {} + + // if user request help write it out to cout. + if (arguments.read("-h") || arguments.read("--help")) + { + arguments.getApplicationUsage()->write(std::cout); + return 1; + } + + // report any errors if they have occured when parsing the program aguments. + 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; + } + + osg::Timer_t start_tick = osg::Timer::instance()->tick(); + + // read the scene from the list of file specified commandline args. + osg::ref_ptr loadedModel = osgDB::readNodeFiles(arguments); + + // if no model has been successfully loaded report failure. + if (!loadedModel) + { + std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl; + return 1; + } + + // any option left unread are converted into errors to write out later. + arguments.reportRemainingOptionsAsUnrecognized(); + + // report any errors if they have occured when parsing the program aguments. + if (arguments.errors()) + { + arguments.writeErrorMessages(std::cout); + } + + osg::Timer_t end_tick = osg::Timer::instance()->tick(); + + std::cout << "Time to load = "<delta_s(start_tick,end_tick)<accept(simplifier); + + // set the scene to render + viewer.setSceneData(loadedModel.get()); + + // create the windows and run the threads. + viewer.realize(); + + while( !viewer.done() ) + { + // wait for all cull and draw threads to complete. + viewer.sync(); + + // update the scene by traversing it with the the update visitor which will + // call all node update callbacks and animations. + viewer.update(); + + // fire off the cull and draw traversals of the scene. + viewer.frame(); + + } + + // wait for all cull and draw threads to complete before exit. + viewer.sync(); + + return 0; +} + diff --git a/include/osgUtil/Simplifier b/include/osgUtil/Simplifier index aa2dee979..096932bb4 100644 --- a/include/osgUtil/Simplifier +++ b/include/osgUtil/Simplifier @@ -29,6 +29,9 @@ class OSGUTIL_EXPORT Simplifier : public osg::NodeVisitor public: Simplifier(float sampleRatio=0.5f); + + void setSampleRatio(float sampleRatio) { _sampleRatio = sampleRatio; } + float getSampleRatio() const { return _sampleRatio; } virtual void apply(osg::Geode& geode) { diff --git a/src/osgTerrain/DataSet.cpp b/src/osgTerrain/DataSet.cpp index 6ed30fedf..ce4f3b578 100644 --- a/src/osgTerrain/DataSet.cpp +++ b/src/osgTerrain/DataSet.cpp @@ -1924,7 +1924,7 @@ osg::Node* DataSet::DestinationTile::createPolygonal() return 0; } - bool createSkirt = true; + bool createSkirt = false; // compute sizes. unsigned int numColumns = grid->getNumColumns(); @@ -2184,7 +2184,7 @@ osg::Node* DataSet::DestinationTile::createPolygonal() geometry->setColorBinding(osg::Geometry::BIND_OVERALL); } -#if 0 +#if 1 osgUtil::Simplifier simplifier; simplifier.simplify(*geometry,0.5f); // this will replace the normal vector with a new one #endif diff --git a/src/osgUtil/Simplifier.cpp b/src/osgUtil/Simplifier.cpp index 5cd30d173..f868edd29 100644 --- a/src/osgUtil/Simplifier.cpp +++ b/src/osgUtil/Simplifier.cpp @@ -52,7 +52,7 @@ public: void setTargetNumOfTriangles(unsigned int num) { _targetNumTriangles = num; } - unsigned int getNumOfTriangles() { return 0; } + unsigned int getNumOfTriangles() { return _triangleSet.size(); } Point* computeInterpolatedPoint(Edge* edge,float r) const { @@ -1217,9 +1217,7 @@ void EdgeCollapse::copyBackToGeometry() std::cout<<"Number of edges= "<<_edgeSet.size()<