diff --git a/include/osgDB/Output b/include/osgDB/Output index 9acc24637..8fb8a9a4d 100644 --- a/include/osgDB/Output +++ b/include/osgDB/Output @@ -91,6 +91,9 @@ class OSGDB_EXPORT Output : public osgDB::ofstream virtual std::string getFileNameForOutput(const std::string& filename) const; const std::string& getFileName() const { return _filename; } + void setOutputRelativeTextures(bool flag) { _outputRelativeTextures = flag; } + bool getOutputRelativeTextures() const { return _outputRelativeTextures; } + void setOutputTextureFiles(bool flag) { _outputTextureFiles = flag; } bool getOutputTextureFiles() const { return _outputTextureFiles; } @@ -120,6 +123,7 @@ class OSGDB_EXPORT Output : public osgDB::ofstream PathNameHint _pathNameHint; + bool _outputRelativeTextures; bool _outputTextureFiles; unsigned int _textureFileNameNumber; diff --git a/src/osgDB/Output.cpp b/src/osgDB/Output.cpp index 334c669c3..e8c953442 100644 --- a/src/osgDB/Output.cpp +++ b/src/osgDB/Output.cpp @@ -48,6 +48,7 @@ void Output::init() _numIndicesPerLine = 10; _pathNameHint = AS_IS; + _outputRelativeTextures = false; _outputTextureFiles = false; _textureFileNameNumber = 0; diff --git a/src/osgPlugins/osg/ReaderWriterOSG.cpp b/src/osgPlugins/osg/ReaderWriterOSG.cpp index a1e24f7d4..11df7b96f 100644 --- a/src/osgPlugins/osg/ReaderWriterOSG.cpp +++ b/src/osgPlugins/osg/ReaderWriterOSG.cpp @@ -110,6 +110,7 @@ class OSGReaderWriter : public ReaderWriter supportsExtension("osgs","Psuedo OpenSceneGraph file loaded, with file encoded in filename string"); supportsOption("precision","Set the floating point precision when writing out files"); supportsOption("OutputTextureFiles","Write out the texture images to file"); + supportsOption("OutputRelativeTextures","Write texture images to a subfolder and reference them with relative file names"); } virtual const char* className() const { return "OSG Reader/Writer"; } @@ -260,6 +261,10 @@ class OSGReaderWriter : public ReaderWriter iss >> prec; fout.precision(prec); } + if (opt=="OutputRelativeTextures") + { + fout.setOutputRelativeTextures(true); + } if (opt=="OutputTextureFiles") { fout.setOutputTextureFiles(true); @@ -277,6 +282,7 @@ class OSGReaderWriter : public ReaderWriter std::string ext = osgDB::getLowerCaseFileExtension(fileName); if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED; + Output fout(fileName.c_str()); if (fout) { @@ -296,6 +302,7 @@ class OSGReaderWriter : public ReaderWriter virtual WriteResult writeObject(const Object& obj,std::ostream& fout, const osgDB::ReaderWriter::Options* options) const { + if (fout) { Output foutput; @@ -361,6 +368,7 @@ class OSGReaderWriter : public ReaderWriter }; + // now register with Registry to instantiate the above // reader/writer. REGISTER_OSGPLUGIN(osg, OSGReaderWriter) diff --git a/src/osgPlugins/osg/Texture2D.cpp b/src/osgPlugins/osg/Texture2D.cpp index 9e4a92138..7a9d3ed4d 100644 --- a/src/osgPlugins/osg/Texture2D.cpp +++ b/src/osgPlugins/osg/Texture2D.cpp @@ -5,6 +5,8 @@ #include "osgDB/Input" #include "osgDB/Output" #include "osgDB/WriteFile" +#include "osgDB/FileNameUtils" +#include "osgDB/FileUtils" using namespace osg; using namespace osgDB; @@ -87,7 +89,18 @@ bool Texture2D_writeLocalData(const Object& obj, Output& fw) else { std::string fileName = texture.getImage()->getFileName(); - if (fw.getOutputTextureFiles()) + if (fw.getOutputRelativeTextures()) + { + std::string generatedFileName = osgDB::getSimpleFileName(osgDB::getNameLessExtension(fw.getTextureFileNameForOutput())); + std::string textureDir = osgDB::getNameLessExtension(fw.getFileName()) + "_textures"; + std::string relativeDir = osgDB::getSimpleFileName(textureDir); + std::string texFnWithOriginalFormat = generatedFileName + osgDB::getFileExtensionIncludingDot(fileName); + std::string fullFileName = osgDB::concatPaths(textureDir, texFnWithOriginalFormat); + fileName = relativeDir + "/" + texFnWithOriginalFormat; + osgDB::makeDirectory(textureDir); + osgDB::writeImageFile(*texture.getImage(), fullFileName); + } + else if (fw.getOutputTextureFiles()) { if (fileName.empty()) { diff --git a/src/osgPlugins/osgViewer/ReaderWriterOsgViewer.cpp b/src/osgPlugins/osgViewer/ReaderWriterOsgViewer.cpp index 1934ff2b6..5628e0621 100644 --- a/src/osgPlugins/osgViewer/ReaderWriterOsgViewer.cpp +++ b/src/osgPlugins/osgViewer/ReaderWriterOsgViewer.cpp @@ -47,6 +47,10 @@ public: iss >> prec; fout.precision(prec); } + if (opt=="OutputRelativeTextures") + { + fout.setOutputRelativeTextures(true); + } if (opt=="OutputTextureFiles") { fout.setOutputTextureFiles(true);