#include #include #include #include #include #include #include #include using namespace osg; class ReaderWriter3DC : public osgDB::ReaderWriter { public: virtual const char* className() const { return "3DC point cloud reader"; } virtual bool acceptsExtension(const std::string& extension) const { return osgDB::equalCaseInsensitive(extension,"3dc") || osgDB::equalCaseInsensitive(extension,"asc"); } virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const { std::string ext = osgDB::getLowerCaseFileExtension(file); if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; std::string fileName = osgDB::findDataFile( file, options ); if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; std::cout << "try to read 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) { if (vertices->size()>=targetNumVertices) { // finishing setting up the current geometry and add it to the geode. geometry->setUseDisplayList(true); geometry->setUseVertexBufferObjects(true); geometry->setVertexArray(vertices); geometry->setNormalArray(normals); geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); 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 geometry = new osg::Geometry; vertices = new osg::Vec3Array; normals = new osg::Vec3Array; colours = new osg::Vec4ubArray; vertices->reserve(targetNumVertices); normals->reserve(targetNumVertices); colours->reserve(targetNumVertices); } vertices->push_back(pos); normals->push_back(normal); colours->push_back(osg::Vec4ub(r,g,b,255)); } } } geometry->setUseDisplayList(true); geometry->setUseVertexBufferObjects(true); geometry->setVertexArray(vertices); geometry->setNormalArray(normals); geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); geometry->setColorArray(colours); geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); geometry->addPrimitiveSet(new osg::DrawArrays(GL_POINTS,0,vertices->size())); geode->addDrawable(geometry); return geode; } }; // now register with Registry to instantiate the above // reader/writer. osgDB::RegisterReaderWriterProxy g_readerWriter_3DX_Proxy;