/* -*-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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include class GraphicsContext { public: GraphicsContext() { rs = new Producer::RenderSurface; rs->setWindowRectangle(0,0,1,1); rs->useBorder(false); rs->useConfigEventThread(false); rs->realize(); std::cout<<"Realized window"< rs; }; char *SanitizeSRS( const char *pszUserInput ) { OGRSpatialReferenceH hSRS; char *pszResult = NULL; CPLErrorReset(); hSRS = OSRNewSpatialReference( NULL ); if( OSRSetFromUserInput( hSRS, pszUserInput ) == OGRERR_NONE ) OSRExportToWkt( hSRS, &pszResult ); else { CPLError( CE_Failure, CPLE_AppDefined, "Translating source or target SRS failed:\n%s", pszUserInput ); exit( 1 ); } OSRDestroySpatialReference( hSRS ); return pszResult; } osg::Matrixd computeGeoTransForRange(double xMin, double xMax, double yMin, double yMax) { osg::Matrixd matrix; matrix(0,0) = xMax-xMin; matrix(3,0) = xMin; matrix(1,1) = yMax-yMin; matrix(3,1) = yMin; return matrix; } void ellipsodeTransformTest(double latitude, double longitude, double height) { osg::ref_ptr transform = new osg::EllipsoidModel; double X,Y,Z; double newLat, newLong, newHeight; transform->convertLatLongHeightToXYZ(latitude,longitude,height, X,Y,Z); transform->convertXYZToLatLongHeight(X,Y,Z, newLat,newLong,newHeight); std::cout<<"lat = "< dataset) { if(filename.empty()) return; if(osgDB::fileType(filename) == osgDB::REGULAR_FILE) { osgTerrain::DataSet::Source* source = new osgTerrain::DataSet::Source(type, filename); if (source) { if (!currentCS.empty()) { std::cout<<"source->setCoordySystem "<setCoordinateSystemPolicy(osgTerrain::DataSet::Source::PREFER_CONFIG_SETTINGS); source->setCoordinateSystem(currentCS); } if (geoTransformSet) { std::cout<<"source->setGeoTransform "<setGeoTransformPolicy(geoTransformScale ? osgTerrain::DataSet::Source::PREFER_CONFIG_SETTINGS_BUT_SCALE_BY_FILE_RESOLUTION : osgTerrain::DataSet::Source::PREFER_CONFIG_SETTINGS); source->setGeoTransform(geoTransform); } dataset->addSource(source); } } else if (osgDB::fileType(filename) == osgDB::DIRECTORY) { osgDB::DirectoryContents dirContents= osgDB::getDirectoryContents(filename); // loop through directory contents and call processFile std::vector::iterator i; std::string fullfilename; for(i = dirContents.begin(); i != dirContents.end(); ++i) { if((*i != ".") && (*i != "..")) { fullfilename = filename + '/' + *i; processFile(fullfilename, type, currentCS, geoTransform, geoTransformSet, geoTransformScale, dataset); } } } } 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("-d ","Specify the digital elevation map input file to process"); arguments.getApplicationUsage()->addCommandLineOption("-t ","Specify the texture map input file to process"); arguments.getApplicationUsage()->addCommandLineOption("-m ","Specify the 3D database model input file to process"); arguments.getApplicationUsage()->addCommandLineOption("-o ","Specify the output master file to generate"); arguments.getApplicationUsage()->addCommandLineOption("-l ","Specify the number of PagedLOD levels to generate"); arguments.getApplicationUsage()->addCommandLineOption("-e ","Extents of the model to generate"); arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); arguments.getApplicationUsage()->addCommandLineOption("--o_cs ","Set the output coordinates system. The string may be any of the usual GDAL/OGR forms, complete WKT, PROJ.4, EPS"); arguments.getApplicationUsage()->addCommandLineOption("--o_wkt ","Set the coordinates system of source imagery or DEM in WellKownText form."); arguments.getApplicationUsage()->addCommandLineOption("--o_wkt-file ","Set the coordinates system of source imagery or DEM by as file containing WellKownText definition."); arguments.getApplicationUsage()->addCommandLineOption("--cs ","Set the coordinates system of source imagery or DEM. The string may be any of the usual GDAL/OGR forms, complete WKT, PROJ.4, EPS"); arguments.getApplicationUsage()->addCommandLineOption("--wkt ","Set the coordinates system of source imagery or DEM in WellKownText form."); arguments.getApplicationUsage()->addCommandLineOption("--wkt-file ","Set the coordinates system of source imagery or DEM by as file containing WellKownText definition."); arguments.getApplicationUsage()->addCommandLineOption("--skirt-ratio ","Set the ratio of skirt height to tile size."); arguments.getApplicationUsage()->addCommandLineOption("--HEIGHT_FIELD","Create a height field database"); arguments.getApplicationUsage()->addCommandLineOption("--POLYGONAL","Create a height field database"); arguments.getApplicationUsage()->addCommandLineOption("--LOD","Create a LOD'd database"); arguments.getApplicationUsage()->addCommandLineOption("--PagedLOD","Create a PagedLOD'd database"); arguments.getApplicationUsage()->addCommandLineOption("-v","Set the vertical multiplier"); arguments.getApplicationUsage()->addCommandLineOption("--compressed","Use OpenGL compression on destination imagery"); arguments.getApplicationUsage()->addCommandLineOption("--RGB_16","Use 16bit RGB destination imagery"); arguments.getApplicationUsage()->addCommandLineOption("--RGB_24","Use 24bit RGB destination imagery"); arguments.getApplicationUsage()->addCommandLineOption("--max_visible_distance_of_top_level","Set the maximum visiable distance that the top most tile can be viewed at"); arguments.getApplicationUsage()->addCommandLineOption("--radius_to_max_visible_distance_ratio","Set the maximum visiable distance ratio for all tiles apart from the top most tile. The maximum visuble distance is computed from the ratio * tile radius."); arguments.getApplicationUsage()->addCommandLineOption("--no_mip_mapping","Disable mip mapping of textures"); arguments.getApplicationUsage()->addCommandLineOption("--mip_mapping_hardware","Use mip mapped textures, and generate the mipmaps in hardware when available."); arguments.getApplicationUsage()->addCommandLineOption("--mip_mapping_imagery","Use mip mapped textures, and generate the mipmaps in imagery."); arguments.getApplicationUsage()->addCommandLineOption("--max_anisotropy","Max anisotropy level to use when texturing, defaults to 1.0."); // arguments.getApplicationUsage()->addCommandLineOption("",""); // create DataSet. osg::ref_ptr dataset = new osgTerrain::DataSet; float x,y,w,h; while (arguments.read("-e",x,y,w,h)) { dataset->setDestinationExtents(osg::BoundingBox(x,y,0.0f,x+w,y+h,0.0f)); } while (arguments.read("--HEIGHT_FIELD")) { dataset->setGeometryType(osgTerrain::DataSet::HEIGHT_FIELD); } while (arguments.read("--POLYGONAL")) { dataset->setGeometryType(osgTerrain::DataSet::POLYGONAL); } while (arguments.read("--LOD")) { dataset->setDatabaseType(osgTerrain::DataSet::LOD_DATABASE); } while (arguments.read("--PagedLOD")) { dataset->setDatabaseType(osgTerrain::DataSet::PagedLOD_DATABASE); } while (arguments.read("--compressed")) { dataset->setTextureType(osgTerrain::DataSet::COMPRESSED_TEXTURE); } while (arguments.read("--RGB_16")) { dataset->setTextureType(osgTerrain::DataSet::RGB_16_BIT); } while (arguments.read("--RGB_24")) { dataset->setTextureType(osgTerrain::DataSet::RGB_24_BIT); } while (arguments.read("--no_mip_mapping")) { dataset->setMipMappingMode(osgTerrain::DataSet::NO_MIP_MAPPING); } while (arguments.read("--mip_mapping_hardware")) { dataset->setMipMappingMode(osgTerrain::DataSet::MIP_MAPPING_HARDWARE); } while (arguments.read("--mip_mapping_imagery")) { dataset->setMipMappingMode(osgTerrain::DataSet::MIP_MAPPING_IMAGERY); } float maxAnisotropy; while (arguments.read("--max_anisotropy",maxAnisotropy)) { dataset->setMaxAnisotropy(maxAnisotropy); } dataset->setDestinationTileBaseName("output"); dataset->setDestinationTileExtension(".ive"); unsigned int numLevels = 6; while (arguments.read("-l",numLevels)) {} float verticalScale; while (arguments.read("-v",verticalScale)) { dataset->setVerticalScale(verticalScale); } float skirtRatio; while (arguments.read("--skirt-ratio",skirtRatio)) { dataset->setSkirtRatio(skirtRatio); } float maxVisibleDistanceOfTopLevel; while (arguments.read("--max_visible_distance_of_top_level",maxVisibleDistanceOfTopLevel)) { dataset->setMaximumVisibleDistanceOfTopLevel(maxVisibleDistanceOfTopLevel); } float radiusToMaxVisibleDistanceRatio; while (arguments.read("--radius_to_max_visible_distance_ratio",radiusToMaxVisibleDistanceRatio)) { dataset->setRadiusToMaxVisibleDistanceRatio(radiusToMaxVisibleDistanceRatio); } { // handle any specification of output coordinate system. std::string outputCS; std::string def; if (arguments.read("--o_cs",def)) { outputCS = !def.empty() ? SanitizeSRS(def.c_str()) : ""; std::cout<<"--o_cs "<> line; outputCS += line; } std::cout<<"--o_wkt-file "<setDestinationCoordinateSystem(outputCS); } // if user request help write it out to cout. if (arguments.read("-h") || arguments.read("--help")) { arguments.getApplicationUsage()->write(std::cout); return 1; } // read the input data std::string filename; std::string currentCS; osg::Matrixd geoTransform; bool geoTransformSet = false; bool geoTransformScale = false; double xMin, xMax, yMin, yMax; int pos = 1; while(pos> line; currentCS += line; } std::cout<<"--wkt-file "<setConvertFromGeographicToGeocentric(true); std::cout<<"--geocentric "<setConvertFromGeographicToGeocentric(true); std::cout<<"--bluemarble-west"<setConvertFromGeographicToGeocentric(true); std::cout<<"--bluemarble-west "<setConvertFromGeographicToGeocentric(true); std::cout<<"--whole-globe "<setDestinationTileBaseName(base); dataset->setDestinationTileExtension(extension); if (!currentCS.empty()) dataset->setDestinationCoordinateSystem(currentCS); } else { // if no argument read advance to next argument. ++pos; } } // 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); return 1; } // generate the database { GraphicsContext context; dataset->loadSources(); dataset->createDestination((unsigned int)numLevels); dataset->writeDestination(); } return 0; }