![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /********************************************************************* 00002 ** Copyright (c) 1999 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 /********************************************************************* 00006 ** $RCSfile: gdbTerrainV203Reader.h,v $ $Revision: 1.18 $ $State: Exp $ 00007 *********************************************************************/ 00008 00009 #ifndef gdbTerrainV203Reader_H_ 00010 #define gdbTerrainV203Reader_H_ 00011 00012 #include "gdb/gdbDefines.h" 00013 #include <stdio.h> 00014 #include "terrainCS/coordSystem.h" 00015 #include "gdb/terModCbInfo.h" 00016 #include "gdb/gdbTerrainReader.h" 00017 00018 #include "gdb/terrainDb.h" 00019 #include "geometry/spatialSubdivision.h" 00020 00021 //forward declarations 00022 class DtExtent; 00023 class DtChord; 00024 class DtChordBundle; 00025 class DtChordIntersectionRecord; 00026 class DtChordIntersectRecordList; 00027 class DtColor; 00028 class DtMemoryManager; 00029 class DtAllTypesPolygon; 00030 class DtTerrainInitializer; 00031 class DtBaseCoordinateSystem; 00032 class DtNetworkNode; 00033 class DtNetworkSegmentHelper; 00034 class DtNetworkEdge; 00035 class DtNetworkSpecElement; 00036 class DtFeature; 00037 class DtGroup; 00038 class DtSurface; 00039 class DtGdbTerrainV203Reader; 00040 class DtListMap; 00041 00042 // Declare a namespace to make sure there are no conflicts with the node types 00043 // declared in the DtGdbNode class and that you can use in a forward declaration. 00044 namespace DT_GDB_V203 00045 { 00046 typedef enum 00047 { 00048 NULL_NODE = -1, 00049 GRIDPOST_LIST = 0, // = 0 00050 VERTEX_LIST, // = 1 00051 SURFACE_LIST, // = 2 00052 GROUP, // = 3 00053 POLYGON_IMMEDIATE, // = 4 00054 POLYGON_INDIRECT, // = 5 00055 LEVEL_OF_DETAIL, // = 6 00056 GRID, // = 7 00057 DYNAMIC_COORDINATE_SYSTEM, // = 8 00058 STATIC_COORDINATE_SYSTEM, // = 9 00059 TERRAIN_FEATURE, // = 10 00060 CULTURAL_FEATURE, // = 11 00061 BUILDING, // = 12 00062 TREE, // = 13 00063 TRIANGLE_IMMEDIATE, // = 14 00064 TRIANGLE_INDIRECT, // = 15 00065 FILE_NODE, // = 16 00066 REF_GROUP, // = 17 00067 SPECIFICATION_LIST, // = 18 00068 VECTOR_NETWORK, // = 19 00069 LAST_NODE_TYPE 00070 } DtGdbV203NodeType; 00071 } 00072 00073 00074 typedef DtGdbNode* (*DtGdbTerrainV203ReaderNodeFcn)(DT_GDB_V203::DtGdbV203NodeType, FILE *, DtGdbTerrainV203Reader *, DtGroup *); 00075 00076 // class DtGdbTerrainV203Reader: 00077 // 00078 // DtGdbTerrainV203Reader represents an entire database in GDB 00079 // format. It is assumed to be a group node (is this appropriate?? -- RVK). 00080 // The database can be written out to, and read from, a file. 00081 // NOTE: This class used to be the DtGdbTerrainReader until that was 00082 // changed to be a general gdb file loader that used the specific loaders 00083 // for each version and the functionality for loading gdb files with 00084 // versions between OLD and 203 was moved into this class. 00085 00086 00087 class DT_DLL_gdb DtGdbTerrainV203Reader : public DtGdbTerrainReader 00088 { 00089 public: 00090 00091 // default constructor 00092 DtGdbTerrainV203Reader(); 00093 00094 // destructor 00095 virtual ~DtGdbTerrainV203Reader(); 00096 00097 private: 00098 // copy constructor and assignment operator not implemented 00099 DtGdbTerrainV203Reader(const DtGdbTerrainV203Reader& orig); 00100 DtGdbTerrainV203Reader& operator=(const DtGdbTerrainV203Reader& orig); 00101 00102 public: 00103 00104 static DtTerrainReader* create(); 00105 00106 // Returns the type of file this database was loaded from. 00107 // This class returns "gdb". Override this function in derived 00108 // terrain db classes. 00109 virtual const DtString dataType() const; 00110 00111 virtual bool readFromFile(const DtFilename& basename, DtTerrainDatabase* terrain); 00112 00113 protected: 00114 00115 // I/O calls. 00116 00117 virtual bool readFrom(FILE* fp, DtTerrainDatabase *terrain); 00118 00119 virtual bool validityCheckVersionNumber(unsigned int versionNumberFromFile); 00120 virtual bool readTerrainData(FILE* fp); 00121 virtual bool readOptionalData(FILE* fp); 00122 virtual bool adjustNewIndirectNodes(DtTerrainDatabase* terrainDb); 00123 00124 virtual DtGdbNode* readNode(FILE *fp, DtGroup *parent); 00125 00126 virtual bool setReadFcn(DT_GDB_V203::DtGdbV203NodeType type, DtGdbTerrainV203ReaderNodeFcn fun); 00127 virtual DtGdbTerrainV203ReaderNodeFcn readFcn(DT_GDB_V203::DtGdbV203NodeType type); 00128 00129 static DtGdbNode* readGridPostList(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00130 static DtGdbNode* readVertexList(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00131 static DtGdbNode* readGroup(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00132 static DtGdbNode* readPolyImm(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00133 static DtGdbNode* readPolyInd(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00134 static DtGdbNode* readLOD(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00135 static DtGdbNode* readGrid(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00136 static DtGdbNode* readDynamicCoordSys(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00137 static DtGdbNode* readStaticCoordSys(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00138 static DtGdbNode* readTerrainFeature(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00139 static DtGdbNode* readCulturalFeature(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00140 static DtGdbNode* readBuilding(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00141 static DtGdbNode* readTree(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00142 static DtGdbNode* readTriangleImm(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00143 static DtGdbNode* readTriangleInd(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00144 static DtGdbNode* readFileNode(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00145 static DtGdbNode* readVectorNetwork(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00146 static DtGdbNode* readSurfaceList(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00147 static DtGdbNode* readSpecificationList(DT_GDB_V203::DtGdbV203NodeType type, FILE *fp, DtGdbTerrainV203Reader *me, DtGroup *parent); 00148 00149 virtual bool readSurface(FILE* fp, DtSurface& surface); 00150 // functions to read vector networks 00151 virtual bool readNetworkNode(FILE* fp, DtNetworkNode* node, unsigned int topology, int numEdges); 00152 00153 virtual bool readNetworkSpecElement(FILE* fp, DtNetworkSpecElement* elem); 00154 00155 virtual bool readNetworkSegment(FILE* fp, DtNetworkSegmentHelper* seg, unsigned int topology); 00156 00157 virtual bool readNetworkEdge(FILE* fp, 00158 DtNetworkEdge* edge, 00159 unsigned int topology, 00160 unsigned int& numSegments, 00161 std::vector<unsigned int>& segmentIndices, 00162 unsigned int& startNodeIndex, 00163 unsigned int& endNodeIndex); 00164 00165 virtual bool readCoordSys(FILE* fp, DtBaseCoordinateSystem* coordSys); 00166 00167 virtual bool readFeature(FILE* fp, DtFeature* feature); 00168 00169 // While reading a GDB file, reports whether this database will contain 00170 // optional data 00171 bool fileHasOptionalData(DtTerrainFileOptionalData optData); 00172 00173 protected: 00174 00175 // For debugging purposes - prints out the numbers of the different nodes 00176 // and other file data (number of specifications, vertices, etc.) read in 00177 virtual void printReadNodeCount(); 00178 00179 DtListMap* myVertexListMap; 00180 DtListMap* mySurfaceListMap; 00181 DtListMap* mySpecificationListMap; 00182 00183 unsigned int myOptionalDataFlagFromFile; 00184 00185 // These are used to read in immediate polygons and triangles and to convert 00186 // them to indirect without corrupting the indices already stored for existing 00187 // indirect polys/tris' vertices and surfaces. Both should be added to the 00188 // end of the main VertexManager and SurfaceManager and all IDs updated before 00189 // returning from loading. 00190 DtVertexManager myImmPolyVertexManager; 00191 DtSurfaceManager myImmPolySurfaceManager; 00192 00193 // Array of pointers to all indirect triangle and polygon nodes that were 00194 // created from immediate nodes on disk. Use this to go back and adjust 00195 // the appropriate IDs (surface...) after all others are loaded. 00196 DtList myImmPolyNodeList; 00197 DtList myImmTriNodeList; 00198 00199 DtGdbTerrainV203ReaderNodeFcn *myReaderFunctionTable; 00200 }; 00201 00202 // While reading a GDB file, reports whether this database will contain 00203 // optional data 00204 inline bool DtGdbTerrainV203Reader::fileHasOptionalData( 00205 DtTerrainFileOptionalData optData) 00206 { 00207 if (myOptionalDataFlagFromFile & optData) 00208 { 00209 return true; 00210 } 00211 else 00212 { 00213 return false; 00214 } 00215 } 00216 00217 #endif