![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsReadDot10.cpp 00003 00004 Create an Opengl polygonal mesh object from a .10 format file. 00005 00006 SUKITTI PUNAK (11/11/2004) 00007 UPDATE (11/11/2004) 00008 ******************************************************************************/ 00009 #include "TAPsReadDot10.hpp" 00010 // Using Inclusion Model (i.e. definitions are included in declarations) 00011 // (this name.cpp is included in name.hpp) 00012 // Each friend is defined directly inside its declaration. 00013 00014 BEGIN_NAMESPACE_TAPs 00015 //============================================================================= 00016 template <typename T> int ReadDot10<T>::NumberOfVertices = 0; 00017 template <typename T> int ReadDot10<T>::NumberOfFaces = 0; 00018 template <typename T> FILE * ReadDot10<T>::fileIn = NULL; 00019 //============================================================================= 00020 //----------------------------------------------------------------------------- 00021 // Display the contents of an object 00022 template <typename T> 00023 bool ReadDot10<T>::readFile( const char *fileName, OpenGL::PolygonalModel<T> * const prModel ) 00024 { 00025 //---------------------------------------------------------------- 00026 // Open the input file 00027 fileIn = fopen( fileName, "r" ); 00028 if ( !fileIn ) { 00029 std::perror( fileName ); 00030 return false; 00031 } 00032 //---------------------------------------------------------------- 00033 // Process Vertices 00034 NumberOfVertices = 0; 00035 int n; 00036 char line[128]; 00037 fgets( line, 128, fileIn ); 00038 sscanf( line, "%d", &n ); 00039 prModel->SetNoVertices( n ); 00040 prModel->NewVertexListByNoVertices(); 00041 for (int i = 0; i < n; ++i ) 00042 { 00043 fgets( line, 1024, fileIn ); 00044 ProcessVertex( line, i, prModel ); 00045 } 00046 //---------------------------------------------------------------- 00047 // Process Faces 00048 NumberOfFaces = 0; 00049 fgets( line, 128, fileIn ); 00050 sscanf( line, "%d", &n ); 00051 prModel->SetNoFaces( n ); 00052 prModel->NewFaceListByNoFaces(); 00053 for (int i = 0; i < n; ++i ) 00054 { 00055 fgets( line, 1024, fileIn ); 00056 ProcessFace( line, i, prModel ); 00057 } 00058 //---------------------------------------------------------------- 00059 fclose( fileIn ); // close the input file 00060 std::cout << "TOTAL VERTICES: " << NumberOfVertices 00061 << "\nTOTAL FACES: " << NumberOfFaces 00062 << "\n"; 00063 return true; 00064 } 00065 //----------------------------------------------------------------------------- 00066 // Display the contents of an object 00067 template <typename T> 00068 bool ReadDot10<T>::readFile( const char *fileName, OpenGL::XPolygonalModel<T> * const prModel ) 00069 { 00070 //---------------------------------------------------------------- 00071 // Open the input file 00072 fileIn = fopen( fileName, "r" ); 00073 if ( !fileIn ) { 00074 std::perror( fileName ); 00075 return false; 00076 } 00077 //---------------------------------------------------------------- 00078 // Process Vertices 00079 int n; 00080 char line[128]; 00081 fgets( line, 128, fileIn ); 00082 sscanf( line, "%d", &n ); 00083 prModel->SetNoVertices( n ); 00084 prModel->NewVertexListByNoVertices(); 00085 for (int i = 0; i < n; ++i ) 00086 { 00087 fgets( line, 1024, fileIn ); 00088 ProcessVertex( line, i, prModel ); 00089 } 00090 //---------------------------------------------------------------- 00091 // Process Faces 00092 fgets( line, 128, fileIn ); 00093 sscanf( line, "%d", &n ); 00094 prModel->SetNoFaces( n ); 00095 prModel->NewFaceListByNoFaces(); 00096 for (int i = 0; i < n; ++i ) 00097 { 00098 fgets( line, 1024, fileIn ); 00099 ProcessFace( line, i, prModel ); 00100 } 00101 //---------------------------------------------------------------- 00102 fclose( fileIn ); // close the input file 00103 std::cout << "TOTAL VERTICES: " << NumberOfVertices 00104 << "\nTOTAL FACES: " << NumberOfFaces 00105 << "\n"; 00106 return true; 00107 } 00108 //============================================================================= 00109 //----------------------------------------------------------------------------- 00110 // Convert vertex nodes 00111 template <typename T> 00112 void ReadDot10<T>::ProcessVertex( char *line, int n, OpenGL::PolygonalModel<T> * const prModel ) 00113 { 00114 ++NumberOfVertices; 00115 00116 //Example 00117 // 12 556.629028 2647.669922 436.273010 00118 char *end; 00119 char *delimiters = "\t "; 00120 char *token = strtok( line, delimiters ); // token is "12" 00121 token = strtok( '\0', delimiters ); // token is "556.629028" 00122 prModel->GetVertexList()[n][0] = strtod( token, &end ); 00123 token = strtok( '\0', delimiters ); // token is "2647.669922" 00124 prModel->GetVertexList()[n][1] = strtod( token, &end ); 00125 token = strtok( '\0', delimiters ); // token is "436.273010" 00126 prModel->GetVertexList()[n][2] = strtod( token, &end ); 00127 } 00128 //----------------------------------------------------------------------------- 00129 // Convert vertex nodes 00130 template <typename T> 00131 void ReadDot10<T>::ProcessVertex( char *line, int n, OpenGL::XPolygonalModel<T> * const prModel ) 00132 { 00133 ++NumberOfVertices; 00134 //std::cout << "ProcessVertex# " << NumberOfVertices << std::endl; 00135 00136 //Example 00137 // 12 556.629028 2647.669922 436.273010 00138 char *end; 00139 char *delimiters = "\t "; 00140 char *token = strtok( line, delimiters ); // token is "12" 00141 token = strtok( '\0', delimiters ); // token is "556.629028" 00142 prModel->GetVertexList()[n][0] = strtod( token, &end ); 00143 token = strtok( '\0', delimiters ); // token is "2647.669922" 00144 prModel->GetVertexList()[n][1] = strtod( token, &end ); 00145 token = strtok( '\0', delimiters ); // token is "436.273010" 00146 prModel->GetVertexList()[n][2] = strtod( token, &end ); 00147 } 00148 //============================================================================= 00149 //----------------------------------------------------------------------------- 00150 // Convert face node 00151 template <typename T> 00152 void ReadDot10<T>::ProcessFace( char *line, int n, OpenGL::PolygonalModel<T> * const prModel ) 00153 { 00154 ++NumberOfFaces; 00155 00156 //Example 00157 // 4 12 11 4 3 00158 00159 // Initialize 00160 char *delimiters = "\t "; 00161 char *token = strtok( line, delimiters ); // token is "4" 00162 char *end; 00163 int numberOfVertices; 00164 int vertexNo; 00165 00166 // Get number of vertices 00167 numberOfVertices = static_cast<int>( strtol( token, &end, 10 ) ); 00168 prModel->GetFaceList()[n].SetNoVertices( numberOfVertices ); 00169 00170 // Set the face 00171 for ( int i = 0; i < numberOfVertices; ++i ) 00172 { 00173 token = strtok( '\0', delimiters ); 00174 vertexNo = static_cast<int>( strtol( token, &end, 10 ) ) - 1; 00175 prModel->GetFaceList()[n].SetVertexNo( i, vertexNo ); 00176 } 00177 } 00178 //----------------------------------------------------------------------------- 00179 // Convert face node 00180 template <typename T> 00181 void ReadDot10<T>::ProcessFace( char *line, int n, OpenGL::XPolygonalModel<T> * const prModel ) 00182 { 00183 ++NumberOfFaces; 00184 //std::cout << "ProcessFace# " << NumberOfVertices << std::endl; 00185 00186 //Example 00187 // 4 12 11 4 3 00188 00189 // Initialize 00190 char *delimiters = "\t "; 00191 char *token = strtok( line, delimiters ); // token is "4" 00192 char *end; 00193 int numberOfVertices; 00194 int vertexNo; 00195 00196 // Get number of vertices 00197 numberOfVertices = static_cast<int>( strtol( token, &end, 10 ) ); 00198 prModel->GetFaceList()[n].SetNoVertices( numberOfVertices ); 00199 00200 // Set the face 00201 for ( int i = 0; i < numberOfVertices; ++i ) 00202 { 00203 token = strtok( '\0', delimiters ); 00204 vertexNo = static_cast<int>( strtol( token, &end, 10 ) ) - 1; 00205 prModel->GetFaceList()[n].SetVertexNo( i, vertexNo ); 00206 } 00207 } 00208 //----------------------------------------------------------------------------- 00209 //============================================================================= 00210 END_NAMESPACE_TAPs 00211 //----------------------------------------------------------------------------- 00212 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00213 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8