#include #include #include #include #include #include #include using namespace osg; class ReaderWriter3DC : public osgDB::ReaderWriter { public: virtual const char* className() { return "3DC point cloud reader"; } virtual bool acceptsExtension(const std::string& extension) { return osgDB::equalCaseInsensitive(extension,"3dc") || osgDB::equalCaseInsensitive(extension,"asc"); } virtual ReadResult readNode(const std::string& fileName, const osgDB::ReaderWriter::Options*) { std::string ext = osgDB::getFileExtension(fileName); if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; 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) { vertices->push_back(pos); normals->push_back(normal); colours->push_back(osg::UByte4(r,g,b,255)); //colours->push_back(osg::Vec4((float)r/255.0f,(float)g/255.0f,(float)b/255.0f,1.0f)); } } //std::cout << "["<setUseDisplayList(false); 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())); osg::Geode* geode = new osg::Geode; geode->addDrawable(geometry); return geode; } }; // now register with Registry to instantiate the above // reader/writer. osgDB::RegisterReaderWriterProxy g_readerWriter_3DX_Proxy;