⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwriterobj.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        if (vertices) vertices->reserve(numVertexIndices);    if (normals) normals->reserve(numNormalIndices);    if (texcoords) texcoords->reserve(numTexCoordIndices);        osg::Geometry* geometry = new osg::Geometry;    if (vertices) geometry->setVertexArray(vertices);    if (normals)    {        geometry->setNormalArray(normals);        geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);    }    if (texcoords)    {        geometry->setTexCoordArray(0,texcoords);    }        if (numPointElements>0)    {        unsigned int startPos = vertices->size();        unsigned int numPoints = 0;        for(itr=elementList.begin();            itr!=elementList.end();            ++itr)        {            obj::Element& element = *(*itr);            if (element.dataType==obj::Element::POINTS)            {                for(obj::Element::IndexList::iterator index_itr = element.vertexIndices.begin();                    index_itr != element.vertexIndices.end();                    ++index_itr)                {                    vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));                    ++numPoints;                }                if (numNormalIndices)                {                    for(obj::Element::IndexList::iterator index_itr = element.normalIndices.begin();                        index_itr != element.normalIndices.end();                        ++index_itr)                    {                        normals->push_back(transformNormal(model.normals[*index_itr],rotate));                    }                }                if (numTexCoordIndices)                {                    for(obj::Element::IndexList::iterator index_itr = element.texCoordIndices.begin();                        index_itr != element.texCoordIndices.end();                        ++index_itr)                    {                        texcoords->push_back(model.texcoords[*index_itr]);                    }                }            }        }        osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_POINTS,startPos,numPoints);        geometry->addPrimitiveSet(drawArrays);    }        if (numPolylineElements>0)    {        unsigned int startPos = vertices->size();        osg::DrawArrayLengths* drawArrayLengths = new osg::DrawArrayLengths(GL_LINES,startPos);        for(itr=elementList.begin();            itr!=elementList.end();            ++itr)        {            obj::Element& element = *(*itr);            if (element.dataType==obj::Element::POLYLINE)            {                drawArrayLengths->push_back(element.vertexIndices.size());                for(obj::Element::IndexList::iterator index_itr = element.vertexIndices.begin();                    index_itr != element.vertexIndices.end();                    ++index_itr)                {                    vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));                }                if (numNormalIndices)                {                    for(obj::Element::IndexList::iterator index_itr = element.normalIndices.begin();                        index_itr != element.normalIndices.end();                        ++index_itr)                    {                        normals->push_back(transformNormal(model.normals[*index_itr],rotate));                    }                }                if (numTexCoordIndices)                {                    for(obj::Element::IndexList::iterator index_itr = element.texCoordIndices.begin();                        index_itr != element.texCoordIndices.end();                        ++index_itr)                    {                        texcoords->push_back(model.texcoords[*index_itr]);                    }                }            }        }        geometry->addPrimitiveSet(drawArrayLengths);    }    // #define USE_DRAWARRAYLENGTHS    if (numPolygonElements>0)    {        unsigned int startPos = vertices->size();                #ifdef USE_DRAWARRAYLENGTHS            osg::DrawArrayLengths* drawArrayLengths = new osg::DrawArrayLengths(GL_POLYGON,startPos);            geometry->addPrimitiveSet(drawArrayLengths);        #endif        for(itr=elementList.begin();            itr!=elementList.end();            ++itr)        {            obj::Element& element = *(*itr);            if (element.dataType==obj::Element::POLYGON)            {                #ifdef USE_DRAWARRAYLENGTHS                    drawArrayLengths->push_back(element.vertexIndices.size());                #else                    if (element.vertexIndices.size()>4)                    {                        osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_POLYGON,startPos,element.vertexIndices.size());                        startPos += element.vertexIndices.size();                        geometry->addPrimitiveSet(drawArrays);                    }                    else                    {                        osg::DrawArrays* drawArrays = new osg::DrawArrays(GL_TRIANGLE_FAN,startPos,element.vertexIndices.size());                        startPos += element.vertexIndices.size();                        geometry->addPrimitiveSet(drawArrays);                    }                #endif                            if (model.needReverse(element))                {                    // need to reverse so add to OSG arrays in same order as in OBJ, as OSG assume anticlockwise ordering.                    for(obj::Element::IndexList::reverse_iterator index_itr = element.vertexIndices.rbegin();                        index_itr != element.vertexIndices.rend();                        ++index_itr)                    {                        vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));                    }                    if (numNormalIndices)                    {                        for(obj::Element::IndexList::reverse_iterator index_itr = element.normalIndices.rbegin();                            index_itr != element.normalIndices.rend();                            ++index_itr)                        {                            normals->push_back(transformNormal(model.normals[*index_itr],rotate));                        }                    }                    if (numTexCoordIndices)                    {                        for(obj::Element::IndexList::reverse_iterator index_itr = element.texCoordIndices.rbegin();                            index_itr != element.texCoordIndices.rend();                            ++index_itr)                        {                            texcoords->push_back(model.texcoords[*index_itr]);                        }                    }                }                else                {                    // no need to reverse so add to OSG arrays in same order as in OBJ.                    for(obj::Element::IndexList::iterator index_itr = element.vertexIndices.begin();                        index_itr != element.vertexIndices.end();                        ++index_itr)                    {                        vertices->push_back(transformVertex(model.vertices[*index_itr],rotate));                    }                    if (numNormalIndices)                    {                        for(obj::Element::IndexList::iterator index_itr = element.normalIndices.begin();                            index_itr != element.normalIndices.end();                            ++index_itr)                        {                            normals->push_back(transformNormal(model.normals[*index_itr],rotate));                        }                    }                    if (numTexCoordIndices)                    {                        for(obj::Element::IndexList::iterator index_itr = element.texCoordIndices.begin();                            index_itr != element.texCoordIndices.end();                            ++index_itr)                        {                            texcoords->push_back(model.texcoords[*index_itr]);                        }                    }                }            }        }    }        return geometry;}osg::Node* ReaderWriterOBJ::convertModelToSceneGraph(obj::Model& model,    bool& rotate, bool& noTesselateLargePolygons, bool& noTriStripPolygons) const{    if (model.elementStateMap.empty()) return 0;    osg::Group* group = new osg::Group;    // set up the materials    MaterialToStateSetMap materialToSetSetMap;    buildMaterialToStateSetMap(model, materialToSetSetMap);    // go through the groups of related elements and build geometry from them.    for(obj::Model::ElementStateMap::iterator itr=model.elementStateMap.begin();        itr!=model.elementStateMap.end();        ++itr)    {            const obj::ElementState& es = itr->first;        obj::Model::ElementList& el = itr->second;        osg::Geometry* geometry = convertElementListToGeometry(model,el,rotate);        if (geometry)        {            osg::StateSet* stateset = materialToSetSetMap[es.materialName].get();            geometry->setStateSet(stateset);                    // tesseleate any large polygons            if (!noTesselateLargePolygons)            {                osgUtil::Tessellator tessellator;                tessellator.retessellatePolygons(*geometry);            }                        // tri strip polygons to improve graphics peformance            if (!noTriStripPolygons)            {                osgUtil::TriStripVisitor tsv;                tsv.stripify(*geometry);            }                        // if no normals present add them.            if (!geometry->getNormalArray() || geometry->getNormalArray()->getNumElements()==0)            {                osgUtil::SmoothingVisitor sv;                sv.smooth(*geometry);            }            osg::Geode* geode = new osg::Geode;            geode->addDrawable(geometry);                        if (es.objectName.empty())            {                geode->setName(es.groupName);            }            else if (es.groupName.empty())            {                geode->setName(es.objectName);            }            else            {                geode->setName(es.groupName + std::string(":") + es.objectName);            }            group->addChild(geode);        }    }    return group;}// read file and convert to OSG.osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::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;            osgDB::ifstream fin(fileName.c_str());    if (fin)    {            // code for setting up the database path so that internally referenced file are searched for on relative paths.         osg::ref_ptr<Options> local_opt = options ? static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;        local_opt->setDatabasePath(osgDB::getFilePath(fileName));        obj::Model model;        model.setDatabasePath(osgDB::getFilePath(fileName.c_str()));        model.readOBJ(fin, local_opt.get());                // code for checking the nonRotation, noTesselateLargePolygons,        // and noTriStripPolygons        bool rotate = true;        bool noTesselateLargePolygons = false;        bool noTriStripPolygons = false;                if (options!=NULL)        {            if (options->getOptionString() == "noRotation")            {                rotate = false;            }                        if (options->getOptionString() == "noTesselateLargePolygons")            {                noTesselateLargePolygons = true;            }                        if (options->getOptionString() == "noTriStripPolygons")            {                noTriStripPolygons = true;            }        }                osg::Node* node = convertModelToSceneGraph(model,rotate,            noTesselateLargePolygons,noTriStripPolygons);        return node;    }        return ReadResult::FILE_NOT_HANDLED;}osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::readNode(std::istream& fin, const Options* options) const{    if (fin)    {        obj::Model model;        model.readOBJ(fin, options);                // code for checking the nonRotation, noTesselateLargePolygons,        // and noTriStripPolygons        bool rotate = true;        bool noTesselateLargePolygons = false;        bool noTriStripPolygons = false;                if (options!=NULL)        {            if (options->getOptionString() == "noRotation")            {                rotate = false;            }                        if (options->getOptionString() == "noTesselateLargePolygons")            {                noTesselateLargePolygons = true;            }                        if (options->getOptionString() == "noTriStripPolygons")            {                noTriStripPolygons = true;            }        }                osg::Node* node = convertModelToSceneGraph(model,rotate,            noTesselateLargePolygons,noTriStripPolygons);        return node;    }        return ReadResult::FILE_NOT_HANDLED;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -