2.8 branch: This is Ryan Pavlik's introduction of a new output Option (OutputRelativeTextures) for the dot OSG plugin to write texture files into a subfolder.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ void Output::init()
|
||||
_numIndicesPerLine = 10;
|
||||
_pathNameHint = AS_IS;
|
||||
|
||||
_outputRelativeTextures = false;
|
||||
_outputTextureFiles = false;
|
||||
_textureFileNameNumber = 0;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -47,6 +47,10 @@ public:
|
||||
iss >> prec;
|
||||
fout.precision(prec);
|
||||
}
|
||||
if (opt=="OutputRelativeTextures")
|
||||
{
|
||||
fout.setOutputRelativeTextures(true);
|
||||
}
|
||||
if (opt=="OutputTextureFiles")
|
||||
{
|
||||
fout.setOutputTextureFiles(true);
|
||||
|
||||
Reference in New Issue
Block a user