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

📄 readerwritergeo.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                                }                            }                            int nv=getprim((*itr), *gi);                            {                                const vertexInfo *vinf=gi->getVinf();                                if (vinf->getNorms() && vinf->getNorms()->size()>0) {                                    gi->getGeom()->setNormalArray(vinf->getNorms());                                    gi->getGeom()->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);                                } else {                                    gi->getGeom()->setNormalBinding(osg::Geometry::BIND_OFF);                                }                            }                            if (hasColorAction(bhv)) addPolyActions(bhv, *gi, nv);                                                        if (dstyle==GEO_POLY_DSTYLE_SOLID_BOTH_SIDES || dstyle == GEO_POLY_DSTYLE_SOLID) {                                osg::DrawArrays *drw=new osg::DrawArrays(osg::PrimitiveSet::POLYGON,gi->getStart(nv),nv);                                                                gi->getGeom()->addPrimitiveSet(drw);                            }                            if (dstyle == GEO_POLY_DSTYLE_OPEN_WIRE) {                                osg::DrawArrays *drw=new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP,gi->getStart(nv),nv);                                gi->getGeom()->addPrimitiveSet(drw);                            }                            if (dstyle == GEO_POLY_DSTYLE_CLOSED_WIRE) {                                osg::DrawArrays *drw=new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,gi->getStart(nv),nv);                                gi->getGeom()->addPrimitiveSet(drw);                            }                            if (dstyle==GEO_POLY_DSTYLE_POINTS) {                                osg::DrawArrays *drw=new osg::DrawArrays(osg::PrimitiveSet::POINTS,gi->getStart(nv),nv);                                gi->getGeom()->addPrimitiveSet(drw);                            }                        }                    }                }                {                    int igeom=0;                    for (std::vector<geoInfo>::iterator itr=ia.begin();                    itr!=ia.end();                    ++itr) {                        if ((*itr).getTexture() >=0) {                            osg::Vec2Array *txa=ia[igeom].getVinf()->getTexCoords();                            if (txa->size() > 0 ) {                                ((*itr).getGeom())->setTexCoordArray(0, txa);                            }                        }                        igeom++;                    }                }            }            return gr.size();        }        void makeTexts(georecord grec, Group *nug)        {    // makeTexts adds a set of text+transform Geometrys attached to current parent (Group nug)            const std::vector<georecord *> gr=grec.getchildren();            std::vector<osg::Geometry *> geom;            if (gr.size()>0) {                std::vector<int> ia; // list of texture indices found in this geode; sort into new                 for (std::vector<georecord *>::const_iterator itr=gr.begin();                itr!=gr.end();                ++itr) {                    if ((*itr)->getType()==DB_DSK_TEXT) {                        osg::MatrixTransform *text=makeText((*itr));                        if (text) nug->addChild(text);                    }                }                // osg::notify(osg::WARN) << vinf;            }            return;        }        Group *makeTextGeode(const georecord *gr)        { // in geo text is defined with a matrix included in the geo.geode (gr is this geo.geode)            // - we need to create this tree to render text            return NULL; // temporary disable april 2003            Group *nug=new Group;            const geoField *gfd=gr->getField(GEO_DB_RENDERGROUP_MAT);            // may be used in future const unsigned int imat=gfd ? gfd->getInt():0;            gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                nug->setName(gfd->getChar());            }            makeTexts((*gr),nug);            if (nug->getNumChildren() <=0) {                nug=NULL;            }            return nug;        }        Group *makeLightPointGeodes(const georecord *gr) {            const geoField *gfd=gr->getField(GEO_DB_RENDERGROUP_MAT);            Group *nug=new Group;            gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                char *name = gfd->getChar();                nug->setName(name);            }            makeLightPointGeometry(gr,nug);            if (nug->getNumChildren() <=0) {                nug=NULL;            }            return nug;        }        Group *makeAnimatedGeodes(const georecord *gr)        { // create a group full of animated geodes.  Used for any animations applied to facets!            // movement actions require a transform node to be inserted, and this cannot be             // derived from Geode.  So create a group, add matrix transform(s) for each animated polygon            const geoField *gfd=gr->getField(GEO_DB_RENDERGROUP_MAT);            const int imat=gfd ? gfd->getInt():0;       //     gfd=gr->getField(GEO_DB_RENDERGROUP_IS_BILLBOARD);         //   bool isbillb = gfd ? gfd->getBool() : false;            Group *nug=new Group;       /*     if (isbillb) {                Billboard *bilb= new Billboard ;                bilb->setAxis(Vec3(0,0,1));                bilb->setNormal(Vec3(0,-1,0));                nug=bilb;            } else {                nug=new Geode;            } */            gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                char *name = gfd->getChar();                nug->setName(name);            }            int nans=makeAnimatedGeometry((*gr),imat,nug);            if (nans <=0) {                nug=NULL;            }            return nug;        }        Geode *makeGeode(const georecord &gr)        {            const geoField *gfd=gr.getField(GEO_DB_RENDERGROUP_MAT);            const unsigned int imat=gfd ? gfd->getInt():0;            gfd=gr.getField(GEO_DB_RENDERGROUP_BILLBOARD);            bool isbillb = gfd ? gfd->getBool() : false;            osg::Geode *nug;            if (isbillb) {                Billboard *bilb= new Billboard ;                bilb->setAxis(Vec3(0,0,1));                bilb->setNormal(Vec3(0,-1,0));                nug=bilb;            } else {                nug=new Geode;            }            int nchild=makeGeometry(gr,imat,nug);            if (nchild>0) { // complete the geode                gfd=gr.getField(GEO_DB_NODE_NAME);                if (gfd) {                    nug->setName(gfd->getChar());                }                return nug;            } else {                return NULL;            }        }        osg::Group *makePage(const georecord *gr)        {            osg::Group *gp=new Group;            const geoField *gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                gp->setName(gfd->getChar());            }            return gp;        }        osg::Group *setmatrix(const georecord *gr) { // find one of the types of matrix supported            const geoField *gfd=gr->getField(GEO_DB_GRP_MATRIX_TRANSFORM);            if (!gfd) gfd=gr->getField(GEO_DB_GRP_TRANSLATE_TRANSFORM);            if (!gfd) gfd=gr->getField(GEO_DB_GRP_ROTATE_TRANSFORM);            if (!gfd) gfd=gr->getField(GEO_DB_GRP_SCALE_TRANSFORM);            if (gfd) {                MatrixTransform *tr=new MatrixTransform;                osg::Matrix mx;                float * m44=gfd->getMat44Arr();                mx.set(m44); // hope uses same convention as OSG else will need to use set(m44[0],m44[1]...)                tr->setMatrix(mx);                return tr;            } else {                return NULL;            }        }        osg::Group *makeGroup(const georecord *gr) { // group or Static transform            osg::Group *gp=setmatrix(gr);            if (!gp) {                gp=new osg::Group;            }            const geoField *gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                gp->setName(gfd->getChar());            }            return gp;        }        osg::Group *makeSwitch(const georecord *gr)        {            osg::Switch *sw=new Switch;            const geoField *gfd=gr->getField(GEO_DB_SWITCH_CURRENT_MASK);            sw->setAllChildrenOff();            if (gfd) {                int imask;                                imask=gfd->getInt();                                // set the bits in the osg::Switch.                int selector_mask = 0x1;                for(int pos=0;pos<32;++pos)                {                    sw->setValue(pos,((imask&selector_mask)!=0));                     selector_mask <<= 1;                }                osg::notify(osg::WARN) << gr << " imask " << imask << std::endl;            } else {                sw->setSingleChildOn(0);                osg::notify(osg::WARN) << gr << " Switch has No mask- only 1 child " << std::endl;            }            gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                sw->setName(gfd->getChar());            }            return sw;        }                osg::Sequence *makeSequence(const georecord *gr)        {            Sequence *sq=new Sequence;            const geoField *gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                sq->setName(gfd->getChar());            }            return sq;        }        osg::LOD *makeLOD(const georecord *gr)        {            osg::LOD *gp=new LOD;            const geoField *gfd=gr->getField(GEO_DB_LOD_IN);            float in  = gfd ? gfd->getFloat() : 100.0;            gfd=gr->getField(GEO_DB_LOD_OUT);            float out = gfd ? gfd->getFloat() : 0.0;            gp->setRange(0,out,in);            gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                gp->setName(gfd->getChar());            }            return gp;        }        osg::Drawable* createClipSurface(float xMin,float xMax,float yMin,float yMax,float z)        {            // set up the Geometry that defines the clipped region.            osg::Geometry* geom = new osg::Geometry;                        osg::Vec3Array* coords = new osg::Vec3Array(4);            (*coords)[0].set(xMin,yMax,z);            (*coords)[1].set(xMin,yMin,z);            (*coords)[2].set(xMax,yMin,z);            (*coords)[3].set(xMax,yMax,z);            geom->setVertexArray(coords);                        geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));                        return geom;        }        Group *makeClipRegion(const georecord *gr) {            GeoClipRegion *clp=new GeoClipRegion;            const geoField *gfd=gr->getField(GEO_DB_NODE_NAME);            if (gfd) {                clp->setName(gfd->getChar());            }            gfd=gr->getField(140);            float *lleft = (gfd) ? (gfd->getVec3Arr()):NULL;            gfd=gr->getField(141);            float *uright= (gfd) ? (gfd->getVec3Arr()):NULL;            if (uright && lleft) {                Geode *geod=new Geode;                Drawable *drw=createClipSurface(lleft[0],uright[0],lleft[1],uright[1],lleft[2]);                geod->addDrawable(drw);                clp->addClipNode(geod);            }            return clp;        }        geoHeader *makeHeader(cons

⌨️ 快捷键说明

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