📄 readerwritergeo.cpp
字号:
} } 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 + -