From Jan Peciva, Added write support into Inventor plugin.
Note from Robert Osfield. A couple of lines of code in ConvertToInventor.cpp would not compile under g++ 4.1.2, so rather than hold back the dev release till this is resolved I've optional compiled out the problem section. The #define DISABLE_PROBLEM_COMPILE_SECTIONS is used to compile out the problem section, this define is add via the CMakeLists.txt file.
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
#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_BASIC_H
|
||||
#include <Inventor/VRMLnodes/SoVRMLImageTexture.h>
|
||||
@@ -17,6 +19,8 @@
|
||||
|
||||
#include "ConvertFromInventor.h"
|
||||
#include "GroupSoLOD.h"
|
||||
#include "ConvertToInventor.h"
|
||||
|
||||
|
||||
// Register with Registry to instantiate the inventor reader.
|
||||
REGISTER_OSGPLUGIN(Inventor, ReaderWriterIV)
|
||||
@@ -81,3 +85,46 @@ ReaderWriterIV::readNode(const std::string& file,
|
||||
return ReadResult::FILE_NOT_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
osgDB::ReaderWriter::WriteResult
|
||||
ReaderWriterIV::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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user