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

📄 readerwriterzip.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>#endifclass ReaderWriterZIP : public osgDB::ReaderWriter{    public:            ReaderWriterZIP()        {            supportsExtension("zip","Zip archive format");        }                virtual const char* className() const { return "ZIP Database Reader/Writer"; }        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;            std::string fileName = osgDB::findDataFile( file, options );            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;            osg::notify(osg::INFO)<<"ReaderWriterZIP::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_zip");            mkdir(dirname);            // Using unzip.exe from http://www.info-zip.org/pub/infozip/UnZip.html            // unzip.exe must be in your path.  (PATH environment variable).            // OR - WinRAR            // Checking for WinRAR            std::string winrar = std::string( getenv( "ProgramFiles" ) ) + "/WinRAR/winrar.exe";            if ( osgDB::fileExists(winrar) ) {                sprintf( command,                    "%s x -o+ \"%s\" \"%s\"", winrar.c_str(),                    fileName.c_str(), dirname);            } else {                sprintf( command,                    "unzip -o -qq \"%s\" -d \"%s\"",                    fileName.c_str(), dirname);            }            osg::notify(osg::NOTICE)<<"Running command '"<<command<<"'"<<std::endl;            if ( system( command ) ) {                return ReadResult::FILE_NOT_HANDLED;            }        #else            sprintf( dirname, "/tmp/.zip%06d", getpid());            mkdir( dirname, 0700 );            sprintf( command,                "unzip %s -d %s",                fileName.c_str(), dirname);            system( command );        #endif            osg::Group *grp = new osg::Group;             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);            // 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 );                }            }            osgDB::Registry::instance()->setCreateNodeFromImage(prevCreateNodeFromImage);        #if defined(WIN32) && !defined(__CYGWIN__)            // note, is this the right command for windows?            // is there any way of overiding the Y/N option? RO.            sprintf( command, "erase /S /Q \"%s\"", dirname );            system( command );        #else            sprintf( command, "rm -rf %s", dirname );            system( command );        #endif            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(zip, ReaderWriterZIP)

⌨️ 快捷键说明

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