From ec0faff644291006fe52121d52c85dc7259edcaa Mon Sep 17 00:00:00 2001 From: Paul MARTZ Date: Wed, 17 Mar 2010 14:33:47 +0000 Subject: [PATCH] 2.8 branch: Minor bug fixes for ac and 3dc plugins. Merges these revisions from trunk: 10010, 10758, and 11175. --- src/osgPlugins/3dc/ReaderWriter3DC.cpp | 182 ++++++++++++++++--------- src/osgPlugins/ac/ac3d.cpp | 66 +++++---- 2 files changed, 147 insertions(+), 101 deletions(-) diff --git a/src/osgPlugins/3dc/ReaderWriter3DC.cpp b/src/osgPlugins/3dc/ReaderWriter3DC.cpp index 8ddcbe0b3..c84ae85a9 100644 --- a/src/osgPlugins/3dc/ReaderWriter3DC.cpp +++ b/src/osgPlugins/3dc/ReaderWriter3DC.cpp @@ -11,21 +11,87 @@ #include #include +class Writer3DCNodeVisitor: public osg::NodeVisitor { -using namespace osg; + public: + Writer3DCNodeVisitor(std::ostream& fout) : + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), + _fout(fout) + { + // _fout << "# file written by OpenSceneGraph" << std::endl << std::endl; + } + + virtual void apply(osg::Geode &node); + + protected: + + Writer3DCNodeVisitor& operator = (const Writer3DCNodeVisitor&) { return *this; } + std::ostream& _fout; + +}; + +void Writer3DCNodeVisitor::apply( osg::Geode &node ) +{ + osg::Matrix matrix = osg::computeLocalToWorld(getNodePath()); + + unsigned int count = node.getNumDrawables(); + for ( unsigned int i = 0; i < count; i++ ) + { + osg::Geometry *geometry = node.getDrawable( i )->asGeometry(); + if ( geometry ) + { + osg::Vec3Array* vertices = dynamic_cast(geometry->getVertexArray()); + osg::Vec3Array* normals = dynamic_cast(geometry->getNormalArray()); + osg::Vec3Array* colours = dynamic_cast(geometry->getColorArray()); + + if ( vertices ) { + for (unsigned int ii=0;iisize();ii++) { + + // update nodes with world coords + osg::Vec3d v = vertices->at(ii) * matrix; + _fout << v[0] << ' ' << v[1] << ' ' << v[2]; + + if ( colours ) + { + v=colours->at(ii); + _fout << ' ' << (int)v[0]*255.0 << ' ' << (int)v[1]*255.0 << ' ' << (int)v[2]*255.0; + } + else + { + _fout << " 255 255 255"; + } + + if ( normals ) + { + v = normals->at(ii); + _fout << ' ' << v[0] << ' ' << v[1] << ' ' << v[2]; + } + else + { + _fout << " 0.0 0.0 1.0"; + } + + + _fout << std::endl; + } + } + + } + } +} class ReaderWriter3DC : public osgDB::ReaderWriter { public: - + ReaderWriter3DC() { supportsExtension("3dc","3DC point cloud format"); supportsExtension("asc","3DC point cloud format"); } - + virtual const char* className() const { return "3DC point cloud reader"; } - + virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const { std::string ext = osgDB::getLowerCaseFileExtension(file); @@ -33,15 +99,28 @@ class ReaderWriter3DC : public osgDB::ReaderWriter std::string fileName = osgDB::findDataFile( file, options ); if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; - + osg::notify(osg::INFO) << "Reading file "<0) { - ++num; - - osg::Vec3 pos,normal; - int r,g,b; - - int a = sscanf(line,"%f %f %f %d %d %d %f %f %f", - &pos.x(),&pos.y(),&pos.z(), - &r,&g,&b, - &normal.x(),&normal.y(),&normal.z()); - - - if (a) + int matched = sscanf(line,"%f%c%f%c%f%c%d%c%d%c%d%c%f%c%f%c%f", + &pos.x(),&sep,&pos.y(),&sep,&pos.z(),&sep, + &r,&sep,&g,&sep,&b,&sep, + &normal.x(),&sep,&normal.y(),&sep,&normal.z()); + + if (matched) { - + if (vertices->size()>=targetNumVertices) { // finishing setting up the current geometry and add it to the geode. @@ -112,10 +150,10 @@ class ReaderWriter3DC : public osgDB::ReaderWriter geometry->setColorArray(colours); geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); geometry->addPrimitiveSet(new osg::DrawArrays(GL_POINTS,0,vertices->size())); - + geode->addDrawable(geometry); - // allocate a new geometry + // allocate a new geometry geometry = new osg::Geometry; vertices = new osg::Vec3Array; @@ -127,14 +165,12 @@ class ReaderWriter3DC : public osgDB::ReaderWriter colours->reserve(targetNumVertices); } - + vertices->push_back(pos); normals->push_back(normal); - colours->push_back(osg::Vec4ub(r,g,b,255)); - + colours->push_back(osg::Vec4ub(r,g,b,a)); } } - } @@ -148,11 +184,25 @@ class ReaderWriter3DC : public osgDB::ReaderWriter geometry->addPrimitiveSet(new osg::DrawArrays(GL_POINTS,0,vertices->size())); geode->addDrawable(geometry); - + return geode; - + + } + + 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); + + osgDB::ofstream f(fileName.c_str()); + + Writer3DCNodeVisitor nv(f); + + // we must cast away constness + (const_cast(&node))->accept(nv); + + return WriteResult(WriteResult::FILE_SAVED); } - }; // now register with Registry to instantiate the above diff --git a/src/osgPlugins/ac/ac3d.cpp b/src/osgPlugins/ac/ac3d.cpp index c15be683f..b0e911b46 100644 --- a/src/osgPlugins/ac/ac3d.cpp +++ b/src/osgPlugins/ac/ac3d.cpp @@ -165,27 +165,21 @@ class ReaderWriterAC : public osgDB::ReaderWriter virtual WriteResult writeNode(const osg::Node& node,std::ostream& fout, const Options* opts) const { - try + // write ac file. + if(dynamic_cast(&node)) { - // write ac file. - if(dynamic_cast(&node)) { - const osg::Group *gp=dynamic_cast(&node); - const unsigned int nch=gp->getNumChildren(); - for (unsigned int i=0; igetChild(i)), fout, opts); - } + const osg::Group *gp=dynamic_cast(&node); + const unsigned int nch=gp->getNumChildren(); + for (unsigned int i=0; igetChild(i)), fout, opts); } - else - osg::notify(osg::WARN)<<"File must start with a geode "<second; + // Try to load that texture. + TextureData textureData; + textureData.setTexture(texName, mOptions.get(), mModulateTexEnv.get()); + if (textureData.valid()) { + mTextureStates[texName] = textureData; + return textureData; + } + // still no joy?, try with the stripped filename if this is different + // Try the pure file name if it is different + std::string simpleTexName = osgDB::getSimpleFileName(texName); + if (simpleTexName != texName) + return toTextureData(simpleTexName); + + // Nothing that worked, return invalid data + return TextureData(); } osg::Light* getNextLight() @@ -1166,20 +1175,7 @@ readObject(std::istream& stream, FileData& fileData, const osg::Matrix& parentTr } else if (token == "texture") { // read the texture name - std::string texname = readString(stream); - - // strip absolute paths - if (texname[0] == '/' || - (isalpha(texname[0]) && texname[1] == ':')) { - std::string::size_type p = texname.rfind('\\'); - if (p != std::string::npos) - texname = texname.substr(p+1, std::string::npos); - p = texname.rfind('/'); - if (p != std::string::npos) - texname = texname.substr(p+1, std::string::npos); - } - - textureData = fileData.toTextureData(texname); + textureData = fileData.toTextureData(readString(stream)); } else if (token == "texrep") { stream >> textureRepeat[0] >> textureRepeat[1];