⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwritertgz.cpp

📁 最新osg包
💻 CPP
字号:
#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <stdio.h>#include <string.h>#include <osg/Geode>#include <osg/Group>#include <osg/Notify>#include <osgDB/ReadFile>#include <osgDB/FileUtils>#include <osgDB/FileNameUtils>#include <osgDB/Registry>#if defined(_WIN32) && !defined(__CYGWIN__)#include <direct.h>#else#include <unistd.h>#endifusing namespace osg;class ReaderWriterTGZ : public osgDB::ReaderWriter{    public:        virtual const char* className() const { return "TGZ Database Reader/Writer"; }        ReaderWriterTGZ()        {            supportsExtension("tgz","Tar gzip'd archive format");        }        virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const        {             std::string ext = osgDB::getLowerCaseFileExtension(file);            if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;            osg::notify(osg::NOTICE)<<"file="<<file<<std::endl;            std::string fileName = osgDB::findDataFile( file, options );            osg::notify(osg::NOTICE)<<"fileName="<<fileName<<std::endl;            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;            osg::notify(osg::INFO)<<   "ReaderWriterTGZ::readNode( "<<fileName.c_str()<<" )\n";            char dirname[128];            char command[1024];        #if defined(_WIN32) && !defined(__CYGWIN__)            if ( getenv("TEMP") != NULL ){               strcpy(dirname, getenv("TEMP"));            }else{               //TEMP environment variable not set so pick current directory.               strcpy(dirname, "./");            }            strcat(dirname, ".osgdb_tgz");            mkdir( dirname);            // Using tar.exe from http://www.cygwin.com/            // tar.exe must be in your path.  (PATH environment variable).            sprintf( command,                "tar xfCz \"%s\" \"%s\"",                fileName.c_str(), dirname );        #endif        #if defined(__linux) || defined(__CYGWIN__)            sprintf( dirname, "/tmp/.tgz%06d", getpid());            mkdir( dirname, 0700 );            sprintf( command,                "tar xfCz %s %s",                fileName.c_str(), dirname );        #endif        #ifdef __sgi            sprintf( dirname, "/tmp/.tgz%06d", getpid());            mkdir( dirname, 0700 );            sprintf( command,                "cp %s %s; cd %s;"                "gzcat %s | tar xf -",                fileName.c_str(), dirname, dirname,                fileName.c_str());        #endif             osg::notify(osg::NOTICE)<<"Running command '"<<command<<"'"<<std::endl;            system( command );            osg::Group *grp = new osg::Group;             osg::notify(osg::NOTICE)<<"Done"<<std::endl;             osg::ref_ptr<osgDB::ReaderWriter::Options> local_options = options ? static_cast<osgDB::ReaderWriter::Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new osgDB::ReaderWriter::Options;            local_options->getDatabasePathList().push_front(dirname);            osg::notify(osg::NOTICE)<<"local_options->getDatabasePathList().="<<local_options->getDatabasePathList().front()<<std::endl;            osg::notify(osg::NOTICE)<<"dirname="<<dirname<<std::endl;            // deactivate the automatic generation of images to geode's.            bool prevCreateNodeFromImage = osgDB::Registry::instance()->getCreateNodeFromImage();            osgDB::Registry::instance()->setCreateNodeFromImage(false);            osgDB::DirectoryContents contents = osgDB::getDirectoryContents(dirname);            for(osgDB::DirectoryContents::iterator itr = contents.begin();                itr != contents.end();                ++itr)            {                std::string file_ext = osgDB::getFileExtension(*itr);                if (!acceptsExtension(file_ext) &&                     *itr!=std::string(".") &&                     *itr!=std::string(".."))                {                    osg::Node *node = osgDB::readNodeFile(*itr, local_options.get());                    grp->addChild( node );                }            }            // restorre original state of the automatic generation of images to geode's.            osgDB::Registry::instance()->setCreateNodeFromImage(prevCreateNodeFromImage);        #if defined(_WIN32) && !defined(__CYGWIN__)            sprintf( command, "erase /F /Q /S \"%s\"", dirname );        #else            sprintf( command, "rm -rf %s", dirname );        #endif            osg::notify(osg::NOTICE)<<"Running command '"<<command<<"'"<<std::endl;            system( command );            if( grp->getNumChildren() == 0 )            {                grp->unref();                return ReadResult::FILE_NOT_HANDLED;            }            return grp;        }};// now register with sgRegistry to instantiate the above// reader/writer.REGISTER_OSGPLUGIN(tgz, ReaderWriterTGZ)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -