From f16853c7bb848e672aee7501ffaf896224ad1f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milien=20Tlapale?= Date: Tue, 13 Dec 2016 10:57:42 +0100 Subject: [PATCH 1/3] Support for stateset in groups for OBJ. --- src/osgPlugins/obj/OBJWriterNodeVisitor.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/osgPlugins/obj/OBJWriterNodeVisitor.h b/src/osgPlugins/obj/OBJWriterNodeVisitor.h index 9cf246596..be4c8cabd 100644 --- a/src/osgPlugins/obj/OBJWriterNodeVisitor.h +++ b/src/osgPlugins/obj/OBJWriterNodeVisitor.h @@ -69,6 +69,7 @@ class OBJWriterNodeVisitor: public osg::NodeVisitor { virtual void apply(osg::Group &node) { + pushStateSet(node.getStateSet()); _nameStack.push_back( node.getName().empty() ? node.className() : node.getName() ); _fout << std::endl; @@ -77,6 +78,7 @@ class OBJWriterNodeVisitor: public osg::NodeVisitor { traverse( node ); _nameStack.pop_back(); + popStateSet(node.getStateSet()); } void traverse (osg::Node &node) From d0fb365e25143e0dabe9259c62340e89b52c26d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milien=20Tlapale?= Date: Tue, 13 Dec 2016 10:58:46 +0100 Subject: [PATCH 2/3] Adding configurable precision for OBJ output. --- src/osgPlugins/obj/ReaderWriterOBJ.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/osgPlugins/obj/ReaderWriterOBJ.cpp b/src/osgPlugins/obj/ReaderWriterOBJ.cpp index 2b6727e30..a4dcc3898 100644 --- a/src/osgPlugins/obj/ReaderWriterOBJ.cpp +++ b/src/osgPlugins/obj/ReaderWriterOBJ.cpp @@ -21,6 +21,7 @@ #endif #include +#include #include #include @@ -72,6 +73,7 @@ public: supportsOption("DISPLACEMENT=", "Set texture unit for displacement texture"); supportsOption("REFLECTION=", "Set texture unit for reflection texture"); + supportsOption("precision=","Set the floating point precision when writing out files"); } virtual const char* className() const { return "Wavefront OBJ Reader"; } @@ -94,7 +96,11 @@ public: if (!acceptsExtension(osgDB::getFileExtension(fileName))) return WriteResult(WriteResult::FILE_NOT_HANDLED); + ObjOptionsStruct localOptions = parseOptions(options); + osgDB::ofstream f(fileName.c_str()); + f.precision(localOptions.precision); + std::string materialFile = osgDB::getNameLessExtension(fileName) + ".mtl"; OBJWriterNodeVisitor nv(f, osgDB::getSimpleFileName(materialFile)); @@ -117,8 +123,11 @@ public: return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeNode(const osg::Node& node,std::ostream& fout,const Options* =NULL) const + virtual WriteResult writeNode(const osg::Node& node,std::ostream& fout,const Options* options=NULL) const { + ObjOptionsStruct localOptions = parseOptions(options); + fout.precision(localOptions.precision); + // writing to a stream does not support materials OBJWriterNodeVisitor nv(fout); @@ -144,6 +153,8 @@ protected: // otherwise overriden typedef std::vector< std::pair > TextureAllocationMap; TextureAllocationMap textureUnitAllocation; + /// Coordinates precision. + int precision; }; typedef std::map< std::string, osg::ref_ptr > MaterialToStateSetMap; @@ -826,6 +837,7 @@ ReaderWriterOBJ::ObjOptionsStruct ReaderWriterOBJ::parseOptions(const osgDB::Rea localOptions.generateFacetNormals = false; localOptions.fixBlackMaterials = true; localOptions.noReverseFaces = false; + localOptions.precision = std::numeric_limits::digits10 + 2; if (options!=NULL) { @@ -868,6 +880,16 @@ ReaderWriterOBJ::ObjOptionsStruct ReaderWriterOBJ::parseOptions(const osgDB::Rea { localOptions.noReverseFaces = true; } + else if (pre_equals == "precision") + { + int val = std::atoi(post_equals.c_str()); + if (val <= 0) { + OSG_NOTICE << "Warning: invalid precision value: " << post_equals << std::endl; + } + else { + localOptions.precision = val; + } + } else if (post_equals.length()>0) { obj::Material::Map::TextureMapType type = obj::Material::Map::UNKNOWN; From 34fb58207451769d02c0aa9ed8b629706f1c7aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milien=20Tlapale?= Date: Tue, 13 Dec 2016 11:56:06 +0100 Subject: [PATCH 3/3] Uncommenting missing argument. --- src/osgPlugins/obj/ReaderWriterOBJ.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osgPlugins/obj/ReaderWriterOBJ.cpp b/src/osgPlugins/obj/ReaderWriterOBJ.cpp index a4dcc3898..78d0c81ff 100644 --- a/src/osgPlugins/obj/ReaderWriterOBJ.cpp +++ b/src/osgPlugins/obj/ReaderWriterOBJ.cpp @@ -91,7 +91,7 @@ public: return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeNode(const osg::Node& node,const std::string& fileName,const Options* /*options*/ =NULL) const + virtual WriteResult writeNode(const osg::Node& node,const std::string& fileName,const Options* options=NULL) const { if (!acceptsExtension(osgDB::getFileExtension(fileName))) return WriteResult(WriteResult::FILE_NOT_HANDLED);