/* -*-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 commercial and non commercial 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 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 an application for collecting a set of separate files into a single archive file that can be later read in OSG applications.."); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); // if user request help write it out to cout. if (arguments.read("-h") || arguments.read("--help")) { arguments.getApplicationUsage()->write(std::cout); return 1; } std::string archiveFilename; while (arguments.read("-a",archiveFilename) || arguments.read("--archive",archiveFilename)) { } bool insert = false; while (arguments.read("-i") || arguments.read("--insert")) { insert = true; } bool extract = false; while (arguments.read("-e") || arguments.read("--extract")) { extract = true; } bool list = false; while (arguments.read("-l") || arguments.read("--list")) { list = true; } typedef std::vector FileNameList; FileNameList files; for(int pos=1;pos archive; if (insert) { archive = osgDB::openArchive(archiveFilename, osgDB::Archive::WRITE); if (archive.valid()) { for (FileNameList::iterator itr=files.begin(); itr!=files.end(); ++itr) { std::cout<<"reading "<<*itr< obj = osgDB::readObjectFile(*itr); if (obj.valid()) { std::cout<<" write to archive "<<*itr<(obj.get()); osg::HeightField* hf = dynamic_cast(obj.get()); osg::Node* node = dynamic_cast(obj.get()); osg::Shader* shader = dynamic_cast(obj.get()); if (image) archive->writeImage(*image, *itr); else if (hf) archive->writeHeightField(*hf, *itr); else if (node) archive->writeNode(*node, *itr); else if (shader) archive->writeShader(*shader, *itr); else archive->writeObject(*obj, *itr); } } } } else { archive = osgDB::openArchive(archiveFilename, osgDB::Archive::READ); if (extract && archive.valid()) { for (FileNameList::iterator itr=files.begin(); itr!=files.end(); ++itr) { osg::Timer_t start = osg::Timer::instance()->tick(); osgDB::ReaderWriter::ReadResult result = archive->readObject(*itr); osg::ref_ptr obj = result.getObject(); std::cout<<"readObejct time = "<delta_m(start,osg::Timer::instance()->tick())<getFileNames(fileNames)) { for(osgDB::Archive::FileNameList::const_iterator itr=fileNames.begin(); itr!=fileNames.end(); ++itr) { std::cout<<" "<<*itr<getMasterFileName()<