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

📄 readerwriteriv.cpp

📁 最新osg包
💻 CPP
字号:
#include "ReaderWriterIV.h"// OSG headers#include <osg/Notify>#include <osgDB/FileUtils>#include <osgDB/FileNameUtils>// Inventor headers#include <Inventor/SoDB.h>#include <Inventor/SoInteraction.h>#include <Inventor/nodekits/SoNodeKit.h>#include <Inventor/nodes/SoSeparator.h>#include <Inventor/actions/SoWriteAction.h>#include <Inventor/actions/SoCallbackAction.h>#ifdef __COIN__#include <Inventor/VRMLnodes/SoVRMLImageTexture.h>#endif#include "ConvertFromInventor.h"#include "GroupSoLOD.h"#include "ConvertToInventor.h"// Register with Registry to instantiate the inventor reader.REGISTER_OSGPLUGIN(Inventor, ReaderWriterIV)ReaderWriterIV::ReaderWriterIV(){    supportsExtension("iv","Inventor format");    supportsExtension("wrl","VRML world file");}// Read file and convert to OSGosgDB::ReaderWriter::ReadResult ReaderWriterIV::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) << "osgDB::ReaderWriterIV::readNode() Reading file "                            << fileName.data() << std::endl;        // Initialize Inventor    SoDB::init();    SoNodeKit::init();    SoInteraction::init();        // Initial GroupSoLOD node    GroupSoLOD::initClass();#ifdef __COIN__    // Disable delayed loading of VRML textures    SoVRMLImageTexture::setDelayFetchURL(FALSE);#endif    // Open the file    SoInput input;    if (!input.openFile(fileName.data()))    {        osg::notify(osg::WARN) << "osgDB::ReaderWriterIV::readIVFile() "                               << "Cannot open file " << fileName << std::endl;        return ReadResult::ERROR_IN_READING_FILE;    }    // Create the inventor scenegraph from the file    SoSeparator* rootIVNode = SoDB::readAll(&input);    // Close the file    input.closeFile();    if (rootIVNode)    {        rootIVNode->ref();        // Convert the inventor scenegraph to an osg scenegraph and return it        ConvertFromInventor convertIV;        ReadResult result = convertIV.convert(rootIVNode);        rootIVNode->unref();        return result;    }    return ReadResult::FILE_NOT_HANDLED;}osgDB::ReaderWriter::WriteResultReaderWriterIV::writeNode(const osg::Node& node, const std::string& fileName,                          const osgDB::ReaderWriter::Options* options) const{    // accept extension    std::string ext = osgDB::getLowerCaseFileExtension(fileName);    if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED;    bool useVRML1 = !isInventorExtension(osgDB::getFileExtension(fileName));    osg::notify(osg::INFO) << "osgDB::ReaderWriterIV::writeNode() Writing file "                            << fileName.data() << std::endl;        // Initialize Inventor    SoInteraction::init();    // Convert OSG graph to Inventor graph    ConvertToInventor osg2iv;    osg2iv.setVRML1Conversion(useVRML1);    (const_cast<osg::Node*>(&node))->accept(osg2iv);    SoNode *ivRoot = osg2iv.getIvSceneGraph();    if (ivRoot == NULL)        return WriteResult::ERROR_IN_WRITING_FILE;    ivRoot->ref();    // Change prefix according to VRML spec:    // Node names must not begin with a digit, and must not contain spaces or    // control characters, single or double quote characters, backslashes, curly braces,    // the sharp (#) character, the plus (+) character or the period character.    if (useVRML1)      SoBase::setInstancePrefix("_");    // Write Inventor graph to file    SoOutput out;    out.setHeaderString((useVRML1) ? "#VRML V1.0 ascii" : "#Inventor V2.1 ascii");    if (!out.openFile(fileName.c_str()))        return WriteResult::ERROR_IN_WRITING_FILE;    SoWriteAction wa(&out);    wa.apply(ivRoot);    ivRoot->unref();    return WriteResult::FILE_SAVED;}

⌨️ 快捷键说明

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