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:
Paul MARTZ
2011-05-12 00:52:58 +00:00
parent baa210b4a9
commit 7ab3207732
5 changed files with 31 additions and 1 deletions

View File

@@ -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;

View File

@@ -48,6 +48,7 @@ void Output::init()
_numIndicesPerLine = 10;
_pathNameHint = AS_IS;
_outputRelativeTextures = false;
_outputTextureFiles = false;
_textureFileNameNumber = 0;

View File

@@ -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)

View File

@@ -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())
{

View File

@@ -47,6 +47,10 @@ public:
iss >> prec;
fout.precision(prec);
}
if (opt=="OutputRelativeTextures")
{
fout.setOutputRelativeTextures(true);
}
if (opt=="OutputTextureFiles")
{
fout.setOutputTextureFiles(true);