diff --git a/NEWS.txt b/NEWS.txt index 83bfb6d4f..a6c37570e 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,7 +1,7 @@ OSG News (most significant items from ChangeLog) ================================================ -12th September 2003 - OpenSceneGraph-0.9.6 +14th September 2003 - OpenSceneGraph-0.9.6 >>> osgFX Special Effects nodekit, support for double Matrix traversals, >>> improved build support, thread safety and robustness. diff --git a/VisualStudio/VisualStudio.dsw b/VisualStudio/VisualStudio.dsw index afa5f8acc..5a0b8dd31 100644 --- a/VisualStudio/VisualStudio.dsw +++ b/VisualStudio/VisualStudio.dsw @@ -1742,6 +1742,15 @@ Package=<4> Begin Project Dependency Project_Dep_Name Core osgDB End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgUtil + End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgSim + End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgText + End Project Dependency }}} ############################################################################### diff --git a/VisualStudio/examples/slideshow3D/slideshow3D.dsp b/VisualStudio/examples/slideshow3D/slideshow3D.dsp index 18b70742c..50a885ece 100644 --- a/VisualStudio/examples/slideshow3D/slideshow3D.dsp +++ b/VisualStudio/examples/slideshow3D/slideshow3D.dsp @@ -189,6 +189,12 @@ SOURCE=..\..\..\examples\slideshow3D\DefaultPresentation.cpp SOURCE=..\..\..\examples\slideshow3D\SlideEventHandler.cpp +# End Source File +# Begin Source File + + +SOURCE=..\..\..\examples\slideshow3D\PointsEventHandler.cpp + # End Source File # Begin Source File @@ -229,6 +235,13 @@ SOURCE=..\..\..\examples\slideshow3D\SlideShowConstructor.cpp SOURCE=..\..\..\examples\slideshow3D\SlideEventHandler.h +# End Source File +# Begin Source File + + + +SOURCE=..\..\..\examples\slideshow3D\PointsEventHandler.h + # End Source File # Begin Source File diff --git a/src/osgPlugins/geo/ReaderWriterGEO.cpp b/src/osgPlugins/geo/ReaderWriterGEO.cpp index 47b17076c..599d7a185 100644 --- a/src/osgPlugins/geo/ReaderWriterGEO.cpp +++ b/src/osgPlugins/geo/ReaderWriterGEO.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -175,19 +177,62 @@ public: } } } + bool addFlat( const georecord *gface) + { // this must only be called with a vertex georecord. + bool isflat=false; + const geoField *gfshade=gface->getField(GEO_DB_POLY_SHADEMODEL); // shaded gouraud, flat... + int shademodel=gfshade ? gfshade->getInt() : -1; + if (shademodel==GEO_POLY_SHADEMODEL_LIT) { // flat shaded - need the index + const geoField *gfd=gface->getField(GEO_DB_POLY_NORMAL); + if (gfd) { + float *normal= (gfd) ? (gfd->getVec3Arr()):NULL; + osg::Vec3 nrm(normal[0], normal[1], normal[2]); + norms->push_back(nrm); + isflat=true; + } + } + return isflat; + } bool addIndices(georecord *gr, const geoHeaderGeo *ghdr, const float cdef[4], const georecord *gface) { // this must only be called with a vertex georecord. // gr is tha vertex; gface is the face containing the vertex bool hbeh=false; // true if this vertex has a behaviour if (gr->getType()==DB_DSK_VERTEX) { - const geoField *gfd=gr->getField(GEO_DB_VRTX_NORMAL); - int nrmindex=gfd ? gfd->getUInt():0; - normindices->push_back(nrmindex); - norms->push_back((*npool)[nrmindex]); - gfd=gr->getField(GEO_DB_VRTX_COORD); - unsigned int idx=gfd ? gfd->getInt():0; - coords->push_back((*cpool)[idx]); //osg::Vec3(cpool[3*idx],cpool[3*idx+1],cpool[3*idx+2])); - coordindices->push_back(txcoords->size()); + const geoField *gfshade=gface->getField(GEO_DB_POLY_SHADEMODEL); // shaded gouraud, flat... + int shademodel=gfshade ? gfshade->getInt() : -1; + if (shademodel!=GEO_POLY_SHADEMODEL_LIT && shademodel!=GEO_POLY_SHADEMODEL_FLAT) { + const geoField *gfd=gr->getField(GEO_DB_VRTX_NORMAL); + if (gfd->getType()==DB_UINT) { + unsigned int idx=gfd ? gfd->getUInt():-1; + if (idx>=0) { + normindices->push_back(idx); + norms->push_back((*npool)[idx]); + } else { + osg::notify(osg::WARN) << "No valid vertex index" << std::endl; + } + } else if (gfd->getType()==DB_VEC3F) { + float *p=gfd->getVec3Arr(); + osg::Vec3 nrm; + nrm.set(p[0],p[1],p[2]); + norms->push_back(nrm); + } + } + const geoField *gfd=gr->getField(GEO_DB_VRTX_COORD); + osg::Vec3 pos; + if (gfd->getType()==DB_INT) { + unsigned int idx=gfd ? gfd->getInt():-1; + if (idx>=0) { + pos=(*cpool)[idx]; + coords->push_back((*cpool)[idx]); //osg::Vec3(cpool[3*idx],cpool[3*idx+1],cpool[3*idx+2])); + coordindices->push_back(coords->size()); + } else { + osg::notify(osg::WARN) << "No valid vertex index" << std::endl; + } + } else if (gfd->getType()==DB_VEC3F) { + float *p=gfd->getVec3Arr(); + pos.set(p[0],p[1],p[2]); + coords->push_back(pos); //osg::Vec3(cpool[3*idx],cpool[3*idx+1],cpool[3*idx+2])); + } std::vector< georecord *>bhv=gr->getBehaviour(); // behaviours for vertices, eg tranlate, colour! if (!bhv.empty()) { int ncoord=coords->size(); @@ -198,14 +243,14 @@ public: if ((*rcitr)->getType()==DB_DSK_TRANSLATE_ACTION) { geoMoveVertexBehaviour *mb=new geoMoveVertexBehaviour; mb->makeBehave((*rcitr),ghdr); - mb->setpos((*cpool)[idx]); + mb->setpos(pos); mb->setindx(ncoord-1); BehList.push_back(mb); } if ((*rcitr)->getType()==DB_DSK_ROTATE_ACTION) { geoMoveVertexBehaviour *mb=new geoMoveVertexBehaviour; mb->makeBehave((*rcitr),ghdr); - mb->setpos((*cpool)[idx]); + mb->setpos(pos); mb->setindx(ncoord-1); BehList.push_back(mb); } @@ -231,16 +276,18 @@ public: } txindices->push_back(txcoords->size()); float *uvc=NULL; - gfd=gr->getField(GEO_DB_VRTX_UV_SET_1); + gfd=gr->getField(GEO_DB_VRTX_UV_SET_0); if (gfd) { uvc=(float *)gfd->getstore(0); - } - - if (uvc) { // then there are tx coords - osg::Vec2 uv(uvc[0], uvc[1]); - txcoords->push_back(uv); - } else { - txcoords->push_back(osg::Vec2(0,0)); + + if (uvc) { // then there are tx coords + osg::Vec2 uv(uvc[0], uvc[1]); + txcoords->push_back(uv); + } else { + txcoords->push_back(osg::Vec2(0,0)); + } + } else { + txcoords->push_back(osg::Vec2(0,0)); } gfd=gr->getField(GEO_DB_VRTX_PACKED_COLOR); if (gfd) { @@ -319,8 +366,7 @@ public: float getlinewidth(void) const { return linewidth;} void setlineWidth(const int w) { linewidth=w;} void setGeom(osg::Geometry *nugeom) { geom=nugeom;} - osg::Geometry *getGeom() const { return geom;} - osg::Geometry *getGeom() { return geom;} + osg::Geometry *getGeom() { return geom.get();} uint getStart(uint nv) { uint ns=nstart; nstart+=nv; return ns; } bool operator == (const geoInfo *gt) { // compare two geoInfos for same type of geometry if (gt->texture!=texture) return false; @@ -336,28 +382,25 @@ private: int linewidth; vertexInfo vinf; uint nstart; // start vertex for a primitive - osg::Geometry *geom; // the geometry created for this vinf and texture + osg::ref_ptr geom; // the geometry created for this vinf and texture }; -class ReaderWriterGEO : public ReaderWriter +class ReaderWriterGEO : public osgDB::ReaderWriter { public: - ReaderWriterGEO() { cpalrec=NULL; } - ~ReaderWriterGEO() { - } virtual const char* className() { return "GEO Reader/Writer"; } virtual bool acceptsExtension(const std::string& extension) { - return equalCaseInsensitive(extension,"gem") || equalCaseInsensitive(extension,"geo"); + return osgDB::equalCaseInsensitive(extension,"gem") || osgDB::equalCaseInsensitive(extension,"geo"); } virtual ReadResult readObject(const std::string& fileName, const Options* opt) { return readNode(fileName,opt); } virtual ReadResult readNode(const std::string& fileName, const Options*) { - std::string ext = getFileExtension(fileName); + std::string ext = osgDB::getFileExtension(fileName); if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; std::ifstream fin(fileName.c_str(), std::ios::binary | std::ios::in ); @@ -384,12 +427,14 @@ class ReaderWriterGEO : public ReaderWriter fin.close(); // now sort the records so that any record followed by a PUSh has a child set = next record, etc std::vector sorted=sort(recs); // tree-list of sorted record pointers -/*#ifdef _DEBUG +#ifdef _DEBUG osgDB::Output fout("georex.txt"); //, std::ios_base::out ); - fout << "Debug file " << fileName << std::endl; + // fout << "Debug raw file " << fileName << std::endl; + // output(fout,recs); + fout << "Debug Sorted file " << fileName << std::endl; output(fout,sorted); fout.close(); -#endif */ +#endif /**/ nodeList=makeosg(sorted); // make a list of osg nodes recs.clear(); geotxlist.clear(); @@ -399,17 +444,18 @@ class ReaderWriterGEO : public ReaderWriter matlist.clear();/* */ coord_pool.clear(); normal_pool.clear(); + osg::Node * groupnode = NULL; if (nodeList.empty()) { return ReadResult("No data loaded from "+fileName); } else if (nodeList.size()==1) { - return nodeList.front(); + groupnode = nodeList.front(); } else { - Group* group = new Group; + osg::Group *group = new Group; group->setName("import group"); for(NodeList::iterator itr=nodeList.begin(); itr!=nodeList.end(); @@ -417,8 +463,12 @@ class ReaderWriterGEO : public ReaderWriter { group->addChild(*itr); } - return group; + groupnode=group; } +#ifdef _DEBUG // output a .osg version + osgDB::writeNodeFile(*groupnode,"geoosg.osg"); +#endif /**/ + return groupnode; } return 0L; } @@ -434,6 +484,11 @@ class ReaderWriterGEO : public ReaderWriter // now parse for push/pops and add to lists switch ((*itr).getType()) { + case 101: // old header - not appropriate! + curparent= &(*itr); + sorted.push_back(&(*itr)); + osg::notify(osg::WARN) << "Old version 2 header block found - possible error!" << std::endl; + break; case DB_DSK_PUSH: if (!(curparent->getchildren().empty())) { curparent= curparent->getLastChild(); // itr-1; @@ -447,6 +502,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_HEADER: // attach to previous curparent= &(*itr); sorted.push_back(&(*itr)); + cpalrec=NULL; break; case DB_DSK_INTERNAL_VARS: // attach to parent case DB_DSK_LOCAL_VARS: @@ -577,7 +633,7 @@ class ReaderWriterGEO : public ReaderWriter int txidx=ginf.getTexture(); nug=new osg::Geometry; const vertexInfo *vinf=ginf.getVinf(); - nug->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); +// nug->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); nug->setVertexArray(vinf->getCoords()); nug->setNormalArray(vinf->getNorms()); StateSet *dstate=new StateSet; @@ -622,6 +678,7 @@ class ReaderWriterGEO : public ReaderWriter { // reclaim the colours gfd=grec->getField(GEO_DB_POLY_USE_MATERIAL_DIFFUSE); // true: use material... bool usemat= gfd ? gfd->getBool() : false; + nug->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); if (!usemat) { // get the per vertex colours OR per face colours. gfd=grec->getField(GEO_DB_POLY_USE_VERTEX_COLORS); // true: use material... bool usevert=gfd ? gfd->getBool() : false; @@ -632,11 +689,14 @@ class ReaderWriterGEO : public ReaderWriter nug->setColorBinding(osg::Geometry::BIND_PER_VERTEX); } } else { - osg::Vec4Array *polycols=vinf->getPolcolours(); - //if (polycols->size() > 0) { - nug->setColorArray(polycols); - nug->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE); - //} + if (shademodel==GEO_POLY_SHADEMODEL_LIT_GOURAUD) { + nug->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); + } else if (shademodel==GEO_POLY_SHADEMODEL_LIT) { + nug->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE); + } + osg::Vec4Array *polycols=vinf->getPolcolours(); + nug->setColorArray(polycols); + nug->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE); } } } @@ -673,14 +733,11 @@ class ReaderWriterGEO : public ReaderWriter } if (gr.size()>0) { + vinf->addFlat(grec); // for flat normal shading for (std::vector::const_iterator itr=gr.begin(); itr!=gr.end(); ++itr) { - //bool hbeh= - vinf->addIndices((*itr), theHeader, defcol, grec); - //if (hbeh) { // then add a behaviour callback to the primitive - // bool hasbehave=true; - //} + vinf->addIndices((*itr), theHeader.get(), defcol, grec); nv++; } } @@ -708,8 +765,8 @@ class ReaderWriterGEO : public ReaderWriter //int gFontSize1=2; osgText::Text *text= new osgText::Text; text->setFont(ttfPath); - const geoField *gfd=gr->getField(GEO_DB_TEXT_NAME); - //const char *name=gfd ? gfd->getChar() : "a text"; + const geoField *gfd=gr->getField(GEO_DB_NODE_NAME); + const char *name=gfd ? gfd->getChar() : "a text"; gfd=gr->getField(GEO_DB_TEXT_STRING); const char *content=gfd ? gfd->getChar() : " "; text->setText(std::string(content)); @@ -745,6 +802,7 @@ class ReaderWriterGEO : public ReaderWriter textState->setMode(GL_LIGHTING, osg::StateAttribute::OFF); geod->setStateSet( textState ); numt=new osg::MatrixTransform; + numt->setName(name); gfd=gr->getField(GEO_DB_TEXT_MATRIX); if (gfd) { float *fmat=gfd->getMat44Arr(); @@ -767,7 +825,7 @@ class ReaderWriterGEO : public ReaderWriter geoStrContentBehaviour *cb=new geoStrContentBehaviour; gfd=(*rcitr)->getField(GEO_DB_STRING_CONTENT_ACTION_INPUT_VAR); if (gfd) { - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; // ok=false; @@ -801,7 +859,7 @@ class ReaderWriterGEO : public ReaderWriter } else { // overall cb->setVertIndices(0,1); // part of colours array to be modified } - bool ok=cb->makeBehave((*rcitr), theHeader); + bool ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } @@ -820,7 +878,18 @@ class ReaderWriterGEO : public ReaderWriter if ((*itr)->getType()==DB_DSK_VERTEX) { // light point vertices const geoField *gfd=(*itr)->getField(GEO_DB_VRTX_COORD); - unsigned int idx=gfd ? gfd->getInt():0; + osg::Vec3 pos; + if (gfd->getType()==DB_INT) { + unsigned int idx=gfd ? gfd->getInt():-1; + if (idx>=0) { + pos=coord_pool[idx]; + } else { + osg::notify(osg::WARN) << "No valid vertex index" << std::endl; + } + } else if (gfd->getType()==DB_VEC3F) { + float *p=gfd->getVec3Arr(); + pos.set(p[0],p[1],p[2]); + } gfd=(*itr)->getField(GEO_DB_VRTX_PACKED_COLOR); if (gfd) { unsigned char *cls=gfd->getUCh4Arr(); @@ -829,13 +898,13 @@ class ReaderWriterGEO : public ReaderWriter float blue=cls[2]/255.0f; //float alpha=1.0f; // cls[3]*frac/255.0f; osg::Vec4 colour(red,green,blue,1.0f); - lpn->addLightPoint(osgSim::LightPoint(true,coord_pool[idx],colour,1.0f,1.0f,0,0,osgSim::LightPoint::BLENDED)); + lpn->addLightPoint(osgSim::LightPoint(true,pos,colour,1.0f,1.0f,0,0,osgSim::LightPoint::BLENDED)); } else { // get colour from palette gfd=(*itr)->getField(GEO_DB_VRTX_COLOR_INDEX); // use color pool... int icp= gfd ? gfd->getInt() : 0; float col[4]; theHeader->getPalette(icp, col); - lpn->addLightPoint(osgSim::LightPoint((coord_pool)[idx], osg::Vec4(col[0],col[1],col[2],1.0f))); + lpn->addLightPoint(osgSim::LightPoint(pos, osg::Vec4(col[0],col[1],col[2],1.0f))); } } } @@ -856,17 +925,19 @@ class ReaderWriterGEO : public ReaderWriter } } } - void makeAnimatedGeometry(const georecord grec, const int imat,Group *nug) { + int makeAnimatedGeometry(const georecord grec, const int imat,Group *nug) { // animated polygons - create a matrix & geode & poly & add to group nug const std::vector gr=grec.getchildren(); + int nanimations=0; bool bothsides=allOneSided(&grec); for (std::vector::const_iterator itr=gr.begin(); itr!=gr.end(); ++itr) { std::vector< georecord *>bhv=(*itr)->getBehaviour(); // behaviours attached to facets, eg colour! if ((*itr)->getType()==DB_DSK_POLYGON && !bhv.empty()) { // animated facets go here + nanimations++; if (hasMotionAction(bhv)) { // make matrix if motion needed. - const geoField *gfd=(*itr)->getField(GEO_DB_POLY_TEX); + const geoField *gfd=(*itr)->getField(GEO_DB_POLY_TEX0); int txidx= gfd ? gfd->getInt() : -1; gfd=(*itr)->getField(GEO_DB_POLY_SHADEMODEL); // shaded gouraud, flat... int shademodel=gfd ? gfd->getInt() : GEO_POLY_SHADEMODEL_LIT_GOURAUD; @@ -910,7 +981,7 @@ class ReaderWriterGEO : public ReaderWriter } } - return; + return nanimations; } bool hasColorAction(std::vector< georecord *>bhv) { // true if one of the actions changes colour bool ok=false; @@ -952,11 +1023,10 @@ class ReaderWriterGEO : public ReaderWriter } geoInfo *getGeometry(const georecord *grec,Geode *nug, std::vector *ia, const unsigned int imat, const int shademodel, const bool bothsides) { - //gfd=(*itr)->getField(GEO_DB_POLY_NORMAL); // polygon normal for whole poly int igidx=0, igeom=-1; - const geoField *gfd=grec->getField(GEO_DB_POLY_TEX); + const geoField *gfd=grec->getField(GEO_DB_POLY_TEX0); int txidx= gfd ? gfd->getInt() : -1; - for (std::vector::const_iterator itrint=ia->begin(); + for (std::vector::iterator itrint=ia->begin(); itrint!=ia->end() && igeom<0; ++itrint) { // find a geometry that shares this texture. // also test for other properties of a unique material: @@ -983,7 +1053,7 @@ class ReaderWriterGEO : public ReaderWriter } return (&((*ia)[igeom])); } - void makeGeometry(const georecord &grec, const unsigned int imat,Geode *nug) + int makeGeometry(const georecord &grec, const unsigned int imat,Geode *nug) { // makegeometry makes a set of Geometrys attached to current parent (Geode nug) const std::vector gr=grec.getchildren(); // std::vector geom; @@ -1062,7 +1132,7 @@ class ReaderWriterGEO : public ReaderWriter } } } - return; + return gr.size(); } void makeTexts(georecord grec, Group *nug) { // makeTexts adds a set of text+transform Geometrys attached to current parent (Group nug) @@ -1085,20 +1155,24 @@ class ReaderWriterGEO : public ReaderWriter 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_RENDERGROUP_NAME); + 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_RENDERGROUP_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { char *name = gfd->getChar(); nug->setName(name); @@ -1126,13 +1200,13 @@ class ReaderWriterGEO : public ReaderWriter } else { nug=new Geode; } */ - gfd=gr->getField(GEO_DB_RENDERGROUP_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { char *name = gfd->getChar(); nug->setName(name); } - makeAnimatedGeometry((*gr),imat,nug); - if (nug->getNumChildren() <=0) { + int nans=makeAnimatedGeometry((*gr),imat,nug); + if (nans <=0) { nug=NULL; } return nug; @@ -1141,9 +1215,9 @@ class ReaderWriterGEO : public ReaderWriter { const geoField *gfd=gr.getField(GEO_DB_RENDERGROUP_MAT); const unsigned int imat=gfd ? gfd->getInt():0; - gfd=gr.getField(GEO_DB_RENDERGROUP_IS_BILLBOARD); + gfd=gr.getField(GEO_DB_RENDERGROUP_BILLBOARD); bool isbillb = gfd ? gfd->getBool() : false; - Geode *nug; + osg::Geode *nug; if (isbillb) { Billboard *bilb= new Billboard ; bilb->setAxis(Vec3(0,0,1)); @@ -1152,36 +1226,48 @@ class ReaderWriterGEO : public ReaderWriter } else { nug=new Geode; } - gfd=gr.getField(GEO_DB_RENDERGROUP_NAME); - if (gfd) { - nug->setName(gfd->getChar()); - } - makeGeometry(gr,imat,nug); - return nug; + 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_PAGE_NAME); + const geoField *gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { gp->setName(gfd->getChar()); } return gp; } - osg::Group *makeGroup(const georecord *gr) { // group or Static transform - osg::Group *gp=NULL; - const geoField *gfd=gr->getField(GEO_DB_GRP_TRANSFORM); + osg::Group *setmatrix(const georecord *gr) { // find one of the type sof 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); - gp=tr; + 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; } - gfd=gr->getField(GEO_DB_GRP_NAME); + const geoField *gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { gp->setName(gfd->getChar()); } @@ -1209,7 +1295,7 @@ class ReaderWriterGEO : public ReaderWriter sw->setSingleChildOn(0); osg::notify(osg::WARN) << gr << " No mask " << std::endl; } - gfd=gr->getField(GEO_DB_SWITCH_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { sw->setName(gfd->getChar()); } @@ -1219,7 +1305,7 @@ class ReaderWriterGEO : public ReaderWriter osg::Sequence *makeSequence(const georecord *gr) { Sequence *sq=new Sequence; - const geoField *gfd=gr->getField(GEO_DB_SEQUENCE_NAME); + const geoField *gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { sq->setName(gfd->getChar()); } @@ -1233,7 +1319,7 @@ class ReaderWriterGEO : public ReaderWriter gfd=gr->getField(GEO_DB_LOD_OUT); float out = gfd ? gfd->getFloat() : 0.0; gp->setRange(0,out,in); - gfd=gr->getField(GEO_DB_LOD_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { gp->setName(gfd->getChar()); } @@ -1290,7 +1376,7 @@ class ReaderWriterGEO : public ReaderWriter // theHeader->setUpdateCallback(theHeader->getInternalVars()); } if ((*rcitr)->getType()==DB_DSK_FLOAT_VAR) { - if (theHeader) theHeader->addUserVar((**rcitr)); + if (theHeader.valid()) theHeader->addUserVar((**rcitr)); } } theHeader->setUpdateCallback(new geoHeaderCB); @@ -1300,7 +1386,7 @@ class ReaderWriterGEO : public ReaderWriter (*itr)->setMaterial(mt); matlist.push_back(mt); } - return theHeader; + return theHeader.get(); } void makeTexture(const georecord *gr) { // scans the fields of this record and puts a new texture & environment into 'pool' stor @@ -1405,7 +1491,7 @@ class ReaderWriterGEO : public ReaderWriter break; case DB_DSK_ROTATE_ACTION: { geoMoveBehaviour *cb= new geoMoveBehaviour; - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } @@ -1413,14 +1499,14 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_SCALE_ACTION: { geoMoveBehaviour *sb=new geoMoveBehaviour; - ok=sb->makeBehave((*rcitr), theHeader); + ok=sb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(sb); else delete sb; } break; case DB_DSK_TRANSLATE_ACTION: { geoMoveBehaviour *cb= new geoMoveBehaviour; - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } @@ -1428,35 +1514,35 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_COMPARE_ACTION: { geoCompareBehaviour *cb=new geoCompareBehaviour; - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } break; case DB_DSK_ARITHMETIC_ACTION: { geoArithBehaviour *cb=new geoArithBehaviour; - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } break; case DB_DSK_CLAMP_ACTION: { geoClampBehaviour *cb=new geoClampBehaviour; - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } break; case DB_DSK_RANGE_ACTION: { geoRangeBehaviour *cb=new geoRangeBehaviour; - ok=cb->makeBehave((*rcitr), theHeader); + ok=cb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(cb); else delete cb; } break; case DB_DSK_VISIBILITY_ACTION: { geoVisibBehaviour *vb = new geoVisibBehaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } @@ -1464,49 +1550,49 @@ class ReaderWriterGEO : public ReaderWriter // ar3 types case DB_DSK_TRIG_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } break; case DB_DSK_INVERSE_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } break; case DB_DSK_LINEAR_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } break; case DB_DSK_PERIODIC_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } break; case DB_DSK_PERIODIC2_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } break; case DB_DSK_TRUNCATE_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } break; case DB_DSK_ABS_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } @@ -1515,7 +1601,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_DCS_ACTION: */ case DB_DSK_DISCRETE_ACTION: { geoDiscreteBehaviour *db = new geoDiscreteBehaviour; - ok=db->makeBehave((*rcitr), theHeader); + ok=db->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(db); else delete db; } @@ -1527,7 +1613,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_IF_THEN_ELSE_ACTION: { geoAr3Behaviour *vb = new geoAr3Behaviour; - ok=vb->makeBehave((*rcitr), theHeader); + ok=vb->makeBehave((*rcitr), theHeader.get()); if (ok) gcb->addBehaviour(vb); else delete vb; } @@ -1550,12 +1636,27 @@ class ReaderWriterGEO : public ReaderWriter ++itr) { const georecord *gr=*itr; Group *mtr=makeBehave(gr); - if (gr->getType()== DB_DSK_GEODE) { // geodes can require >1 geometry for example if polygons have different texture indices. + if (gr->getType()== DB_DSK_RENDERGROUP) { // geodes can require >1 geometry for example if polygons have different texture indices. // and for example if the node has a colour or other fine behaviour Geode *geode=makeGeode(*gr); // geode of geometrys Group *animatedGeodes= makeAnimatedGeodes(gr); Group *lightptGeodes= makeLightPointGeodes(gr); Group *textgeode=makeTextGeode(gr); // group of matrices & texts + const geoField *gfd=gr->getField(GEO_DB_GRP_ZBUFFER); + if (gfd) { + bool onoff=gfd->getBool(); + if (!onoff) { // no z buffer - force to use unsorted renderBin + StateSet *dstate=new StateSet; + osg::Depth* depth = new osg::Depth; + depth->setFunction(osg::Depth::ALWAYS); + dstate->setAttribute(depth); + dstate->setRenderBinDetails(osg::StateSet::OPAQUE_BIN + 3, "UnSortedBin"); + if (geode) geode->setStateSet( dstate ); + if (animatedGeodes) animatedGeodes->setStateSet( dstate ); + if (lightptGeodes) lightptGeodes->setStateSet( dstate ); + if (textgeode) textgeode->setStateSet( dstate ); + } + } if (mtr) { if (geode) mtr->addChild(geode); @@ -1567,6 +1668,7 @@ class ReaderWriterGEO : public ReaderWriter } else { if (!geodeholder && (geode || textgeode)) { geodeholder=new osg::Group; + geodeholder->setName("geodeHolder"); } if (geode) geodeholder->addChild(geode); if (animatedGeodes) geodeholder->addChild(animatedGeodes); @@ -1577,6 +1679,7 @@ class ReaderWriterGEO : public ReaderWriter Group *holder=NULL; const geoField *gfd; switch (gr->getType()) { + case 101: case DB_DSK_HEADER: holder=makeHeader(gr); (*itr)->setNode(holder); @@ -1607,7 +1710,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_CUBE: holder=new Group; (*itr)->setNode(holder); - gfd=gr->getField(GEO_DB_GRP_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { holder->setName(gfd->getChar()); } @@ -1615,7 +1718,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_SPHERE: holder=new Group; (*itr)->setNode(holder); - gfd=gr->getField(GEO_DB_GRP_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { holder->setName(gfd->getChar()); } @@ -1623,7 +1726,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_CONE: holder=new Group; (*itr)->setNode(holder); - gfd=gr->getField(GEO_DB_GRP_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { holder->setName(gfd->getChar()); } @@ -1631,7 +1734,7 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_CYLINDER: holder=new Group; (*itr)->setNode(holder); - gfd=gr->getField(GEO_DB_GRP_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { holder->setName(gfd->getChar()); } @@ -1639,11 +1742,11 @@ class ReaderWriterGEO : public ReaderWriter case DB_DSK_INSTANCE: { MatrixTransform *mtr=new MatrixTransform; - gfd=gr->getField(GEO_DB_INSTANCE_NAME); + gfd=gr->getField(GEO_DB_NODE_NAME); if (gfd) { mtr->setName(gfd->getChar()); } - gfd=gr->getField(GEO_DB_INSTANCE_TRANSFORM); + gfd=gr->getField(GEO_DB_GRP_MATRIX_TRANSFORM); // was: GEO_DB_INSTANCE_TRANSFORM); if (gfd) { float *fmat=gfd->getMat44Arr(); mtr->setMatrix(Matrix(fmat)); @@ -1732,6 +1835,17 @@ class ReaderWriterGEO : public ReaderWriter } return nodelist; } + void output(osgDB::Output &fout,std::vector gr) + { // debugging - print the tree of records + if (gr.size()>0) { + for (std::vector::iterator itr=gr.begin(); + itr!=gr.end(); + ++itr) { + fout.indent() << "Node type " << (*itr).getType() << " "; + fout.indent() << (*itr) << std::endl; + } + } + } void output(osgDB::Output &fout,std::vector gr) { // debugging - print the tree of records fout.moveIn(); @@ -1761,28 +1875,28 @@ class ReaderWriterGEO : public ReaderWriter } break; case DB_DSK_LOD: - gfd=(*itr).getField(GEO_DB_LOD_INSTANCE_DEF); + gfd=(*itr).getField(GEO_DB_INSTANCE_DEF); if (gfd) { uint fidnod=gfd->getUInt(); if (fidnod==fid) return &(*itr); } break; case DB_DSK_SEQUENCE: - gfd=(*itr).getField(GEO_DB_SEQUENCE_INSTANCE_DEF); + gfd=(*itr).getField(GEO_DB_INSTANCE_DEF); if (gfd) { uint fidnod=gfd->getUInt(); if (fidnod==fid) return &(*itr); } break; case DB_DSK_SWITCH: - gfd=(*itr).getField(GEO_DB_SWITCH_INSTANCE_DEF); + gfd=(*itr).getField(GEO_DB_INSTANCE_DEF); if (gfd) { uint fidnod=gfd->getUInt(); if (fidnod==fid) return &(*itr); } break; - case DB_DSK_GEODE: - gfd=(*itr).getField(GEO_DB_RENDERGROUP_INSTANCE_DEF); + case DB_DSK_RENDERGROUP: + gfd=(*itr).getField(GEO_DB_INSTANCE_DEF); if (gfd) { uint fidnod=gfd->getUInt(); if (fidnod==fid) return &(*itr); @@ -1797,7 +1911,7 @@ private: geoRecordList recs; // the records read from file std::vector coord_pool; // current vertex ooords std::vector normal_pool; // current pool of normal vectors - geoHeaderGeo *theHeader; // an OSG class - has animation vars etc + osg::ref_ptr theHeader; // an OSG class - has animation vars etc std::vector geotxlist; // list of geo::textures for this model std::vector geomatlist; // list of geo::materials for this model std::vector txlist; // list of osg::textures for this model @@ -1947,14 +2061,14 @@ void geoField::readfile(std::ifstream &fin, const uint id) { // is part of a rec fin.read((char *)&tokid,1);fin.read((char *)&type,1); fin.read((char *)&nits,sizeof(unsigned short)); // osg::notify(osg::WARN) << "geoField " << (int)tokid << " type " << (int)type << " nit " << (int)nits << std::endl; - if (type == GEO_DB_EXTENDED_FIELD) { // change for true extended type + if (type == DB_EXTENDED_FIELD_STRUCT) { // change for true extended type fin.read((char *)&tokenId,sizeof(tokenId));fin.read((char *)&TypeId,sizeof(TypeId)); fin.read((char *)&numItems,sizeof(unsigned int)); } else { tokenId=tokid; TypeId=type; numItems=nits; } - if (id== 0 && tokenId == GEO_DB_USER_EXT_VALUE_FIELD && numItems==1) { // Feb 2003 parse extension template records + if (id== 0 && tokenId == GEO_DB_NODE_EXTENDED && numItems==1) { // Feb 2003 parse extension template records if (TypeId == DB_SHORT || TypeId == DB_USHORT) { short upad; @@ -1973,8 +2087,8 @@ void geoField::readfile(std::ifstream &fin, const uint id) { // is part of a rec } else { if (numItems>0) { storageRead(fin); // allocate & fill the storage - if (tokenId == GEO_DB_USER_EXT_VALUE_FIELD) { - if (id==DB_DSK_POLYGON || id==DB_DSK_GEODE || id==DB_DSK_GROUP + if (tokenId == GEO_DB_NODE_EXTENDED) { + if (id==DB_DSK_POLYGON || id==DB_DSK_RENDERGROUP || id==DB_DSK_GROUP || id==DB_DSK_LOD || id==DB_DSK_MESH || id==DB_DSK_CUBE || id==DB_DSK_SPHERE || id==DB_DSK_CONE || id==DB_DSK_CYLINDER || id==DB_DSK_TEXTURE || id==DB_DSK_MATERIAL || id==DB_DSK_VIEW) { diff --git a/src/osgPlugins/geo/geoFormat.h b/src/osgPlugins/geo/geoFormat.h index 4137b5be0..1505b7713 100644 --- a/src/osgPlugins/geo/geoFormat.h +++ b/src/osgPlugins/geo/geoFormat.h @@ -42,15 +42,45 @@ COPYRIGHT NOTICE: +#define GEO_1_0_RC2 1132 +#define GEO_1_0_RC3 1133 +#define GEO_1_0_RC4 1134 // GEO_VERSION = ((GEO_LIB_MAJOR_VERSION*1000)+ + // (GEO_LIB_MINOR_VERSION*100) + + // (GEO_LIB_LEVEL_VERSION*10) + + // (GEO_LIB_RELEASE_VERSION)) + + + // // Constants to define the Node disk records. Used in RecordToken.id // -const unsigned int DB_DSK_HEADER = 101; -const unsigned int DB_DSK_GROUP = 102; + +/////////////////////////////////////////////////////////////////////////////// +// +// Record Ids +// +/////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------- +// Geo 1.0 RC 2 & Below +//---------------------------------------------------------------- + +//const unsigned int DB_DSK_HEADER = 101; + +//---------------------------------------------------------------- +// Geo 1.0 RC 3 & Above +//---------------------------------------------------------------- +const unsigned int DB_DSK_HEADER = 100; // NOTE File MAGIC ID *CHANGED* + +//---------------------------------------------------------------- +// +//---------------------------------------------------------------- + +const unsigned int DB_DSK_GROUP = 102; const unsigned int DB_DSK_SEQUENCE = 104; const unsigned int DB_DSK_LOD = 105; -const unsigned int DB_DSK_GEODE = 106; +const unsigned int DB_DSK_RENDERGROUP = 106; const unsigned int DB_DSK_POLYGON = 107; const unsigned int DB_DSK_MESH = 108; // Unused - Possible Future expansion const unsigned int DB_DSK_CUBE = 109; // Unused - Possible Future expansion @@ -68,9 +98,7 @@ const unsigned int DB_DSK_SWITCH = 120; const unsigned int DB_DSK_TEXT = 121; const unsigned int DB_DSK_BASE_GROUP = 122; const unsigned int DB_DSK_BASE_SURFACE = 123; - const unsigned int DB_DSK_BEHAVIOR = 124; - const unsigned int DB_DSK_CLAMP_ACTION = 125; const unsigned int DB_DSK_RANGE_ACTION = 126; const unsigned int DB_DSK_ROTATE_ACTION = 127; @@ -82,33 +110,26 @@ const unsigned int DB_DSK_CONDITIONAL_ACTION = 132; const unsigned int DB_DSK_LOOPING_ACTION = 133; const unsigned int DB_DSK_COMPARE_ACTION = 134; const unsigned int DB_DSK_VISIBILITY_ACTION = 135; -const unsigned int DB_DSK_STRING_CONTENT_ACTION = 136; - +const unsigned int DB_DSK_STRING_CONTENT_ACTION = 136; const unsigned int DB_DSK_INTERNAL_VARS = 137; const unsigned int DB_DSK_LOCAL_VARS = 138; -const unsigned int DB_DSK_EXTERNAL_VARS = 139; - +const unsigned int DB_DSK_EXTERNAL_VARS = 139; const unsigned int DB_DSK_FLOAT_VAR = 140; const unsigned int DB_DSK_INT_VAR = 141; const unsigned int DB_DSK_LONG_VAR = 142; const unsigned int DB_DSK_DOUBLE_VAR = 143; const unsigned int DB_DSK_BOOL_VAR = 144; - const unsigned int DB_DSK_CONDITIONAL_BEGIN_CHILDREN = 145; // complex nested action branch mechanism const unsigned int DB_DSK_IF_CONDITION = 146; const unsigned int DB_DSK_ELSE_CONDITION = 147; const unsigned int DB_DSK_CONDITIONAL_END_CHILDREN = 148; - const unsigned int DB_DSK_COLOR_PALETTE = 149; const unsigned int DB_DSK_COLOR_RAMP_ACTION = 150; - const unsigned int DB_DSK_FLOAT2_VAR = 151; const unsigned int DB_DSK_FLOAT3_VAR = 152; -const unsigned int DB_DSK_FLOAT4_VAR = 153; - +const unsigned int DB_DSK_FLOAT4_VAR = 153; const unsigned int DB_DSK_LINEAR_ACTION = 154; -const unsigned int DB_DSK_TASK_ACTION = 155; - +const unsigned int DB_DSK_TASK_ACTION = 155; const unsigned int DB_DSK_PERIODIC_ACTION = 156; const unsigned int DB_DSK_PERIODIC2_ACTION = 157; // Redundant record - Periodic supports types 1 & 2 const unsigned int DB_DSK_TRIG_ACTION = 158; @@ -116,38 +137,36 @@ const unsigned int DB_DSK_INVERSE_ACTION = 159; const unsigned int DB_DSK_TRUNCATE_ACTION = 160; const unsigned int DB_DSK_ABS_ACTION = 161; const unsigned int DB_DSK_IF_THEN_ELSE_ACTION = 162; // simple variable value check - const unsigned int DB_DSK_DCS_ACTION = 163; - const unsigned int DB_DSK_INSTANCE = 164; - const unsigned int DB_DSK_COORD_POOL = 165; - const unsigned int DB_DSK_LIGHTPT = 166; const unsigned int DB_DSK_EXTERNAL = 167; - const unsigned int DB_DSK_NORMAL_POOL = 168; - const unsigned int DB_DSK_DISCRETE_ACTION = 169; - const unsigned int DB_DSK_STRING_VAR = 170; const unsigned int DB_DSK_STRING_COPY_ACTION = 171; - const unsigned int DB_DSK_PAGE = 172; - const unsigned int DB_DSK_SQRT_ACTION = 173; const unsigned int DB_DSK_LOG_ACTION = 174; - const unsigned int DB_DSK_PLANE_TEXTURE_MAPPING_INFO = 175; const unsigned int DB_DSK_CYLINDER_TEXTURE_MAPPING_INFO = 176; // not implemented in 1.0 const unsigned int DB_DSK_SPHERE_TEXTURE_MAPPING_INFO = 177; // not implemented in 1.0 const unsigned int DB_DSK_GRID_TEXTURE_MAPPING_INFO = 178; // not implemented in 1.0 - const unsigned int DB_DSK_PERSPECTIVE_GRID_INFO = 179; const unsigned int DB_DSK_XY_GRID_INFO = 180; // not implemented in 1.0 const unsigned int DB_DSK_XZ_GRID_INFO = 181; // not implemented in 1.0 const unsigned int DB_DSK_YZ_GRID_INFO = 182; // not implemented in 1.0 - +const unsigned int DB_DSK_MULTI_TEX_SHADER = 183; +const unsigned int DB_DSK_CULL_GROUP = 184; +const unsigned int DB_DSK_Z_OFFSET_GROUP = 185; +const unsigned int DB_DSK_MULTI_SAMPLE_AA_GROUP = 186; +const unsigned int DB_DSK_LINE_AA_GROUP = 187; +const unsigned int DB_DSK_FADE_GROUP = 188; +const unsigned int DB_DSK_TERRAIN = 189; +const unsigned int DB_DSK_BSP = 190; + + @@ -228,12 +247,10 @@ const unsigned char SIZEOF_BITFLAGS = (SIZEOF_INT); -// Is this really meant to be unsigned???? -const unsigned short MIN_CHAR_VAL = (unsigned short)(-128); +const unsigned short MIN_CHAR_VAL = -128; const unsigned short MAX_CHAR_VAL = 127; const unsigned short MAX_UCHAR_VAL = 255; -// Is this really meant to be unsigned???? -const unsigned short MIN_SHORT_VAL = (unsigned short)(-32768); +const unsigned short MIN_SHORT_VAL = -32768; const unsigned short MAX_SHORT_VAL = 32767; const unsigned short MAX_USHORT_VAL = 65535; @@ -333,7 +350,7 @@ struct GEO_DB_API geoFieldHeader * * geoFieldHeader * { - * DB_UCHAR id GEO_DB_EXTENDED_FIELD + * DB_UCHAR id GEO_DB_NODE_EXTENDED * DB_UCHAR type DB_EXTENDED_FIELD_STRUCT * DB_USHORT num 1 * } @@ -374,14 +391,50 @@ struct GEO_DB_API geoExtendedFieldHeader // const unsigned char GEO_DB_LAST_FIELD = 0; + + + + + /////////////////////////////////////////////////////////////////////////////// -// Common field types for all Nodes // -const unsigned char GEO_DB_USER_EXT_VALUE_FIELD = 1; -const unsigned char GEO_DB_PADDING = 252; -const unsigned char GEO_DB_TRANSFORM_FIELD = 253; -const unsigned char GEO_DB_EXTENDED_FIELD = 254; -const unsigned char GEO_DB_COMMENT_FIELD = 255; +// Common NODE field types - can found for all SceneGraph Nodes +// +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_NODE_EXT = 1; +const unsigned char GEO_DB_NODE_PADDING = 2; +const unsigned char GEO_DB_NODE_EXTENDED = 4; +const unsigned char GEO_DB_NODE_COMMENT = 5; +const unsigned char GEO_DB_NODE_NAME = 6; +const unsigned char GEO_DB_NODE_ID = 7; // internal use only + + +/////////////////////////////////////////////////////////////////////////////// +// +// Field ID Address Ranges... +// +//NODE 1 through 19 +// DERIVED_A : public NODE 20 through 79 +// DERIVED_B : public DERIVED_A 80 through 139 +// DERIVED_C : public DERIVED_B 140 through 199 +// DERIVED_D : public DERIVED_C 200 through 255 +// +//Examples: +// +//GEO_DSK_MULTI_TEX_SHADER: +// Node Property IDs 1 through 19 +// Group Property IDs 20 through 79 +// RenderGroup property IDs 80 through 139 +// MultiTexShader Property IDs 140 through 199 +// +// +//DB_DSK_LIGHTPT: +// Node Property IDs 1 through 19 +// Polygon Property IDs 20 through 79 +// LightPt property IDs 80 through 139 +// +/////////////////////////////////////////////////////////////////////////////// @@ -389,349 +442,706 @@ const unsigned char GEO_DB_COMMENT_FIELD = 255; /////////////////////////////////////////////////////////////////////////////// +// // GEO_DB_HEADER Record - Field Ids // -const unsigned char GEO_DB_HDR_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_HDR_UNITS = 2; -const unsigned char GEO_DB_HDR_BBOX = 3; -const unsigned char GEO_DB_HDR_NAME = 5; -const unsigned char GEO_DB_HDR_VERSION = 8; -const unsigned char GEO_DB_HDR_EXT_TEMPLATE = 9; -const unsigned char GEO_DB_HDR_UP_AXIS = 12; -const unsigned char GEO_DB_HDR_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_HDR_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_HDR_EXT = 1; // From Node +const unsigned char GEO_DB_HDR_PADDING = 2; // From Node +const unsigned char GEO_DB_HDR_EXTENDED = 4; // From Node +const unsigned char GEO_DB_HDR_COMMENT = 5; // From Node +const unsigned char GEO_DB_HDR_NAME = 6; // From Node +const unsigned char GEO_DB_HDR_NODE_ID = 7; // From Node + +const unsigned char GEO_DB_HDR_UNITS = 20; // Header Additions +const unsigned char GEO_DB_HDR_BBOX = 21; +const unsigned char GEO_DB_HDR_VERSION = 22; +const unsigned char GEO_DB_HDR_EXT_TEMPLATE = 23; +const unsigned char GEO_DB_HDR_UP_AXIS = 24; + + + + /////////////////////////////////////////////////////////////////////////////// +// // DB_DSK_COORD_POOL Record - Field Ids // -const unsigned char GEO_DB_COORD_POOL_SIZE = 1; -const unsigned char GEO_DB_COORD_POOL_VALUES = 2; -const unsigned char GEO_DB_COORD_POOL_SCALE = 3; -const unsigned char GEO_DB_COORD_POOL_OFFSET = 4; +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_COORD_POOL_SIZE = 1; +const unsigned char GEO_DB_COORD_POOL_VALUES = 2; +const unsigned char GEO_DB_COORD_POOL_SCALE = 3; +const unsigned char GEO_DB_COORD_POOL_OFFSET = 4; + + + + /////////////////////////////////////////////////////////////////////////////// +// // DB_DSK_NORMAL_POOL Record - Field Ids // -const unsigned char GEO_DB_NORMAL_POOL_SIZE = 1; -const unsigned char GEO_DB_NORMAL_POOL_VALUES = 2; +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_NORMAL_POOL_SIZE = 1; +const unsigned char GEO_DB_NORMAL_POOL_VALUES = 2; + + + + /////////////////////////////////////////////////////////////////////////////// +// // DB_DSK_MATERIAL Record - Field Ids // -const unsigned char GEO_DB_MAT_AMBIENT = 1; -const unsigned char GEO_DB_MAT_DIFFUSE = 2; -const unsigned char GEO_DB_MAT_SPECULAR = 3; -const unsigned char GEO_DB_MAT_SHININESS = 4; -const unsigned char GEO_DB_MAT_NAME = 5; -const unsigned char GEO_DB_MAT_EMISSIVE = 6; +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_MAT_AMBIENT = 1; +const unsigned char GEO_DB_MAT_DIFFUSE = 2; +const unsigned char GEO_DB_MAT_SPECULAR = 3; +const unsigned char GEO_DB_MAT_SHININESS = 4; +const unsigned char GEO_DB_MAT_NAME = 5; +const unsigned char GEO_DB_MAT_EMISSIVE = 6; + + + + /////////////////////////////////////////////////////////////////////////////// +// // DB_DSK_COLOR_PALETTE Record - Field Ids // +/////////////////////////////////////////////////////////////////////////////// + const unsigned char GEO_DB_COLOR_PALETTE_HIGHEST_INTENSITIES = 1; /////////////////////////////////////////////////////////////////////////////// +// // DB_DSK_TEXTURE Record - Field Ids // -const unsigned char GEO_DB_TEX_WRAPS = 1; -const unsigned char GEO_DB_TEX_WRAPT = 2; -const unsigned char GEO_DB_TEX_MAGFILTER = 3; -const unsigned char GEO_DB_TEX_MINFILTER = 4; -const unsigned char GEO_DB_TEX_ENV = 5; -const unsigned char GEO_DB_TEX_FILE_NAME = 6; +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_TEX_WRAPS = 1; +const unsigned char GEO_DB_TEX_WRAPT = 2; +const unsigned char GEO_DB_TEX_MAGFILTER = 3; +const unsigned char GEO_DB_TEX_MINFILTER = 4; +const unsigned char GEO_DB_TEX_ENV = 5; +const unsigned char GEO_DB_TEX_FILE_NAME = 6; +const unsigned char GEO_DB_TEX_NAME = 7; +const unsigned char GEO_DB_TEX_CUBE_XP_FILE_NAME = 8; +const unsigned char GEO_DB_TEX_CUBE_XN_FILE_NAME = 9; +const unsigned char GEO_DB_TEX_CUBE_YP_FILE_NAME = 10; +const unsigned char GEO_DB_TEX_CUBE_YN_FILE_NAME = 11; +const unsigned char GEO_DB_TEX_CUBE_ZP_FILE_NAME = 12; +const unsigned char GEO_DB_TEX_CUBE_ZN_FILE_NAME = 13; +const unsigned char GEO_DB_TEX_INTERNAL_FORMAT = 14; +const unsigned char GEO_DB_TEX_ANISOTROPIC_FILTER = 15; + + + /////////////////////////////////////////////////////////////////////////////// -// DB_DSK_VIEW Record - Field Ids Ids // -const unsigned char GEO_DB_VIEW_NEAR = 1; -const unsigned char GEO_DB_VIEW_FAR = 2; -const unsigned char GEO_DB_VIEW_POS = 3; -const unsigned char GEO_DB_VIEW_CEN = 4; -const unsigned char GEO_DB_VIEW_TRACKBALL = 5; +// DB_DSK_VIEW Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_VIEW_NEAR = 1; +const unsigned char GEO_DB_VIEW_FAR = 2; +const unsigned char GEO_DB_VIEW_POS = 3; +const unsigned char GEO_DB_VIEW_CEN = 4; +const unsigned char GEO_DB_VIEW_TRACKBALL = 5; +const unsigned char GEO_DB_VIEW_BACKFACE = 6; +const unsigned char GEO_DB_VIEW_TEXTURE = 7; +const unsigned char GEO_DB_VIEW_ILLUMINATED = 8; +const unsigned char GEO_DB_VIEW_ZBUFFER = 9; +const unsigned char GEO_DB_VIEW_SELECTIVE_ZBUFFER = 10; +const unsigned char GEO_DB_VIEW_DRAWSTYLE = 11; +const unsigned char GEO_DB_VIEW_SELECTIVE_CULLFACE = 12; +const unsigned char GEO_DB_VIEW_SELECTIVE_BLENDING = 13; +const unsigned char GEO_DB_VIEW_SELECTIVE_SHADING = 14; + + + /////////////////////////////////////////////////////////////////////////////// +// // DB_DSK_PERSPECTIVE_GRID_INFO Record +// // DB_DSK_XY_GRID_INFO Record // DB_DSK_XZ_GRID_INFO Record -// DB_DSK_YZ_GRID_INFO Record - Field Ids Ids +// DB_DSK_YZ_GRID_INFO Record - Field Ids // -const unsigned char GEO_DB_GRID_ON = 1; -const unsigned char GEO_DB_GRID_ZBUFFER = 2; -const unsigned char GEO_DB_GRID_SNAP = 3; -const unsigned char GEO_DB_GRID_OVER = 4; -const unsigned char GEO_DB_GRID_MAJOR = 5; -const unsigned char GEO_DB_GRID_MINOR = 6; -const unsigned char GEO_DB_GRID_NUM_CELLS = 7; -const unsigned char GEO_DB_GRID_POS = 8; -const unsigned char GEO_DB_GRID_MATRIX = 9; +/////////////////////////////////////////////////////////////////////////////// + +const unsigned char GEO_DB_GRID_ON = 1; +const unsigned char GEO_DB_GRID_ZBUFFER = 2; +const unsigned char GEO_DB_GRID_SNAP = 3; +const unsigned char GEO_DB_GRID_OVER = 4; +const unsigned char GEO_DB_GRID_MAJOR = 5; +const unsigned char GEO_DB_GRID_MINOR = 6; +const unsigned char GEO_DB_GRID_NUM_CELLS = 7; +const unsigned char GEO_DB_GRID_POS = 8; +const unsigned char GEO_DB_GRID_MATRIX = 9; + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_GROUP Record - Field Ids IDs // -const unsigned char GEO_DB_GRP_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_GRP_BBOX = 2; -const unsigned char GEO_DB_GRP_NAME = 3; -const unsigned char GEO_DB_GRP_INSTANCE_DEF = 4; -const unsigned char GEO_DB_GRP_FLAG_SHOW_BBOX = 5; -const unsigned char GEO_DB_GRP_TRANSFORM = 253; -const unsigned char GEO_DB_GRP_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_GRP_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD - - +// DB_DSK_GROUP Record - Field Ids +// /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_LOD Record - Field Ids IDs -// -const unsigned char GEO_DB_LOD_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_LOD_IN = 2; -const unsigned char GEO_DB_LOD_OUT = 3; -const unsigned char GEO_DB_LOD_CENTER = 4; -const unsigned char GEO_DB_LOD_CALC = 5; // depricated Field only some pre 1.0 databases should have this field -const unsigned char GEO_DB_LOD_NAME = 6; -const unsigned char GEO_DB_LOD_INSTANCE_DEF = 7; -const unsigned char GEO_DB_LOD_FREEZE_CENTER = 8; -const unsigned char GEO_DB_LOD_TRANSFORM = 253; -const unsigned char GEO_DB_LOD_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_LOD_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD + +// All Node Fields + + +const unsigned char GEO_DB_GRP_BBOX = 20; // Group Additions +const unsigned char GEO_DB_GRP_INSTANCE_DEF = 21; +const unsigned char GEO_DB_GRP_FLAG_SHOW_BBOX = 22; +const unsigned char GEO_DB_GRP_ZBUFFER = 23; +const unsigned char GEO_DB_GRP_MATRIX_TRANSFORM = 24; +const unsigned char GEO_DB_GRP_TRANSLATE_TRANSFORM = 25; +const unsigned char GEO_DB_GRP_ROTATE_TRANSFORM = 26; +const unsigned char GEO_DB_GRP_SCALE_TRANSFORM = 27; -/////////////////////////////////////////////////////////////////////////////// -// GEO_DB_SEQUENCE Record - Field Ids IDs -// -const unsigned char GEO_DB_SEQUENCE_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_SEQUENCE_NAME = 2; -const unsigned char GEO_DB_SEQUENCE_MODE = 3; -const unsigned char GEO_DB_SEQUENCE_ACTIVE = 4; -const unsigned char GEO_DB_SEQUENCE_INSTANCE_DEF = 5; -const unsigned char GEO_DB_SEQUENCE_FRAME_TIME = 6; -const unsigned char GEO_DB_SEQUENCE_USE_FRAME_TIME = 7; -const unsigned char GEO_DB_SEQUENCE_TRANSFORM = 253; -const unsigned char GEO_DB_SEQUENCE_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_SEQUENCE_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD - - -/////////////////////////////////////////////////////////////////////////////// -// GEO_DB_INSTANCE Record - Field Ids IDs -// -const unsigned char GEO_DB_INSTANCE_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_INSTANCE_NAME = 2; -const unsigned char GEO_DB_INSTANCE_DEF = 3; -const unsigned char GEO_DB_INSTANCE_TRANSFORM = 253; -const unsigned char GEO_DB_INSTANCE_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_INSTANCE_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD - - -/////////////////////////////////////////////////////////////////////////////// -// GEO_DB_SWITCH Record - Field Ids IDs -// -const unsigned char GEO_DB_SWITCH_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_SWITCH_CURRENT_MASK = 2; -const unsigned char GEO_DB_SWITCH_MASK_WIDTH = 3;// Not used -const unsigned char GEO_DB_SWITCH_NUM_MASKS = 4; -const unsigned char GEO_DB_SWITCH_MASKS = 5; -const unsigned char GEO_DB_SWITCH_NAME = 6; -const unsigned char GEO_DB_SWITCH_INSTANCE_DEF = 7; -const unsigned char GEO_DB_SWITCH_TRANSFORM = 253; -const unsigned char GEO_DB_SWITCH_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_SWITCH_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD - - -/////////////////////////////////////////////////////////////////////////////// -// GEO_DB_PAGE Record - Field Ids IDs -// -const unsigned char GEO_DB_PAGE_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_PAGE_NAME = 2; -const unsigned char GEO_DB_PAGE_ACTIVE_CHILD = 3; -const unsigned char GEO_DB_PAGE_TRANSFORM = 253; -const unsigned char GEO_DB_PAGE_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_PAGE_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_BASE_GROUP Record - Field Ids IDs // +// DB_DSK_CULL_GROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_CULL_GRP_RADIUS = 80; // CullGroup Additions + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// DB_DSK_Z_OFFSET_GROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_Z_GRP_DEPTH_OFFSET = 80; // ZOffsetGroup Additions + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// DB_DSK_MULTI_SAMPLE_AA_GROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_MULTI_SAMPLE_AA_GRP_NUM_SAMPLES = 80; // MultiSampleAAGroup Additions +const unsigned char GEO_DB_MULTI_SAMPLE_AA_GRP_JITTER_RADIUS= 81; +const unsigned char GEO_DB_MULTI_SAMPLE_AA_GRP_ALPHA_CLAMP = 82; + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// DB_DSK_LINE_AA_GROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_LINE_AA_GRP_RANGE = 80; // LineAAGroup Additions +const unsigned char GEO_DB_LINE_AA_GRP_ALPHA_FACTOR = 81; + + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// DB_DSK_FADE_GROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_FADE_GRP_NEAR_RANGE = 80; // FadeGroup Additions +const unsigned char GEO_DB_FADE_GRP_NEAR_TRANSITION = 81; +const unsigned char GEO_DB_FADE_GRP_FAR_RANGE = 82; +const unsigned char GEO_DB_FADE_GRP_FAR_TRANSITION = 83; + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// DB_DSK_TERRAIN Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + + // No Terrain Additions + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// DB_DSK_BSP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_BSP_PLANE_EQUATION = 80; // BSP Additions + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_LOD Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_LOD_IN = 80; // LOD Additions +const unsigned char GEO_DB_LOD_OUT = 81; +const unsigned char GEO_DB_LOD_CENTER = 82; +const unsigned char GEO_DB_LOD_CALC = 83; +const unsigned char GEO_DB_LOD_FREEZE_CENTER = 84; + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_SEQUENCE Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_SEQUENCE_MODE = 80; // Sequence Additions +const unsigned char GEO_DB_SEQUENCE_ACTIVE = 81; +const unsigned char GEO_DB_SEQUENCE_FRAME_TIME = 82; +const unsigned char GEO_DB_SEQUENCE_USE_FRAME_TIME = 83; + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_INSTANCE Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_INSTANCE_DEF = 80; // instance Additions + + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_SWITCH Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_SWITCH_CURRENT_MASK = 80; // switch Additions +const unsigned char GEO_DB_SWITCH_MASK_WIDTH = 81; +const unsigned char GEO_DB_SWITCH_NUM_MASKS = 82; +const unsigned char GEO_DB_SWITCH_MASKS = 83; + + + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_PAGE Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_PAGE_ACTIVE_CHILD = 80; // page Additions + + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_BASE_GROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + // It is important to note that user extended Group fields begin with a field -// ID of 20 (GEO_DB_BASE_GROUP_START_EXTERNAL). This allows Geo to add -// additional fields which will be common to all derived groups up to this -// number -const unsigned char GEO_DB_BASE_GROUP_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_BASE_GROUP_CLASSNAME = 2; -const unsigned char GEO_DB_BASE_GROUP_EXTENDED_TYPE = 3; -const unsigned char GEO_DB_BASE_GROUP_NAME = 4; -const unsigned char GEO_DB_BASE_GROUP_INSTANCE_DEF = 5; -const unsigned char GEO_DB_BASE_GROUP_PLUGIN_REQUIRED=6; -const unsigned char GEO_DB_BASE_GROUP_START_EXTERNAL= 20; -const unsigned char GEO_DB_BASE_GROUP_TRANSFORM = 253; -const unsigned char GEO_DB_BASE_GROUP_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_BASE_GROUP_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +// ID of 140 (GEO_DB_BASE_GROUP_START_EXTERNAL). This allows Geo to add +// additional fields to the BaseGroup class + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_BASE_GROUP_CLASSNAME = 80; // BaseGroup Additions +const unsigned char GEO_DB_BASE_GROUP_EXTENDED_TYPE = 81; +const unsigned char GEO_DB_BASE_GROUP_PLUGIN_REQUIRED = 82; + +const unsigned char GEO_DB_BASE_GROUP_START_EXTERNAL = 140; // User Derived Node Additions + + + + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_BASE_SURFACE Record - Field Ids IDs +// GEO_DB_BASE_SURFACE Record - Field Ids // // It is important to note that user extended Surface fields begin with a field -// ID of 20 (GEO_DB_BASE_SURFACE_START_EXTERNAL). This allows Geo to add +// ID of 80 (GEO_DB_BASE_SURFACE_START_EXTERNAL). This allows Geo to add // additional fields which will be common to all derived groups up to this // number -const unsigned char GEO_DB_BASE_SURFACE_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_BASE_SURFACE_CLASSNAME = 2; -const unsigned char GEO_DB_BASE_SURFACE_EXTENDED_TYPE = 3; -const unsigned char GEO_DB_BASE_SURFACE_NAME = 4; -const unsigned char GEO_DB_BASE_SURFACE_PLUGIN_REQUIRED = 5; -const unsigned char GEO_DB_BASE_SURFACE_START_EXTERNAL = 20; -const unsigned char GEO_DB_BASE_SURFACE_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_BASE_SURFACE_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD - - - -/////////////////////////////////////////////////////////////////////////////// -// GEO_DB_RENDERGROUP Record - Field Ids IDs // -const unsigned char GEO_DB_RENDERGROUP_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_RENDERGROUP_MAT = 2; -const unsigned char GEO_DB_RENDERGROUP_NAME = 3; -const unsigned char GEO_DB_RENDERGROUP_INSTANCE_DEF = 4; -const unsigned char GEO_DB_RENDERGROUP_FLAG_SHOW_BBOX=5; // deprecated in 0.9.9.10 -const unsigned char GEO_DB_RENDERGROUP_IS_TERRAIN =6; -const unsigned char GEO_DB_RENDERGROUP_IS_BILLBOARD =7; -const unsigned char GEO_DB_RENDERGROUP_TRANSFORM = 253; -const unsigned char GEO_DB_RENDERGROUP_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_RENDERGROUP_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +// NOT IMPLEMENTED IN GEO 1.0 +// +/////////////////////////////////////////////////////////////////////////////// + + +// All Node Fields + + +const unsigned char GEO_DB_BASE_SURFACE_CLASSNAME = 20; // BaseSurface Additions +const unsigned char GEO_DB_BASE_SURFACE_EXTENDED_TYPE = 21; +const unsigned char GEO_DB_BASE_SURFACE_PLUGIN_REQUIRED = 22; + +const unsigned char GEO_DB_BASE_SURFACE_START_EXTERNAL = 80; // User Derived Node Additions + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_POLYGON Record - Field Ids IDs // -const unsigned char GEO_DB_POLY_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_POLY_NORMAL = 2; -const unsigned char GEO_DB_POLY_CENTER = 3; -const unsigned char GEO_DB_POLY_PACKED_COLOR = 4; -const unsigned char GEO_DB_POLY_TEX = 5; -const unsigned char GEO_DB_POLY_NAME = 6; -const unsigned char GEO_DB_POLY_DSTYLE = 7; -const unsigned char GEO_DB_POLY_SHADEMODEL = 8; -const unsigned char GEO_DB_POLY_USE_MATERIAL_DIFFUSE= 9; -const unsigned char GEO_DB_POLY_USE_VERTEX_COLORS = 10; -const unsigned char GEO_DB_POLY_COLOR_INDEX = 11; -const unsigned char GEO_DB_POLY_PT_SIZE = 12; -const unsigned char GEO_DB_POLY_LINE_WIDTH = 13; -const unsigned char GEO_DB_POLY_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_POLY_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +// GEO_DB_RENDERGROUP Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_RENDERGROUP_MAT = 80; // RenderGroup Additions +const unsigned char GEO_DB_RENDERGROUP_TERRAIN = 81; +const unsigned char GEO_DB_RENDERGROUP_BILLBOARD = 82; +const unsigned char GEO_DB_RENDERGROUP_LIGHTING = 83; +const unsigned char GEO_DB_RENDERGROUP_FOG = 84; +const unsigned char GEO_DB_RENDERGROUP_GAIN = 85; +const unsigned char GEO_DB_RENDERGROUP_TRANSPARENCY = 86; +const unsigned char GEO_DB_RENDERGROUP_CULLING = 87; +const unsigned char GEO_DB_RENDERGROUP_BLENDING = 88; +const unsigned char GEO_DB_RENDERGROUP_ALPHA_REF = 89; + + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_MULTI_TEX_SHADER Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + +// All RenderGroup Fields + + +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX0 = 140; // MultiTexShader Additions +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX1 = 141; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX2 = 142; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX3 = 143; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX4 = 144; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX5 = 145; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX6 = 146; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX7 = 147; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX0_FUNCTION = 148; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX1_FUNCTION = 149; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX2_FUNCTION = 150; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX3_FUNCTION = 151; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX4_FUNCTION = 152; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX5_FUNCTION = 153; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX6_FUNCTION = 154; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX7_FUNCTION = 155; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX0_BLEND_COLOR= 156; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX1_BLEND_COLOR= 157; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX2_BLEND_COLOR= 158; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX3_BLEND_COLOR= 159; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX4_BLEND_COLOR= 160; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX5_BLEND_COLOR= 161; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX6_BLEND_COLOR= 162; +const unsigned char GEO_DB_MULTI_TEX_SHADER_TEX7_BLEND_COLOR= 163; + + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO_DB_POLYGON Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + + +const unsigned char GEO_DB_POLY_NORMAL = 20; // Polygon Additions +const unsigned char GEO_DB_POLY_CENTER = 21; +const unsigned char GEO_DB_POLY_PACKED_COLOR = 22; +const unsigned char GEO_DB_POLY_DSTYLE = 23; +const unsigned char GEO_DB_POLY_SHADEMODEL = 24; +const unsigned char GEO_DB_POLY_USE_MATERIAL_DIFFUSE = 25; +const unsigned char GEO_DB_POLY_USE_VERTEX_COLORS = 26; +const unsigned char GEO_DB_POLY_COLOR_INDEX = 27; +const unsigned char GEO_DB_POLY_PT_SIZE = 28; +const unsigned char GEO_DB_POLY_LINE_WIDTH = 29; +const unsigned char GEO_DB_POLY_TEX0 = 30; +const unsigned char GEO_DB_POLY_TEX1 = 31; +const unsigned char GEO_DB_POLY_TEX2 = 32; +const unsigned char GEO_DB_POLY_TEX3 = 33; +const unsigned char GEO_DB_POLY_TEX4 = 34; +const unsigned char GEO_DB_POLY_TEX5 = 35; +const unsigned char GEO_DB_POLY_TEX6 = 36; +const unsigned char GEO_DB_POLY_TEX7 = 37; +const unsigned char GEO_DB_POLY_TEX0_FUNCTION = 38; +const unsigned char GEO_DB_POLY_TEX1_FUNCTION = 39; +const unsigned char GEO_DB_POLY_TEX2_FUNCTION = 40; +const unsigned char GEO_DB_POLY_TEX3_FUNCTION = 41; +const unsigned char GEO_DB_POLY_TEX4_FUNCTION = 42; +const unsigned char GEO_DB_POLY_TEX5_FUNCTION = 43; +const unsigned char GEO_DB_POLY_TEX6_FUNCTION = 44; +const unsigned char GEO_DB_POLY_TEX7_FUNCTION = 45; +const unsigned char GEO_DB_POLY_TEX0_BLEND_COLOR = 46; +const unsigned char GEO_DB_POLY_TEX1_BLEND_COLOR = 47; +const unsigned char GEO_DB_POLY_TEX2_BLEND_COLOR = 48; +const unsigned char GEO_DB_POLY_TEX3_BLEND_COLOR = 49; +const unsigned char GEO_DB_POLY_TEX4_BLEND_COLOR = 50; +const unsigned char GEO_DB_POLY_TEX5_BLEND_COLOR = 51; +const unsigned char GEO_DB_POLY_TEX6_BLEND_COLOR = 52; +const unsigned char GEO_DB_POLY_TEX7_BLEND_COLOR = 53; +const unsigned char GEO_DB_POLY_WHITE_IF_TEXTURED = 54; +const unsigned char GEO_DB_POLY_BASE = 55; +const unsigned char GEO_DB_POLY_DECAL = 56; +const unsigned char GEO_DB_POLY_HIDDEN = 57; + /////////////////////////////////////////////////////////////////// +// // DB_DSK_PLANE_TEXTURE_MAPPING_INFO Record Field Ids +// /////////////////////////////////////////////////////////////////// + const unsigned char GEO_DB_PLANE_TEXTURE_MAPPING_INFO_ORIGIN_PT = 1; const unsigned char GEO_DB_PLANE_TEXTURE_MAPPING_INFO_U_AXIS_PT = 2; const unsigned char GEO_DB_PLANE_TEXTURE_MAPPING_INFO_V_AXIS_PT = 3; +const unsigned char GEO_DB_PLANE_TEXTURE_MAPPING_INFO_TEXTURE_UNIT = 4; + + + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_LIGHTPT Record - Field Ids IDs // -const unsigned char GEO_DB_LIGHTPT_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_LIGHTPT_TYPE = 2; -const unsigned char GEO_DB_LIGHTPT_DIRECTION_VECTOR = 3; -const unsigned char GEO_DB_LIGHTPT_PACKED_COLOR = 4; -const unsigned char GEO_DB_LIGHTPT_BACK_PACKED_COLOR= 5; -const unsigned char GEO_DB_LIGHTPT_MIN_PIXEL_SIZE = 6; -const unsigned char GEO_DB_LIGHTPT_MAX_PIXEL_SIZE = 7; -const unsigned char GEO_DB_LIGHTPT_HORIZ_LOBE_ANGLE = 8; -const unsigned char GEO_DB_LIGHTPT_VERT_LOBE_ANGLE = 9; -const unsigned char GEO_DB_LIGHTPT_DAY_DISPLAY = 10; -const unsigned char GEO_DB_LIGHTPT_DUSK_DISPLAY = 11; -const unsigned char GEO_DB_LIGHTPT_NIGHT_DISPLAY = 12; -const unsigned char GEO_DB_LIGHTPT_NAME = 13; -const unsigned char GEO_DB_LIGHTPT_COLOR_INDEX = 14; -const unsigned char GEO_DB_LIGHTPT_BACK_COLOR_INDEX = 15; -const unsigned char GEO_DB_LIGHTPT_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_LIGHTPT_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +// GEO_DB_LIGHTPT Record - Field Ids +// +// Many of the possible LightPt fields do not make sense in the context of a +// Light point - namely most of the Polygon rendering & texturing properties. +// These will likely not be present in a Geo file - if they are they can be +// ignored. +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Poly Fields + + +const unsigned char GEO_DB_LIGHTPT_TYPE = 80; // LightPt Additions +const unsigned char GEO_DB_LIGHTPT_DIRECTION_VECTOR = 81; +const unsigned char GEO_DB_LIGHTPT_BACK_PACKED_COLOR = 82; +const unsigned char GEO_DB_LIGHTPT_MIN_PIXEL_SIZE = 83; +const unsigned char GEO_DB_LIGHTPT_MAX_PIXEL_SIZE = 84; +const unsigned char GEO_DB_LIGHTPT_HORIZ_LOBE_ANGLE = 85; +const unsigned char GEO_DB_LIGHTPT_VERT_LOBE_ANGLE = 86; +const unsigned char GEO_DB_LIGHTPT_DAY_DISPLAY = 87; +const unsigned char GEO_DB_LIGHTPT_DUSK_DISPLAY = 88; +const unsigned char GEO_DB_LIGHTPT_NIGHT_DISPLAY = 89; +const unsigned char GEO_DB_LIGHTPT_BACK_COLOR_INDEX = 90; +const unsigned char GEO_DB_LIGHTPT_SPECIAL_FX = 91; +const unsigned char GEO_DB_LIGHTPT_STROBE_FRAME_COUNT = 92; +const unsigned char GEO_DB_LIGHTPT_STROBE_ACTUAL_COUNT = 93; + + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_TEXT Record - Field Ids IDs // -const unsigned char GEO_DB_TEXT_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_TEXT_NAME = 2; -const unsigned char GEO_DB_TEXT_TYPE = 3; -const unsigned char GEO_DB_TEXT_STRING = 4; -const unsigned char GEO_DB_TEXT_JUSTIFICATION = 5; -const unsigned char GEO_DB_TEXT_DIRECTION = 6; -const unsigned char GEO_DB_TEXT_LINEWIDTH = 7; -const unsigned char GEO_DB_TEXT_PACKED_COLOR = 8; -const unsigned char GEO_DB_TEXT_SCALE_X = 9; -const unsigned char GEO_DB_TEXT_SCALE_Y = 10; -const unsigned char GEO_DB_TEXT_MATRIX = 11; -const unsigned char GEO_DB_TEXT_EXPANSION = 12; -const unsigned char GEO_DB_TEXT_COLOR_INDEX = 13; -const unsigned char GEO_DB_TEXT_FONT = 14; -const unsigned char GEO_DB_TEXT_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_TEXT_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD - +// GEO_DB_TEXT Record - Field Ids +// /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_IMAGE Record - Field Ids IDs - Not Yet Implemented -// -const unsigned char GEO_DB_IMAGE_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_IMAGE_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_IMAGE_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD + +// All Node Fields + + +const unsigned char GEO_DB_TEXT_TYPE = 20; // Text Additions +const unsigned char GEO_DB_TEXT_STRING = 21; +const unsigned char GEO_DB_TEXT_JUSTIFICATION = 22; +const unsigned char GEO_DB_TEXT_DIRECTION = 23; +const unsigned char GEO_DB_TEXT_LINEWIDTH = 24; +const unsigned char GEO_DB_TEXT_PACKED_COLOR = 25; +const unsigned char GEO_DB_TEXT_SCALE_X = 26; +const unsigned char GEO_DB_TEXT_SCALE_Y = 27; +const unsigned char GEO_DB_TEXT_MATRIX = 28; +const unsigned char GEO_DB_TEXT_EXPANSION = 29; +const unsigned char GEO_DB_TEXT_COLOR_INDEX = 30; +const unsigned char GEO_DB_TEXT_FONT = 31; + + + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_MESH Record - Field Ids IDs - Not Yet Implemented // -const unsigned char GEO_DB_MESH_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_MESH_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_MESH_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +// GEO_DB_MESH Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Poly Fields + + +const unsigned char GEO_DB_MESH_TYPE = 80; // Mesh Additions + + + + + + /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_VERTEX Record - Field Ids IDs // -const unsigned char GEO_DB_VRTX_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_VRTX_COORD = 2; -const unsigned char GEO_DB_VRTX_UV_SET_1 = 3; +// GEO_DB_VERTEX Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + + +const unsigned char GEO_DB_VRTX_COORD_INDEX = 20; // Vertex Additions +const unsigned char GEO_DB_VRTX_UV_SET_0 = 21; +const unsigned char GEO_DB_VRTX_UV_SET_1 = 22; +const unsigned char GEO_DB_VRTX_UV_SET_2 = 23; +const unsigned char GEO_DB_VRTX_UV_SET_3 = 24; +const unsigned char GEO_DB_VRTX_UV_SET_4 = 25; +const unsigned char GEO_DB_VRTX_UV_SET_5 = 26; +const unsigned char GEO_DB_VRTX_UV_SET_6 = 27; +const unsigned char GEO_DB_VRTX_UV_SET_7 = 28; +const unsigned char GEO_DB_VRTX_NORMAL = 29; +const unsigned char GEO_DB_VRTX_PACKED_COLOR = 30; +const unsigned char GEO_DB_VRTX_COLOR_INDEX = 31; +const unsigned char GEO_DB_VRTX_COORD = 32; +const unsigned char GEO_DB_VRTX_HARD_EDGE = 33; +const unsigned char GEO_DB_VRTX_FREEZE_NORMAL = 34; + + -const unsigned char GEO_DB_VRTX_UV_SET_2 = 4; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_UV_SET_3 = 5; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_UV_SET_4 = 6; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_UV_SET_5 = 7; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_UV_SET_6 = 8; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_UV_SET_7 = 9; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_UV_SET_8 = 10; // Unused - Possible Future expansion -const unsigned char GEO_DB_VRTX_NORMAL = 11; -const unsigned char GEO_DB_VRTX_PACKED_COLOR = 12; -const unsigned char GEO_DB_VRTX_COLOR_INDEX = 13; -const unsigned char GEO_DB_VRTX_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_VRTX_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD /////////////////////////////////////////////////////////////////////////////// -// GEO_DB_EXTERNAL Record - Field Ids IDs // -const unsigned char GEO_DB_EXTERNAL_EXT = 1; // alias for GEO_DB_USER_EXT_VALUE_FIELD -const unsigned char GEO_DB_EXTERNAL_NAME = 2; -const unsigned char GEO_DB_EXTERNAL_INSTANCE_DEF = 3; -const unsigned char GEO_DB_EXTERNAL_FILENAME = 4; -const unsigned char GEO_DB_EXTERNAL_TRANSFORM = 253; -const unsigned char GEO_DB_EXTERNAL_EXTENDED = 254; // alias for GEO_DB_EXTENDED_FIELD -const unsigned char GEO_DB_EXTERNAL_COMMENT = 255; // alias for GEO_DB_COMMENT_FIELD +// GEO_DB_EXTERNAL Record - Field Ids +// +/////////////////////////////////////////////////////////////////////////////// + +// All Node Fields + +// All Group Fields + + +const unsigned char GEO_DB_EXTERNAL_FILENAME = 80; // External Additions + + + + + + +/////////////////////////////////////////////////////////////////////////////// +// +// GEO BEHAVIOR & ARTICULATION SYSTEM RECORDS +// +/////////////////////////////////////////////////////////////////////////////// @@ -1064,14 +1474,14 @@ struct GEO_DB_API geoExtensionDefRec /** The Node type for which this extension exists */ unsigned int nodetype; // 4 bytes - /** The data type of the extension - defined in terms of GEO_DB_EXT_INT - * GEO_DB_EXT_FLOAT, GEO_DB_EXT_BOOL etc. + /** The data type of the extension - defined in terms of GEO_DB_DATATYPE_INT + * GEO_DB_DATATYPE_FLOAT, GEO_DB_DATATYPE_BOOL etc. */ unsigned char datatype; // 1 byte /** The extension can have a special "sub type" value. This could be * values like GEO_DB_EXT_MENU_ITEM which (when associated with a datatype - * of GEO_DB_EXT_BOOL means that this extension will be accessed as one + * of GEO_DB_DATATYPE_BOOL means that this extension will be accessed as one * of many in an option menu */ unsigned char subdatatype; // 1 bytes @@ -1088,7 +1498,7 @@ struct GEO_DB_API geoExtensionDefRec * label length that can be accomodated. The name field is also used to * encode the name/label of the option menu when the extension is flagged * as one of those. The following rules should be taken into consideration: - * 1. When the extension is an option menu (datatype=GEO_DB_EXT_BOOL + * 1. When the extension is an option menu (datatype=GEO_DB_DATATYPE_BOOL * and subdatatype=GEO_DB_EXT_MENU_ITEM) then the name field is * divided up as 15 chars for the option menu title, 8 chars for * this particular option menu's label and 1 char for the terminator @@ -1104,20 +1514,5 @@ struct GEO_DB_API geoExtensionDefRec - -/////////////////////////////////////////////////////////////////// -// Utility Parse/Read/Write Functions -// -GEO_DB_API int geoIgnoreField(FILE* fp,geoFieldHeader field); -GEO_DB_API int geoIgnoreFields(FILE* fp); -GEO_DB_API int geoWriteString(FILE*,int, char*); -GEO_DB_API int geoWriteString(FILE* fp,char* string); -GEO_DB_API char* geoGetWritableString(char* string,int* num_chars); -GEO_DB_API char* geoReadString(FILE*,geoFieldHeader); -GEO_DB_API char* geoReadString(FILE*,int); -GEO_DB_API int geoIgnoreDataItems(FILE* fp, int type,int num ); -GEO_DB_API int geoGetSizeOfFormatDataType(int type); - - #endif // __GEO_FORMAT_H__ diff --git a/src/osgPlugins/geo/geoTypes.h b/src/osgPlugins/geo/geoTypes.h index b967b1685..130bc3fa2 100644 --- a/src/osgPlugins/geo/geoTypes.h +++ b/src/osgPlugins/geo/geoTypes.h @@ -45,7 +45,7 @@ COPYRIGHT NOTICE: #endif #ifndef ushort -//#define ushort unsigned short +#define ushort unsigned short #endif #ifndef ubyte @@ -65,7 +65,9 @@ const uint GEO_PLUGIN_TYPE_IMAGE_IMPORTER = 4; const uint GEO_PLUGIN_TYPE_TOOL = 5; const uint GEO_PLUGIN_TYPE_BEHAVIOR = 6; const uint GEO_PLUGIN_TYPE_GROUP_NODE_DEF = 7; -const uint GEO_PLUGIN_TYPE_LAST = GEO_PLUGIN_TYPE_GROUP_NODE_DEF; +const uint GEO_PLUGIN_TYPE_SURFACE_NODE_DEF = 8; +const uint GEO_PLUGIN_TYPE_TASK = 9; +const uint GEO_PLUGIN_TYPE_LAST = GEO_PLUGIN_TYPE_TASK; @@ -104,62 +106,86 @@ const uint GEO_TOOL_TYPE_LAST = GEO_TOOL_TYPE_OPTIMIZE; * * GEO_DB_BASE * GEO_DB_GROUP - * GEO_DB_BILLBOARD * GEO_DB_SEQUENCE * GEO_DB_LOD * GEO_DB_SWITCH - * GEO_DB_RENDERGROUP * GEO_DB_BASE_GROUP + * GEO_DB_RENDERGROUP + * GEO_DB_MULTI_TEX_SHADER + * GEO_DB_BASE_RENDERGROUP (*) * GEO_DB_EXTERNAL * GEO_DB_INSTANCE * GEO_DB_PAGE - * GEO_DB_TRANSFORM (*) + * GEO_DB_CULL_GROUP + * GEO_DB_Z_OFFSET_GROUP + * GEO_DB_MULTI_SAMPLE_AA_GROUP + * GEO_DB_LINE_AA_GROUP + * GEO_DB_FADE_GROUP + * GEO_DB_TERRAIN + * GEO_DB_BSP * GEO_DB_GEOMETRY * GEO_DB_SURFACE - * GEO_DB_COORDINATE_SURFACE - * GEO_DB_POLYGON - * GEO_DB_LIGHTPT - * GEO_DB_MESH (*) - * GEO_DB_PARAMETRIC_SURFACE (*) - * GEO_DB_QUADRIC (*) - * GEO_DB_TEXT + * GEO_DB_POLYGON + * GEO_DB_LIGHTPT + * GEO_DB_MESH * GEO_DB_BASE_SURFACE (*) + * GEO_DB_TEXT * GEO_DB_VERTEX * GEO_DB_HEADER * * (*) Not available in Geo Version 1.0 */ + + +//------------ +// const uint GEO_DB_BASE = 0x00000003; const uint GEO_DB_GROUP = (0x00000004 | GEO_DB_BASE); +const uint GEO_DB_TERRAIN = (0x00000008 | GEO_DB_GROUP); +//------------ const uint GEO_DB_SEQUENCE = (0x00000010 | GEO_DB_GROUP); const uint GEO_DB_LOD = (0x00000020 | GEO_DB_GROUP); const uint GEO_DB_SWITCH = (0x00000040 | GEO_DB_GROUP); const uint GEO_DB_RENDERGROUP = (0x00000080 | GEO_DB_GROUP); +//------------ const uint GEO_DB_GEOMETRY = (0x00000100 | GEO_DB_BASE); const uint GEO_DB_SURFACE = (0x00000200 | GEO_DB_GEOMETRY); -const uint GEO_DB_COORDINATE_SURFACE = (0x00000400 | GEO_DB_SURFACE); -const uint GEO_DB_POLYGON = (0x00000800 | GEO_DB_COORDINATE_SURFACE); +const uint GEO_DB_BSP = (0x00000400 | GEO_DB_GROUP); +const uint GEO_DB_POLYGON = (0x00000800 | GEO_DB_SURFACE); +//------------ const uint GEO_DB_MESH = (0x00001000 | GEO_DB_POLYGON); -const uint GEO_DB_PARAMETRIC_SURFACE = (0x00002000 | GEO_DB_SURFACE); -const uint GEO_DB_QUADRIC = (0x00004000 | GEO_DB_PARAMETRIC_SURFACE); +const uint GEO_DB_CULL_GROUP = (0x00002000 | GEO_DB_GROUP); +const uint GEO_DB_MULTI_TEX_SHADER = (0x00004000 | GEO_DB_RENDERGROUP); const uint GEO_DB_PAGE = (0x00008000 | GEO_DB_GROUP); -const uint GEO_DB_TEXT = (0x00040000 | GEO_DB_SURFACE); +//------------ +const uint GEO_DB_Z_OFFSET_GROUP = (0x00010000 | GEO_DB_GROUP); +const uint GEO_DB_MULTI_SAMPLE_AA_GROUP = (0x00020000 | GEO_DB_GROUP); +const uint GEO_DB_TEXT = (0x00040000 | GEO_DB_GEOMETRY); const uint GEO_DB_VERTEX = (0x00080000 | GEO_DB_GEOMETRY); +//------------ const uint GEO_DB_HEADER = (0x00100000 | GEO_DB_BASE); -const uint GEO_DB_TRANSFORM = (0x00200000 | GEO_DB_GROUP); +const uint GEO_DB_LINE_AA_GROUP = (0x00200000 | GEO_DB_GROUP); const uint GEO_DB_BASE_GROUP = (0x00400000 | GEO_DB_GROUP); const uint GEO_DB_BASE_SURFACE = (0x00800000 | GEO_DB_SURFACE); -const uint GEO_DB_EXTERNAL = (0x01000000 | GEO_DB_GROUP); +//------------ +const uint GEO_DB_EXTERNAL = (0x01000000 | GEO_DB_GROUP); +const uint GEO_DB_BASE_RENDERGROUP = (0x02000000 | GEO_DB_RENDERGROUP); const uint GEO_DB_INSTANCE = (0x04000000 | GEO_DB_GROUP); const uint GEO_DB_LIGHTPT = (0x08000000 | GEO_DB_POLYGON); +//------------ +const uint GEO_DB_FADE_GROUP = (0x10000000 | GEO_DB_GROUP); +// +// +// +//------------ + // older version types for Compatability & convenience // const uint GEO_DB_ALL = GEO_DB_BASE; -const uint GEO_DB_ALL_GROUP_TYPES = GEO_DB_GROUP; +const uint GEO_DB_ALL_GROUP_TYPES = GEO_DB_GROUP; +const uint GEO_DB_ALL_GEOMETRY_TYPES = GEO_DB_GEOMETRY; const uint GEO_DB_ALL_SURFACE_TYPES = GEO_DB_SURFACE; -const uint GEO_DB_ALL_SHAPE_TYPES = GEO_DB_PARAMETRIC_SURFACE; -const uint GEO_DB_ALL_GEOMETRY_TYPES = GEO_DB_GEOMETRY; @@ -169,10 +195,10 @@ const uint GEO_DB_ALL_GEOMETRY_TYPES = GEO_DB_GEOMETRY; const uint GEO_PICK_GROUP = 0x00000001; const uint GEO_PICK_PRIM = 0x00000002; const uint GEO_PICK_VERTEX = 0x00000004; -const uint GEO_PICK_EDGE = 0x00000008; // Future const uint GEO_PICK_GRID = 0x00000010; const uint GEO_PICK_NON_NODE = 0x00000020; // manipulators, user geometry etc. const uint GEO_PICK_EXTERNAL = 0x00000040; +const uint GEO_PICK_TEXT = 0x00000080; @@ -187,6 +213,46 @@ const uint GEO_LEFT_AND_RIGHT_MOUSE = 0x00000008; const uint GEO_MIDDLE_AND_RIGHT_MOUSE = 0x00000010; +/////////////////////////////////////////////////////////////////// +// PROPERTY TYPES +/////////////////////////////////////////////////////////////////// + +// Identifiers for Geo data types - Used in geoProperty & geoPropertyExtension Classes +const unsigned char GEO_DB_DATATYPE_STRING = 1; +const unsigned char GEO_DB_DATATYPE_SHORT = 2; +const unsigned char GEO_DB_DATATYPE_INT = 3; +const unsigned char GEO_DB_DATATYPE_FLOAT = 4; +const unsigned char GEO_DB_DATATYPE_LONG = 5; +const unsigned char GEO_DB_DATATYPE_DOUBLE = 6; +const unsigned char GEO_DB_DATATYPE_BOOL = 28; + +/////////////////////////////////////////////////////////////////// +// VARIABLE TYPES +/////////////////////////////////////////////////////////////////// + +const uint GEO_VAR_TYPE_FLOAT = 1; +const uint GEO_VAR_TYPE_INT = 2; +const uint GEO_VAR_TYPE_LONG = 3; +const uint GEO_VAR_TYPE_DOUBLE = 4; +const uint GEO_VAR_TYPE_BOOL = 5; +const uint GEO_VAR_TYPE_2FV = 6; +const uint GEO_VAR_TYPE_3FV = 7; +const uint GEO_VAR_TYPE_4FV = 8; +const uint GEO_VAR_TYPE_STRING = 9; +const uint GEO_VAR_TYPE_2IV = 10; +const uint GEO_VAR_TYPE_3IV = 11; +const uint GEO_VAR_TYPE_4IV = 12; + + + +/////////////////////////////////////////////////////////////////// +// TRANSFORM TYPES +/////////////////////////////////////////////////////////////////// + +const uint GEO_TRANSFORM_TYPE_TRANSLATE = 1; +const uint GEO_TRANSFORM_TYPE_ROTATE = 2; +const uint GEO_TRANSFORM_TYPE_SCALE = 3; +const uint GEO_TRANSFORM_TYPE_MATRIX = 4; @@ -225,19 +291,27 @@ const int GEO_DB_UP_AXIS_Z = 3; */ const uint GEO_DB_SOLID = 0x00000001; const uint GEO_DB_WIRE = 0x00000002; -const uint GEO_DB_OUTLINED = 0x00000008; +const uint GEO_DB_OUTLINED = (GEO_DB_SOLID | GEO_DB_WIRE); +const uint GEO_DB_WIRE_ON_MOVE = 0x00000004; +const uint GEO_DB_DETEXTURE_ON_MOVE = 0x00000008; + +const uint GEO_DB_SHRINK = 0x00000080; const uint GEO_DB_ZBUFFER = 0x00000100; const uint GEO_DB_BACKFACE = 0x00000400; +const uint GEO_DB_SELECTIVE_CULLFACE = 0x00000800; const uint GEO_DB_DRAW_FACE_NORMALS = 0x00001000; const uint GEO_DB_DRAW_VERTEX_NORMALS = 0x00002000; +const uint GEO_DB_SELECTIVE_BLENDING = 0x00008000; const uint GEO_DB_TEXTURE = 0x00010000; const uint GEO_DB_HIGHLIGHT = 0x00020000; const uint GEO_DB_PICKING = 0x00040000; const uint GEO_DB_HIGHLIGHT_DASHED = 0x00080000; +const uint GEO_DB_SELECTIVE_SHADING = 0x00100000; + const uint GEO_DB_ILLUMINATED = 0x01000000; const uint GEO_DB_NORMAL_PER_PRIM = 0x04000000; const uint GEO_DB_NORMAL_PER_VERTEX = 0x08000000; @@ -246,10 +320,24 @@ const uint GEO_DB_COLOR_PER_GEODE = 0x10000000; const uint GEO_DB_COLOR_PER_PRIM = 0x20000000; const uint GEO_DB_COLOR_PER_VERTEX = 0x40000000; +const uint GEO_DB_SELECTIVE_ZBUFFER = 0x80000000; + +/////////////////////////////////////////////////////////////////////////////// +/** constants to identify the different Group types +*/ +const uint GEO_GROUP_TYPE_CONTAINER = 1; +const uint GEO_GROUP_TYPE_CULL = 2; +const uint GEO_GROUP_TYPE_Z_OFFSET = 3; +const uint GEO_GROUP_TYPE_MULTI_SAMPLE_AA = 4; +const uint GEO_GROUP_TYPE_LINE_AA = 5; +const uint GEO_GROUP_TYPE_FADE = 6; +const uint GEO_GROUP_TYPE_TERRAIN = 7; + + /////////////////////////////////////////////////////////////////////////////// /** Constants to control the switch Node behavior * @@ -265,14 +353,16 @@ const uint GEO_SWITCH_TYPE_SELECTIVE = 2; /////////////////////////////////////////////////////////////////////////////// -/** Type Tokens for Node & Tool Gui Widgets */ +/** Type Tokens for Node & Tool Gui Widgets +*/ const int GUI_FLOAT = 1; const int GUI_INT = 2; const int GUI_STRING = 3; /////////////////////////////////////////////////////////////////////////////// -/** geoWidget Typedef - Used by Node & Tool Gui Widgets */ +/** geoWidget Typedef - Used by Node & Tool Gui Widgets +*/ typedef void geoWidget; @@ -314,6 +404,19 @@ const int GEO_POLY_SPHERICAL_MAP = 2; +/////////////////////////////////////////////////////////////////////////////// +// Texture Unit Functions - used in Polys, meshes & multi-tex shaders +// + +const int GEO_DB_TEXTURE_UNIT_FUNC_AS_DEFINED = 0; +const int GEO_DB_TEXTURE_UNIT_FUNC_MODULATE = 1; +const int GEO_DB_TEXTURE_UNIT_FUNC_DECAL = 2; +const int GEO_DB_TEXTURE_UNIT_FUNC_BLEND = 3; +const int GEO_DB_TEXTURE_UNIT_FUNC_REPLACE = 4; +const int GEO_DB_TEXTURE_UNIT_FUNC_COMBINE = 5; + + + /////////////////////////////////////////////////////////////////////////////// // STring type constants // @@ -370,8 +473,15 @@ const unsigned GEO_DB_TEX_LINEAR_MIPMAP_LINEAR = 0x00000020; const unsigned GEO_DB_TEX_MODULATE = 0x00000001; const unsigned GEO_DB_TEX_DECAL = 0x00000002; const unsigned GEO_DB_TEX_BLEND = 0x00000004; +const unsigned GEO_DB_TEX_REPLACE = 0x00000008; +/////////////////////////////////////////////////////////////////////////////// +// Header Vertex Table Usage +const unsigned GEO_DB_USES_PRIVATE_DATA = 0x00000000; +const unsigned GEO_DB_USES_SHARED_TABLE_DATA = 0x00000001; +const unsigned GEO_DB_USES_UNSHARED_TABLE_DATA = 0x00000002; + #endif //_GEO_TYPES_H_ diff --git a/src/osgPlugins/geo/osgGeoAction.h b/src/osgPlugins/geo/osgGeoAction.h index 0a1e61c9f..bb964ef2d 100644 --- a/src/osgPlugins/geo/osgGeoAction.h +++ b/src/osgPlugins/geo/osgGeoAction.h @@ -4,7 +4,6 @@ #define _GEO_ACTIONS_H_ using namespace osg; -using namespace osgDB; class georecord; // You don't need to know how I read a geo record, // but objects of this class are passed to some of the parsing routines. @@ -37,7 +36,7 @@ public: virtual void setInVar(const double *indvar) {in=indvar;} virtual void setOutVar(double *outdvar) {out=outdvar;} virtual void doaction(osg::Node *)=0; // do math operation eg *out=*in or =f(*in). - virtual bool makeBehave(const georecord* /*grec*/, const geoHeaderGeo* /*theHeader*/) { return true;}; // pure virtual + virtual bool makeBehave(const georecord* , const geoHeaderGeo* ) { return true;}; // pure virtual protected: const double *in; // address of input variable double *out; // address of output diff --git a/src/osgPlugins/geo/osgGeoStructs.h b/src/osgPlugins/geo/osgGeoStructs.h index 01c0849d3..c72ee5a83 100644 --- a/src/osgPlugins/geo/osgGeoStructs.h +++ b/src/osgPlugins/geo/osgGeoStructs.h @@ -132,8 +132,41 @@ public: break; } } +//<<<<<<< osgGeoStructs.h + + void set(unsigned short id,unsigned int fid) { // to set values + TypeId=DB_UINT; + tokenId=id; + storeSize=SIZEOF_UINT; + numItems=1; + storage=new unsigned char[SIZEOF_UINT]; + memcpy(storage,&fid,SIZEOF_UINT); + } + void set(unsigned short id,float *cen,const int nsize) { // to set values +//set(GEO_DB_ROTATE_ACTION_ORIGIN,ct,3); + if (nsize==3) { + TypeId=DB_VEC3F; + tokenId=id; + storeSize=SIZEOF_VEC3F; + } else if (nsize==2) { + TypeId=DB_VEC2F; + tokenId=id; + storeSize=SIZEOF_VEC2F; + } else if (nsize==4) { + TypeId=DB_VEC4F; + tokenId=id; + storeSize=SIZEOF_VEC4F; + } + numItems=1; + storage=new unsigned char[storeSize]; + memcpy(storage,cen,storeSize); + } + void readfile(std::ifstream &fin, const unsigned int id); // is part of a record id + void parseExt(std::ifstream &fin) const; // Feb 2003 parse node extension fields +/*======= void readfile(std::ifstream &fin, const uint id); // is part of a record id void parseExt(std::ifstream &fin) const; // Feb 2003 parse node extension fields +//>>>>>>> 1.10 */ void writefile(std::ofstream &fout) { // write binary file if (numItems<32767 && tokenId<256) { unsigned char tokid=tokenId, type=TypeId; @@ -153,7 +186,7 @@ public: if (TypeId==DB_VEC3F) { // already uncompressed } else { float *norms=new float[numItems*SIZEOF_VEC3F]; // uncompressed size - for (uint i=0; i instancelist; // list if unused instance matrices + typedef std::vector > instancelist; // list 0f unused instance matrices void addInstance(osg::MatrixTransform *mtr) { mtrlist.push_back(mtr);} inline void setNode(osg::Node *n) { nod=n; @@ -372,12 +405,12 @@ public: for (instancelist::iterator itr=mtrlist.begin(); itr!=mtrlist.end(); ++itr) { - (*itr)->addChild(nod); + (*itr).get()->addChild(nod.get()); } mtrlist.clear(); } } - inline osg::Node *getNode() const { return nod;} + inline osg::Node *getNode() { return nod.get();} inline void setparent(georecord *p) { parent=p;} inline class georecord *getparent() const { return parent;} inline std::vector getchildren(void) const { return children;} @@ -481,7 +514,8 @@ public: // case DB_DSK_BILLBOARD: output << "Billboard" << std::endl; break; case DB_DSK_SEQUENCE: output << "Sequence" << std::endl; break; case DB_DSK_LOD: output << "LOD" << std::endl; break; - case DB_DSK_GEODE: output << "Geode" << std::endl; break; + // case DB_DSK_GEODE: output << "Geode" << std::endl; break; + case DB_DSK_RENDERGROUP: output << "Rendergroup Geode" << std::endl; break; case DB_DSK_POLYGON: output << "Polygon" << std::endl; break; case DB_DSK_MESH: output << "Mesh" << std::endl; break; case DB_DSK_CUBE: output << "Cube" << std::endl; break; @@ -515,6 +549,7 @@ public: case DB_DSK_ROTATE_ACTION: output << "rotate action" << std::endl; break; case DB_DSK_TRANSLATE_ACTION: output << "translate action" << std::endl; break; case DB_DSK_SCALE_ACTION: output << "scale action" << std::endl; break; + case DB_DSK_DCS_ACTION: output << "DCS action" << std::endl; break; case DB_DSK_ARITHMETIC_ACTION: output << "arithmetic action" << std::endl; break; case DB_DSK_LOGIC_ACTION: output << "logic action" << std::endl; break; case DB_DSK_CONDITIONAL_ACTION: output << "conditional action" << std::endl; break; @@ -597,15 +632,16 @@ public: } } unsigned int getNumFields(void) const { return fields.size();} + void addField(geoField &gf){fields.push_back(gf);} private: - uint id; + unsigned int id; std::vector fields; // each geo record has a variable number of fields class georecord *parent; // parent of pushed/popped records class georecord *instance; // this record is an instance of the pointed to record std::vector< georecord *> tmap; // texture mapping records of this record std::vector< georecord *> behaviour; // behaviour & action records of this record std::vector< georecord *> children; // children of this record - osg::Node *nod; // the node that this record has been converted to (useful for instances) + osg::ref_ptr nod; // the node that this record has been converted to (useful for instances) instancelist mtrlist; // list of matrices of instances not yet satisfied };