From acac9602270488e47498b37301c468af59b8f9df Mon Sep 17 00:00:00 2001 From: Long Huan <8551701+longhuan2018@users.noreply.github.com> Date: Wed, 17 Jul 2019 14:52:10 +0800 Subject: [PATCH] fix obj-Plugin export texture file Fix obj-plugin to support export texture file --- src/osgPlugins/obj/OBJWriterNodeVisitor.cpp | 11 ++++++----- src/osgPlugins/obj/OBJWriterNodeVisitor.h | 8 +++++--- src/osgPlugins/obj/ReaderWriterOBJ.cpp | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/osgPlugins/obj/OBJWriterNodeVisitor.cpp b/src/osgPlugins/obj/OBJWriterNodeVisitor.cpp index 81ce5fee6..721e3feec 100644 --- a/src/osgPlugins/obj/OBJWriterNodeVisitor.cpp +++ b/src/osgPlugins/obj/OBJWriterNodeVisitor.cpp @@ -18,7 +18,7 @@ #include #include "OBJWriterNodeVisitor.h" - +#include /** writes all values of an array out to a stream, applies a matrix beforehand if necessary */ @@ -421,7 +421,7 @@ void ObjPrimitiveIndexWriter::drawArrays(GLenum mode,GLint first,GLsizei count) } -OBJWriterNodeVisitor::OBJMaterial::OBJMaterial(osg::Material* mat, osg::Texture* tex) : +OBJWriterNodeVisitor::OBJMaterial::OBJMaterial(osg::Material* mat, osg::Texture* tex, const osgDB::Options* options) : diffuse(1,1,1,1), ambient(0.2,0.2,0.2,1), specular(0,0,0,1), @@ -443,9 +443,10 @@ OBJWriterNodeVisitor::OBJMaterial::OBJMaterial(osg::Material* mat, osg::Texture* if (tex) { osg::Image* img = tex->getImage(0); - if ((img) && (!img->getFileName().empty())) - image = img->getFileName(); - + if ((img) && (!img->getFileName().empty())) { + image = img->getFileName(); + osgDB::writeImageFile(*img, image, options); + } } } diff --git a/src/osgPlugins/obj/OBJWriterNodeVisitor.h b/src/osgPlugins/obj/OBJWriterNodeVisitor.h index 8a9cf8f6f..cde950c5a 100644 --- a/src/osgPlugins/obj/OBJWriterNodeVisitor.h +++ b/src/osgPlugins/obj/OBJWriterNodeVisitor.h @@ -50,13 +50,14 @@ class OBJWriterNodeVisitor: public osg::NodeVisitor { public: - OBJWriterNodeVisitor(std::ostream& fout, const std::string materialFileName = "") : + OBJWriterNodeVisitor(std::ostream& fout, const std::string materialFileName = "", const osgDB::Options* options = NULL) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), _fout(fout), _currentStateSet(new osg::StateSet()), _lastVertexIndex(1), _lastNormalIndex(1), - _lastTexIndex(1) + _lastTexIndex(1), + _options(options) { _fout << "# file written by OpenSceneGraph" << std::endl << std::endl; @@ -113,7 +114,7 @@ class OBJWriterNodeVisitor: public osg::NodeVisitor { class OBJMaterial { public: OBJMaterial() {} - OBJMaterial(osg::Material* mat, osg::Texture* tex); + OBJMaterial(osg::Material* mat, osg::Texture* tex, const osgDB::Options* options); osg::Vec4 diffuse, ambient, specular; float shininess; @@ -154,6 +155,7 @@ class OBJWriterNodeVisitor: public osg::NodeVisitor { std::map _nameMap; unsigned int _lastVertexIndex, _lastNormalIndex, _lastTexIndex; MaterialMap _materialMap; + osg::ref_ptr _options; }; diff --git a/src/osgPlugins/obj/ReaderWriterOBJ.cpp b/src/osgPlugins/obj/ReaderWriterOBJ.cpp index fc4cb993c..f0faccb8e 100644 --- a/src/osgPlugins/obj/ReaderWriterOBJ.cpp +++ b/src/osgPlugins/obj/ReaderWriterOBJ.cpp @@ -103,7 +103,7 @@ public: f.precision(localOptions.precision); std::string materialFile = osgDB::getNameLessExtension(fileName) + ".mtl"; - OBJWriterNodeVisitor nv(f, osgDB::getSimpleFileName(materialFile)); + OBJWriterNodeVisitor nv(f, osgDB::getSimpleFileName(materialFile), options); // we must cast away constness (const_cast(&node))->accept(nv); @@ -131,7 +131,7 @@ public: // writing to a stream does not support materials - OBJWriterNodeVisitor nv(fout); + OBJWriterNodeVisitor nv(fout, "", options); // we must cast away constness (const_cast(&node))->accept(nv);