TAPs 0.7.7.3
TAPsReadDot10.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines