TAPs 0.7.7.3
TAPsReadPly.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsReadPly.cpp
00003 
00004 Create an OpenGL Model Object from a .ply file
00005 
00006 SUKITTI PUNAK   (05/24/2006)
00007 UPDATE          (06/01/2006)
00008 ******************************************************************************/
00009 #include "TAPsReadPly.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 //-------------------------------------------------------------------
00017 template <typename T>
00018 unsigned char   ReadPly<T>::m_eFormat = UNDEFINED;
00019 template <typename T>
00020 float           ReadPly<T>::m_fFormatVersion = 0.0f;
00021 template <typename T>
00022 unsigned char   ReadPly<T>::m_eCurrentListType = UNDEFINED;
00023 //-------------------------------------------------------------------
00024 template <typename T>
00025 std::vector<unsigned char>  ReadPly<T>::m_veVertexListType;
00026 template <typename T>
00027 std::vector<unsigned char>  ReadPly<T>::m_veVertexListAttrib;
00028 //-------------------------------------------------------------------
00029 template <typename T>
00030 std::vector<unsigned char>  ReadPly<T>::m_veFaceListType;
00031 template <typename T>
00032 std::vector<unsigned char>  ReadPly<T>::m_veFaceListAttrib;
00033 //-------------------------------------------------------------------
00034 template <typename T>
00035 std::vector<unsigned char>  ReadPly<T>::m_veEdgeListType;
00036 template <typename T>
00037 std::vector<unsigned char>  ReadPly<T>::m_veEdgeListAttrib;
00038 //-------------------------------------------------------------------
00039 template <typename T>   int ReadPly<T>::halfEdgeCounter = 0;
00040 template <typename T>   int ReadPly<T>::vertexNo = 0;
00041 /*
00042 template <typename T>
00043 HEVertex<T> ** ReadPly<T>::vertexList = NULL;
00044 template <typename T>
00045 HashTableBySTLVector<int> * ReadPly<T>::vertexRingList = NULL;
00046 template <typename T>
00047 HashTableBySTLVector< HEHalfEdge<T>* > * ReadPly<T>::halfEdgeRingList = NULL;
00048 template <typename T>
00049 HEHalfEdge<T> * ReadPly<T>::boundaryHalfEdgePtr = NULL;
00050 //*/
00051 //=============================================================================
00052 //-----------------------------------------------------------------------------
00053 // Read an input file
00054 template <typename T>
00055 bool ReadPly<T>::readFile ( 
00056     const char *fileName, OpenGL::PolygonalModel<T> * const prModel )
00057 {
00058     Clear();
00059     //----------------------------------------------------------------
00060     // Open the input file
00061     FILE * fileIn = fopen( fileName, "rb" );
00062     if ( !fileIn ) {
00063         std::perror( fileName );
00064         return false;
00065     }
00066     //----------------------------------------------------------------
00067 #ifdef  TAPs_DEBUG_MODE
00068     std::cout << "START READING " << fileName << "\n";
00069 #endif
00070     //----------------------------------------------------------------
00071     if ( ProcessHEADER( fileIn, prModel ) == false )    return false;
00072     if      ( FORMAT_ASCII == m_eFormat ) {
00073         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_ASCII( fileIn, prModel );
00074         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_ASCII( fileIn, prModel );
00075     }
00076     else if ( FORMAT_BINARY_BIG_ENDDIAN == m_eFormat ) {
00077         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_BINARY_BIG_ENDDIAN( fileIn, prModel );
00078         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_BINARY_BIG_ENDDIAN( fileIn, prModel );
00079     }
00080     else if ( FORMAT_BINARY_LITTLE_ENDDIAN == m_eFormat ) {
00081         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_BINARY_LITTLE_ENDDIAN( fileIn, prModel );
00082         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_BINARY_LITTLE_ENDDIAN( fileIn, prModel );
00083     }
00084     //----------------------------------------------------------------
00085     fclose(fileIn);
00086 #ifdef  TAPs_DEBUG_MODE
00087     std::cout << "END READING " << fileName << "\n";
00088 #endif
00089     prModel->GetMaterial()->ApplyMaterial();
00090     return true;
00091 }
00092 //-----------------------------------------------------------------------------
00093 // Read an input file
00094 template <typename T>
00095 bool ReadPly<T>::readFile ( 
00096     const char *fileName, OpenGL::XPolygonalModel<T> * const prModel )
00097 {
00098     Clear();
00099     //----------------------------------------------------------------
00100     // Open the input file
00101     FILE * fileIn = fopen( fileName, "rb" );
00102     if ( !fileIn ) {
00103         std::perror( fileName );
00104         return false;
00105     }
00106     //----------------------------------------------------------------
00107 #ifdef  TAPs_DEBUG_MODE
00108     std::cout << "START READING " << fileName << "\n";
00109 #endif
00110     //----------------------------------------------------------------
00111     if ( ProcessHEADER( fileIn, prModel ) == false )    return false;
00112     if      ( FORMAT_ASCII == m_eFormat ) {
00113         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_ASCII( fileIn, prModel );
00114         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_ASCII( fileIn, prModel );
00115     }
00116     else if ( FORMAT_BINARY_BIG_ENDDIAN == m_eFormat ) {
00117         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_BINARY_BIG_ENDDIAN( fileIn, prModel );
00118         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_BINARY_BIG_ENDDIAN( fileIn, prModel );
00119     }
00120     else if ( FORMAT_BINARY_LITTLE_ENDDIAN == m_eFormat ) {
00121         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_BINARY_LITTLE_ENDDIAN( fileIn, prModel );
00122         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_BINARY_LITTLE_ENDDIAN( fileIn, prModel );
00123     }
00124     //----------------------------------------------------------------
00125     fclose(fileIn);
00126 #ifdef  TAPs_DEBUG_MODE
00127     std::cout << "END READING " << fileName << "\n";
00128 #endif
00129     prModel->GetMaterial()->ApplyMaterial();
00130     return true;
00131 }
00132 //-----------------------------------------------------------------------------
00133 // Read an input file
00134 template <typename T>
00135 bool ReadPly<T>::readFile ( 
00136     const char *fileName, OpenGL::HalfEdgeModel<T> * const prModel )
00137 {
00138     Clear();
00139     //----------------------------------------------------------------
00140     // Initialization
00141     halfEdgeCounter = 0;
00142     vertexNo = 0;
00143     //----------------------------------------------------------------
00144     // Open the input file
00145     FILE * fileIn = fopen( fileName, "rb" );
00146     if ( !fileIn ) {
00147         std::perror( fileName );
00148         return false;
00149     }
00150     //----------------------------------------------------------------
00151 #ifdef  TAPs_DEBUG_MODE
00152     std::cout << "START READING " << fileName << "\n";
00153 #endif
00154     //----------------------------------------------------------------
00155     if ( ProcessHEADER( fileIn, prModel ) == false )    return false;
00156     if      ( FORMAT_ASCII == m_eFormat ) {
00157         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_ASCII( fileIn, prModel );
00158         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_ASCII( fileIn, prModel );
00159     }
00160     else if ( FORMAT_BINARY_BIG_ENDDIAN == m_eFormat ) {
00161         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_BINARY_BIG_ENDDIAN( fileIn, prModel );
00162         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_BINARY_BIG_ENDDIAN( fileIn, prModel );
00163     }
00164     else if ( FORMAT_BINARY_LITTLE_ENDDIAN == m_eFormat ) {
00165         if ( prModel->GetNoVertices() > 0 ) ProcessVERTEX_LIST_BINARY_LITTLE_ENDDIAN( fileIn, prModel );
00166         if ( prModel->GetNoFaces() > 0 )    ProcessFACE_LIST_BINARY_LITTLE_ENDDIAN( fileIn, prModel );
00167     }
00168     //----------------------------------------------------------------
00169     fclose(fileIn);
00170     //----------------------------------------------------------------
00171     HelpCreateHalfEdgeModel<T>::CreateHalfEdgeModel( prModel );
00172     //----------------------------------------------------------------
00173 #ifdef  TAPs_DEBUG_MODE
00174     std::cout << "END READING " << fileName << "\n";
00175     std::cout << "Number of Half-Edges: " << halfEdgeCounter << "\n";
00176 #endif
00177     prModel->GetMaterial()->ApplyMaterial();
00178     return true;
00179 }
00180 //-----------------------------------------------------------------------------
00181 //=============================================================================
00182 //-----------------------------------------------------------------------------
00183 // Clear History / Refresh
00184 template <typename T>
00185 void ReadPly<T>::Clear () 
00186 {
00187     m_eFormat           = UNDEFINED;
00188     m_fFormatVersion    = 0.0;
00189     m_eCurrentListType  = UNDEFINED;
00190     //-----------------------------------------------------
00191     m_veVertexListType.clear();
00192     m_veVertexListAttrib.clear();
00193     m_veFaceListType.clear();
00194     m_veFaceListAttrib.clear();
00195     m_veEdgeListType.clear();
00196     m_veEdgeListAttrib.clear();
00197     //-----------------------------------------------------
00198     halfEdgeCounter = 0;
00199     vertexNo = 0;
00200     HelpCreateHalfEdgeModel<T>::vertexList = NULL;
00201     HelpCreateHalfEdgeModel<T>::vertexRingList = NULL;
00202     HelpCreateHalfEdgeModel<T>::halfEdgeRingList = NULL;
00203     HelpCreateHalfEdgeModel<T>::boundaryHalfEdgePtr = NULL;
00204 }
00205 //-----------------------------------------------------------------------------
00206 //=============================================================================
00207 //-----------------------------------------------------------------------------
00208 // Process HEADER
00209 template <typename T>
00210 bool ReadPly<T>::ProcessHEADER ( 
00211     FILE * inputFile, OpenGL::MeshModel<T> * const prModel )
00212 {
00213     //---------------------------------------------------------------
00214     //m_iNumOfVertices = 0;
00215     //m_iNumOfFaces    = 0;
00216     //---------------------------------------------------------------
00217     char line[256];
00218     char node[128];
00219 //  while ( !feof(fileIn) ) {
00220     do {
00221         fgets( line, 256, inputFile );  // read the first line
00222     } while ( strlen( line ) < 3 || line[0] == '#' );
00223     sscanf( line, "%s", node );
00224     //-------------------------------------------
00225     // Check for ply format
00226     if ( strncmp( node, "ply", strlen("ply") ) ) {
00227         return false;
00228     }
00229     //-------------------------------------------
00230     bool bKeepRunning = true;
00231     while ( bKeepRunning ) {
00232         do {
00233             fgets( line, 256, inputFile );  // read the next line
00234         } while ( strlen( line ) < 3 || line[0] == '#' );
00235         sscanf( line, "%s", node );
00236         if      ( !strncmp( node, "property", strlen("property") ) ) {
00237             ProcessPROPERTY( line );
00238         }
00239         else if ( !strncmp( node, "element", strlen("element") ) ) {
00240             ProcessELEMENT( line, prModel );
00241         }
00242         else if ( !strncmp( node, "end_header", strlen("end_header") ) ) {
00243             bKeepRunning = false;
00244         }
00245         else if ( !strncmp( node, "format", strlen("format") ) ) {
00246             if ( !ProcessFORMAT( line ) ) {
00247                 return false;
00248             }
00249         }
00250     }
00251 #ifdef  TAPs_DEBUG_MODE
00252     std::cout << "Number of Vertices: " << prModel->GetNoVertices() << "\n";
00253     std::cout << "Number of Faces:    " << prModel->GetNoFaces() << "\n";
00254 #endif
00255 #ifdef  TAPs_DEBUG_MODE_DETAIL_1
00256     std::cout << "\nVertex Prop:\n";
00257     for ( int i = 0; i < static_cast<int>( m_veVertexListType.size() ); ++i ) {
00258         std::cout << "\t" << static_cast<int>( m_veVertexListType[i] );
00259     }
00260     std::cout << "\n";
00261     for ( int i = 0; i < static_cast<int>( m_veVertexListAttrib.size() ); ++i ) {
00262         std::cout << "\t" << static_cast<int>( m_veVertexListAttrib[i] );
00263     }
00264     std::cout << "\nFace Prop:\n";
00265     for ( int i = 0; i < static_cast<int>( m_veFaceListType.size() ); ++i ) {
00266         std::cout << "\t" << static_cast<int>( m_veFaceListType[i] );
00267     }
00268     std::cout << "\n";
00269     for ( int i = 0; i < static_cast<int>( m_veFaceListAttrib.size() ); ++i ) {
00270         std::cout << "\t" << static_cast<int>( m_veFaceListAttrib[i] );
00271     }
00272     std::cout << "\nEdge Prop:\n";
00273     for ( int i = 0; i < static_cast<int>( m_veEdgeListType.size() ); ++i ) {
00274         std::cout << "\t" << static_cast<int>( m_veEdgeListType[i] );
00275     }
00276     std::cout << "\n";
00277     for ( int i = 0; i < static_cast<int>( m_veEdgeListAttrib.size() ); ++i ) {
00278         std::cout << "\t" << static_cast<int>( m_veEdgeListAttrib[i] );
00279     }
00280 #endif
00281     return true;
00282 }
00283 //-----------------------------------------------------------------------------
00284 //=============================================================================
00285 //-----------------------------------------------------------------------------
00286 // Process FORMAT
00287 template <typename T>
00288 bool ReadPly<T>::ProcessFORMAT ( char * line )
00289 {
00290     //---------------------------------------------------------------
00291     char *delimiters = "\t ";
00292     char *token = NULL;
00293     char *end;
00294 // Example on using string token
00295 //  token = strtok( line, delimiters );     // start
00296 //  token = strtok( '\0', delimiters );     // next
00297 //  token = strtok( NULL, delimiters );     // next
00298 //  while ( token != NULL ) { ... }         // not reach the end yet
00299 //  numberOfVertices = static_cast<int>( strtol( token, &end, 10 ) );
00300     //---------------------------------------------------------------
00301     token = strtok( line, delimiters );     // "format"
00302     token = strtok( '\0', delimiters );     // format type
00303     if      ( !strncmp( token, "ascii", strlen("ascii") ) ) {
00304         m_eFormat = FORMAT_ASCII;
00305 #ifdef  TAPs_DEBUG_MODE_DETAIL_1
00306         std::cout << "Format: ASCII\n";
00307 #endif
00308     }
00309     else if ( !strncmp( token, "binary_big_endian", strlen("binary_big_endian") ) ) {
00310         m_eFormat = FORMAT_BINARY_BIG_ENDDIAN;
00311 #ifdef  TAPs_DEBUG_MODE_DETAIL_1
00312         std::cout << "Format: Binary Big Enddian\n";
00313 #endif
00314     }
00315     else if ( !strncmp( token, "binary_little_endian", strlen("binary_little_endian") ) ) {
00316         m_eFormat = FORMAT_BINARY_LITTLE_ENDDIAN;
00317 #ifdef  TAPs_DEBUG_MODE_DETAIL_1
00318         std::cout << "Format: Binary Little Enddian\n";
00319 #endif
00320     }
00321     else {
00322 #ifdef  TAPs_DEBUG_MODE
00323         std::cout << "Ply \"" << token << "\" format is unrecognizable!" << std::endl;
00324         return false;
00325 #endif
00326     }
00327     //---------------------------------------------------------------
00328     token = strtok( '\0', delimiters ); // format version
00329     if ( token != NULL ) {
00330         m_fFormatVersion = static_cast<int>( strtol( token, &end, 10 ) );
00331     }
00332     //---------------------------------------------------------------
00333     return true;
00334 }
00335 //-----------------------------------------------------------------------------
00336 //=============================================================================
00337 //-----------------------------------------------------------------------------
00338 // Process ELEMENT
00339 template <typename T>
00340 void ReadPly<T>::ProcessELEMENT ( 
00341     char * line, OpenGL::MeshModel<T> * const prModel )
00342 {
00343     //---------------------------------------------------------------
00344     char *delimiters = "\t ";
00345     char *token = NULL;
00346     char *end;
00347     //---------------------------------------------------------------
00348     token = strtok( line, delimiters );     // "element"
00349     token = strtok( '\0', delimiters );     // type of element
00350     if      ( !strncmp( token, "vertex", strlen("vertex") ) ) {
00351         token = strtok( '\0', delimiters ); // # of vertices
00352         prModel->SetNoVertices( static_cast<int>( strtol( token, &end, 10 ) ) );
00353         m_eCurrentListType = ELEMENT_VERTEX;
00354     }
00355     else if ( !strncmp( token, "face", strlen("face") ) ) {
00356         token = strtok( '\0', delimiters ); // # of faces
00357         prModel->SetNoFaces( static_cast<int>( strtol( token, &end, 10 ) ) );
00358         m_eCurrentListType = ELEMENT_FACE;
00359     }
00360     else if ( !strncmp( token, "edge", strlen("edge") ) ) {
00361         token = strtok( '\0', delimiters ); // # of faces
00362         // prModel doesn't support edge list
00363         //prModel->SetNoFaces( static_cast<int>( strtol( token, &end, 10 ) ) );
00364         m_eCurrentListType = ELEMENT_EDGE;
00365     }
00366 }
00367 //-----------------------------------------------------------------------------
00368 //=============================================================================
00369 //-----------------------------------------------------------------------------
00370 // Process ELEMENT
00371 template <typename T>
00372 void ReadPly<T>::ProcessPROPERTY ( char * line )
00373 {
00374     int bListForFace = 0;                               // for face
00375     unsigned char dataType_0 = UNDEFINED;       // for face
00376     unsigned char dataType   = UNDEFINED;
00377     unsigned char attribute  = UNDEFINED;
00378     //---------------------------------------------------------------
00379     char *delimiters = "\t\n ";
00380     char *token = NULL;
00381     //char *end;
00382     //---------------------------------------------------------------
00383     token = strtok( line, delimiters );     // "property"
00384     //---------------------------------------------------------------
00385     token = strtok( '\0', delimiters );
00386     do {
00387         //std::cout << "\t" << token;
00388         //-------------------------------------------------
00389         // Data Type
00390         if      ( !strcmp( token, "int8" ) ) {
00391             dataType = INT_8;
00392         }
00393         else if ( !strcmp( token, "uint8" ) 
00394                || !strcmp( token, "uchar" ) ) {
00395             dataType = UINT_8;
00396         }
00397         else if ( !strcmp( token, "int16" ) ) {
00398             dataType = INT_16;
00399         }
00400         else if ( !strcmp( token, "uint16" ) ) {
00401             dataType = UINT_16;
00402         }
00403         else if ( !strcmp( token, "int32" ) 
00404                || !strcmp( token, "int" ) ) {
00405             dataType = INT_32;
00406         }
00407         else if ( !strcmp( token, "uint32" ) ) {
00408             dataType = UINT_32;
00409         }
00410         else if ( !strcmp( token, "float32" ) 
00411                || !strcmp( token, "float" ) ) {
00412             dataType = FLOAT_32;
00413         }
00414         else if ( !strcmp( token, "float64" ) 
00415                || !strcmp( token, "double" ) ) {
00416             dataType = FLOAT_64;
00417         }
00418         //-------------------------------------------------
00419         // Attribute
00420         else if ( !strcmp( token, "x" ) ) {
00421             attribute = X;
00422         }
00423         else if ( !strcmp( token, "y" ) ) {
00424             attribute = Y;
00425         }
00426         else if ( !strcmp( token, "z" ) ) {
00427             attribute = Z;
00428         }
00429         else if ( !strcmp( token, "red" ) ) {
00430             attribute = RED;
00431         }
00432         else if ( !strcmp( token, "green" ) ) {
00433             attribute = GREEN;
00434         }
00435         else if ( !strcmp( token, "blue" ) ) {
00436             attribute = BLUE;
00437         }
00438         else if ( !strcmp( token, "confidence" ) ) {
00439             attribute = CONFIDENCE;
00440         }
00441         else if ( !strcmp( token, "intensity" ) ) {
00442             attribute = INTENSITY;
00443         }
00444         else if ( !strcmp( token, "vertex1" ) ) {
00445             attribute = VERTEX1;
00446         }
00447         else if ( !strcmp( token, "vertex2" ) ) {
00448             attribute = VERTEX2;
00449         }
00450         //-------------------------------------------------
00451         // List
00452         else if ( !strcmp( token, "list" ) ) {
00453             if ( m_eCurrentListType == ELEMENT_FACE ) {
00454                 bListForFace = 2;
00455             }
00456             token = strtok( '\0', delimiters );
00457             continue;
00458         }
00459         else if ( !strcmp( token, "vertex_indices" ) ) {
00460             attribute = LIST_VERTEX_INDICES;
00461         }
00462         //-------------------------------------------------
00463         // For Face List
00464         if ( bListForFace == 2 )    {
00465             dataType_0 = dataType;
00466             bListForFace = 1;
00467         }
00468         //-------------------------------------------------
00469         token = strtok( '\0', delimiters );
00470     } while ( token != NULL );
00471     //---------------------------------------------------------------
00472     if      ( m_eCurrentListType == ELEMENT_VERTEX ) {
00473         m_veVertexListType.push_back( dataType );
00474         m_veVertexListAttrib.push_back( attribute );
00475     }
00476     // Since an element can be declared after "element face #ofFaces",
00477     // this element belongs to face element.
00478     // For face element "property list dataType_0 dataType vertex_indices",
00479     // they are put back into m_veFaceListType and Attrib by 
00480     // the ProcessPROPERTY fn
00481     else if ( m_eCurrentListType == ELEMENT_FACE ) {
00482         if ( bListForFace == 1 ) {
00483             m_veFaceListType.push_back( dataType_0 );
00484             m_veFaceListType.push_back( dataType );
00485             m_veFaceListAttrib.push_back( attribute );
00486             m_veFaceListAttrib.push_back( 0 );
00487             // push 0 for dummy value
00488         }
00489         else {
00490             m_veFaceListType.push_back( dataType );
00491             m_veFaceListAttrib.push_back( attribute );
00492         }
00493         bListForFace = 0;
00494     }
00495     else if ( m_eCurrentListType == ELEMENT_EDGE ) {
00496         m_veEdgeListType.push_back( dataType );
00497         m_veEdgeListAttrib.push_back( attribute );
00498     }
00499 }
00500 //-----------------------------------------------------------------------------
00501 //=============================================================================
00502 //-----------------------------------------------------------------------------
00503 // Process VERTEX LIST ASCII
00504 template <typename T>
00505 void ReadPly<T>::ProcessVERTEX_LIST_ASCII ( 
00506     FILE * inputFile, OpenGL::PolygonalModel<T> * const prModel )
00507 {
00508 #ifdef  TAPs_DEBUG_MODE
00509     std::cout << "Processing VERTEX LIST\n";
00510 #endif
00511     //-------------------------------------------------------------------
00512     // Example: x y z values
00513     //   0 0 0
00514     //   ...
00515     //   0 0 1
00516     //-------------------------------------------------------------------
00517     char vertexStr[128];
00518     int vertexNumber = 0;
00519     float x, y, z;      // since sscanf does not work for T (template)
00520     //-------------------------------------------------------------------
00521     prModel->NewVertexListByNoVertices();
00522     do {
00523         do {
00524             fgets( vertexStr, 128, inputFile );
00525         } while ( strlen( vertexStr ) < 3 || vertexStr[0] == '#' );
00526         sscanf( vertexStr, "%g %g %g", &x, &y, &z );
00527         prModel->GetVertexList()[vertexNumber][0] = x;
00528         prModel->GetVertexList()[vertexNumber][1] = y;
00529         prModel->GetVertexList()[vertexNumber][2] = z;
00530         ++vertexNumber;
00531     } while ( vertexNumber < prModel->GetNoVertices() );
00532 }
00533 //-----------------------------------------------------------------------------
00534 // Process VERTEX LIST ASCII
00535 template <typename T>
00536 void ReadPly<T>::ProcessVERTEX_LIST_ASCII ( 
00537     FILE * inputFile, OpenGL::XPolygonalModel<T> * const prModel )
00538 {
00539 #ifdef  TAPs_DEBUG_MODE
00540     std::cout << "Processing VERTEX LIST\n";
00541 #endif
00542     //-------------------------------------------------------------------
00543     // Example: x y z values
00544     //   0 0 0
00545     //   ...
00546     //   0 0 1
00547     //-------------------------------------------------------------------
00548     char vertexStr[128];
00549     int vertexNumber = 0;
00550     float x, y, z;      // since sscanf does not work for T (template)
00551     //-------------------------------------------------------------------
00552     prModel->NewVertexListByNoVertices();
00553     do {
00554         do {
00555             fgets( vertexStr, 128, inputFile );
00556         } while ( strlen( vertexStr ) < 3 || vertexStr[0] == '#' );
00557         sscanf( vertexStr, "%g %g %g", &x, &y, &z );
00558         prModel->GetVertexList()[vertexNumber][0] = x;
00559         prModel->GetVertexList()[vertexNumber][1] = y;
00560         prModel->GetVertexList()[vertexNumber][2] = z;
00561         ++vertexNumber;
00562     } while ( vertexNumber < prModel->GetNoVertices() );
00563 }
00564 //-----------------------------------------------------------------------------
00565 // Process VERTEX LIST ASCII
00566 template <typename T>
00567 void ReadPly<T>::ProcessVERTEX_LIST_ASCII ( 
00568     FILE * inputFile, OpenGL::HalfEdgeModel<T> * const prModel )
00569 {
00570 #ifdef  TAPs_DEBUG_MODE
00571     std::cout << "Processing VERTEX LIST\n";
00572 #endif
00573     //-------------------------------------------------------------------
00574     // Example:
00575     //  *MESH_VERTEX_LIST {
00576     //      *MESH_VERTEX    0   -10.000000  -5.000000   0.000000
00577     //      *MESH_VERTEX    1   10.000000   -5.000000   0.000000
00578     //      *MESH_VERTEX    2   -10.000000  5.000000    0.000000
00579     //      ...
00580     //  }
00581     //-------------------------------------------------------------------
00582     char node[128];
00583     int n;
00584     float x, y, z;
00585     fgets( line, 128, inputFile );
00586     sscanf( line, "%s %d %g %g %g", node, &n, &x, &y, &z );
00587     while ( node[0] != '}' ) {
00588         //------------------------------------------------------
00589         // Put created vertex in vertexList for look up later
00590         HelpCreateHalfEdgeModel<T>::vertexList[vertexNo] = new HEVertex<T>( x, y, z );
00591         // Put created vertex in vertexList of the model
00592         prModel->GetVertexList()->Append( HelpCreateHalfEdgeModel<T>::vertexList[vertexNo] );
00593         ++vertexNo; // next vertex#
00594         //std::cout << "Vertex: " << vertexNo << "\n";
00595         //------------------------------------------------------
00596         fgets( line, 128, fileIn );
00597         sscanf( line, "%s %d %g %g %g", node, &n, &x, &y, &z );
00598     }
00599 }
00600 //-----------------------------------------------------------------------------
00601 //=============================================================================
00602 //-----------------------------------------------------------------------------
00603 // Process FACE LIST ASCII
00604 template <typename T>
00605 void ReadPly<T>::ProcessFACE_LIST_ASCII ( 
00606     FILE * inputFile, OpenGL::PolygonalModel<T> * const prModel )
00607 {
00608 #ifdef  TAPs_DEBUG_MODE
00609     std::cout << "Processing FACE LIST\n";
00610 #endif
00611     //---------------------------------------------------------------
00612     // Example:  number of vertices for this face followed by vertex numbers
00613     //   4 0  1  2  3
00614     //   ...
00615     //   3 10 11 12
00616     //---------------------------------------------------------------
00617     char line[128];
00618     char *delimiters = "\t ";
00619     char *token = NULL;
00620     char *end;
00621     int numberOfVertices;
00622     int vertexNo;
00623     int faceNo = 0;
00624     //---------------------------------------------------------------
00625     prModel->NewFaceListByNoFaces();
00626     do {
00627         do {
00628             fgets( line, 128, inputFile );
00629         } while ( strlen( line ) < 3 || line[0] == '#' );
00630         token = strtok( line, delimiters );     // number of vertices
00631         numberOfVertices = static_cast<int>( strtol( token, &end, 10 ) );
00632         prModel->GetFaceList()[faceNo].SetNoVertices( numberOfVertices );
00633         for ( int i = 0; i < numberOfVertices; ++i ) {
00634             token = strtok( '\0', delimiters ); // vertex number
00635             vertexNo = static_cast<int>( strtol( token, &end, 10 ) );
00636             prModel->GetFaceList()[faceNo].SetVertexNo( i, vertexNo );
00637         }
00638         ++faceNo;
00639     } while ( faceNo < prModel->GetNoFaces() );
00640     //---------------------------------------------------------------
00641 }
00642 //-----------------------------------------------------------------------------
00643 // Process FACE LIST ASCII
00644 template <typename T>
00645 void ReadPly<T>::ProcessFACE_LIST_ASCII ( 
00646     FILE * inputFile, OpenGL::XPolygonalModel<T> * const prModel )
00647 {
00648 #ifdef  TAPs_DEBUG_MODE
00649     std::cout << "Processing FACE LIST\n";
00650 #endif
00651     //---------------------------------------------------------------
00652     // Example:  number of vertices for this face followed by vertex numbers
00653     //   4 0  1  2  3
00654     //   ...
00655     //   3 10 11 12
00656     //---------------------------------------------------------------
00657     char line[128];
00658     char *delimiters = "\t ";
00659     char *token = NULL;
00660     char *end;
00661     int numberOfVertices;
00662     int vertexNo;
00663     int faceNo = 0;
00664     //---------------------------------------------------------------
00665     prModel->NewFaceListByNoFaces();
00666     do {
00667         do {
00668             fgets( line, 128, inputFile );
00669         } while ( strlen( line ) < 3 || line[0] == '#' );
00670         token = strtok( line, delimiters );     // number of vertices
00671         numberOfVertices = static_cast<int>( strtol( token, &end, 10 ) );
00672         prModel->GetFaceList()[faceNo].SetNoVertices( numberOfVertices );
00673         for ( int i = 0; i < numberOfVertices; ++i ) {
00674             token = strtok( '\0', delimiters ); // vertex number
00675             vertexNo = static_cast<int>( strtol( token, &end, 10 ) );
00676             prModel->GetFaceList()[faceNo].SetVertexNo( i, vertexNo );
00677         }
00678         ++faceNo;
00679     } while ( faceNo < prModel->GetNoFaces() );
00680     //---------------------------------------------------------------
00681 }
00682 //-----------------------------------------------------------------------------
00683 // Process FACE LIST ASCII
00684 template <typename T>
00685 void ReadPly<T>::ProcessFACE_LIST_ASCII ( 
00686     FILE * inputFile, OpenGL::HalfEdgeModel<T> * const prModel )
00687 {
00688     std::cout << "Processing Node MESH_FACE_LIST\n";
00689     //-------------------------------------------------------------------
00690     // Example:
00691     //  *MESH_FACE_LIST {
00692     //      *MESH_FACE    0:    A:    0 B:    2 C:    3 AB:    1 BC:    1 CA:    0   *MESH_SMOOTHING 2  *MESH_MTLID 1
00693     //      *MESH_FACE    1:    A:    3 B:    1 C:    0 AB:    1 BC:    1 CA:    0   *MESH_SMOOTHING 2  *MESH_MTLID 1
00694     //      *MESH_FACE    2:    A:    4 B:    5 C:    7 AB:    1 BC:    1 CA:    0   *MESH_SMOOTHING 3  *MESH_MTLID 0
00695     //      ...
00696     //  }
00697     //-------------------------------------------------------------------
00698     HEFace<T> *heFace;
00699     char node[128];
00700     char N[16], A[4], B[4], C[4];
00701     int  v0, v1, v2;
00702     fgets( line, 128, fileIn );
00703     sscanf( line, "%s %s %s %d %s %d %s %d", node, N, A, &v0, B, &v1, C, &v2 );
00704     while ( node[0] != '}' ) {
00705         heFace = new HEFace<T>();
00706         prModel->GetFaceList()->Append( heFace );
00707         //----------------------------------------------------------------
00708         // Create and Set all three half-edges
00709         HEHalfEdge<T> *heHalfEdge0 = HelpCreateHalfEdgeModel<T>::CreateHalfEdgeFrom( 
00710             HelpCreateHalfEdgeModel<T>::vertexList[v0], 
00711             HelpCreateHalfEdgeModel<T>::vertexList[v1], 
00712             heFace );
00713         HEHalfEdge<T> *heHalfEdge1 = HelpCreateHalfEdgeModel<T>::CreateHalfEdgeFrom( 
00714             HelpCreateHalfEdgeModel<T>::vertexList[v1], 
00715             HelpCreateHalfEdgeModel<T>::vertexList[v2], 
00716             heFace, heHalfEdge0 );
00717         HEHalfEdge<T> *heHalfEdge2 = HelpCreateHalfEdgeModel<T>::CreateHalfEdgeFrom( 
00718             HelpCreateHalfEdgeModel<T>::vertexList[v2], 
00719             HelpCreateHalfEdgeModel<T>::vertexList[v0], 
00720             heFace, heHalfEdge1, heHalfEdge0 );
00721         halfEdgeCounter += 3;
00722         //----------------------------------------------------------------
00723         // Set incident half-edge of this face
00724         heFace->IncidentHalfEdge( heHalfEdge0 );
00725         //----------------------------------------------------------------
00726         // (CCW) Record v0 to v1, v1 to v2, and v2 to v0 in vertexRingList
00727         HelpCreateHalfEdgeModel<T>::vertexRingList->Insert( v1, v0 );   // put v1 in bucket v0
00728         HelpCreateHalfEdgeModel<T>::vertexRingList->Insert( v2, v1 );   // put v2 in bucket v1
00729         HelpCreateHalfEdgeModel<T>::vertexRingList->Insert( v0, v2 );   // put v0 in bucket v2
00730         //----------------------------------------------------------------
00731         // Record half-edges in halfEdgeRingList
00732         HelpCreateHalfEdgeModel<T>::halfEdgeRingList->Insert( heHalfEdge0, v0 );    // put in bucket v0
00733         HelpCreateHalfEdgeModel<T>::halfEdgeRingList->Insert( heHalfEdge1, v1 );    // put in bucket v1
00734         HelpCreateHalfEdgeModel<T>::halfEdgeRingList->Insert( heHalfEdge2, v2 );    // put in bucket v2
00735         //----------------------------------------------------------------
00736         fgets( line, 128, fileIn );
00737         sscanf( line, "%s %s %s %d %s %d %s %d", node, N, A, &v0, B, &v1, C, &v2 );
00738     }
00739 }
00740 //-----------------------------------------------------------------------------
00741 //=============================================================================
00742 //-----------------------------------------------------------------------------
00743 // Process VERTEX LIST BINARY BIG ENDDIAN
00744 template <typename T>
00745 void ReadPly<T>::ProcessVERTEX_LIST_BINARY_BIG_ENDDIAN ( 
00746     FILE * inputFile, OpenGL::PolygonalModel<T> * const prModel )
00747 {
00748 #ifdef  TAPs_DEBUG_MODE
00749     std::cout << "Processing VERTEX LIST\n";
00750 #endif
00751     //-------------------------------------------------------------------
00752     // Example: x y z and other values
00753     //   0 0 0 ...
00754     //   ...
00755     //   0 0 1 ...
00756     //---------------------------------------------------------------
00757     int readingSize = 0;
00758     //---------------------------------------------------------------
00759     for ( int i = 0; i < static_cast<int>(m_veVertexListType.size()); ++i ) {
00760         if      ( m_veVertexListType[i] == INT_8 )      readingSize += 1;
00761         else if ( m_veVertexListType[i] == UINT_8 ) readingSize += 1;
00762         else if ( m_veVertexListType[i] == INT_16 ) readingSize += 2;
00763         else if ( m_veVertexListType[i] == UINT_16 )    readingSize += 2;
00764         else if ( m_veVertexListType[i] == INT_32 ) readingSize += 4;
00765         else if ( m_veVertexListType[i] == UINT_32 )    readingSize += 4;
00766         else if ( m_veVertexListType[i] == FLOAT_32 )   readingSize += 4;
00767         else if ( m_veVertexListType[i] == FLOAT_64 )   readingSize += 8;
00768     }
00769     //---------------------------------------------------------------
00770     prModel->NewVertexListByNoVertices();
00771     int vertexNumber = 0;
00772     int index, dim;
00773     unsigned char * prBuffer = new unsigned char[ readingSize ];
00774     //---------------------------------------------------------------
00775     do {
00776         fread( prBuffer, readingSize, 1, inputFile );
00777         index = 0;
00778         //-------------------------------------------------
00779         for ( int i = 0; i < static_cast<int>(m_veVertexListAttrib.size()); ++i ) {
00780             //-----------------------------------
00781             if (   ( m_veVertexListAttrib[i] == X )
00782                 || ( m_veVertexListAttrib[i] == Y ) 
00783                 || ( m_veVertexListAttrib[i] == Z ) ) { 
00784                 //---------------------
00785                 if      ( m_veVertexListAttrib[i] == X )    dim = 0;
00786                 else if ( m_veVertexListAttrib[i] == Y )    dim = 1;
00787                 else                                        dim = 2;
00788                 //else if ( m_veVertexListAttrib[i] == Z )  dim = 2;
00789                 //---------------------
00790                 ConvertBigEnddianToLittleEnddian( m_veVertexListType[i], &(prBuffer[index]) );
00791                 if      ( m_veVertexListType[i] == INT_8 ) {
00792                     prModel->GetVertexList()[vertexNumber][dim] = *((char *)( &( prBuffer[index] ) ));
00793                 }
00794                 else if ( m_veVertexListType[i] == UINT_8 ) {
00795                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned char *)( &( prBuffer[index] ) ));
00796                 }
00797                 else if ( m_veVertexListType[i] == INT_16 ) {
00798                     prModel->GetVertexList()[vertexNumber][dim] = *((short int *)( &( prBuffer[index] ) ));
00799                 }
00800                 else if ( m_veVertexListType[i] == UINT_16 ) {
00801                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned short int *)( &( prBuffer[index] ) ));
00802                 }
00803                 else if ( m_veVertexListType[i] == INT_32 ) {
00804                     prModel->GetVertexList()[vertexNumber][dim] = *((long int *)( &( prBuffer[index] ) ));
00805                 }
00806                 else if ( m_veVertexListType[i] == UINT_32 ) {
00807                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned long int *)( &( prBuffer[index] ) ));
00808                 }
00809                 else if ( m_veVertexListType[i] == FLOAT_32 ) {
00810                     prModel->GetVertexList()[vertexNumber][dim] = *((float *)( &( prBuffer[index] ) ));
00811                 }
00812                 else if ( m_veVertexListType[i] == FLOAT_64 ) {
00813                     prModel->GetVertexList()[vertexNumber][dim] = *((double *)( &( prBuffer[index] ) ));
00814                 }
00815             }
00816             //-----------------------------------
00817             if      ( m_veVertexListType[i] == INT_8 )      index += 1;
00818             else if ( m_veVertexListType[i] == UINT_8 ) index += 1;
00819             else if ( m_veVertexListType[i] == INT_16 ) index += 2;
00820             else if ( m_veVertexListType[i] == UINT_16 )    index += 2;
00821             else if ( m_veVertexListType[i] == INT_32 ) index += 4;
00822             else if ( m_veVertexListType[i] == UINT_32 )    index += 4;
00823             else if ( m_veVertexListType[i] == FLOAT_32 )   index += 4;
00824             else if ( m_veVertexListType[i] == FLOAT_64 )   index += 8;
00825             //-----------------------------------
00826         }
00827         //-------------------------------------------------
00828 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
00829         std::cout << "Vertex# " << vertexNumber << " --> ";
00830         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][0];
00831         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][1];
00832         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][2];
00833         std::cout << "\n";
00834 #endif
00835         //-------------------------------------------------
00836         ++vertexNumber;
00837     } while ( vertexNumber < prModel->GetNoVertices() );
00838     //---------------------------------------------------------------
00839     delete [] prBuffer;
00840 }
00841 //-----------------------------------------------------------------------------
00842 // Process VERTEX LIST BINARY BIG ENDDIAN
00843 template <typename T>
00844 void ReadPly<T>::ProcessVERTEX_LIST_BINARY_BIG_ENDDIAN ( 
00845     FILE * inputFile, OpenGL::XPolygonalModel<T> * const prModel )
00846 {
00847 #ifdef  TAPs_DEBUG_MODE
00848     std::cout << "Processing VERTEX LIST\n";
00849 #endif
00850     //-------------------------------------------------------------------
00851     // Example: x y z and other values
00852     //   0 0 0 ...
00853     //   ...
00854     //   0 0 1 ...
00855     //---------------------------------------------------------------
00856     int readingSize = 0;
00857     //---------------------------------------------------------------
00858     for ( int i = 0; i < static_cast<int>(m_veVertexListType.size()); ++i ) {
00859         if      ( m_veVertexListType[i] == INT_8 )      readingSize += 1;
00860         else if ( m_veVertexListType[i] == UINT_8 ) readingSize += 1;
00861         else if ( m_veVertexListType[i] == INT_16 ) readingSize += 2;
00862         else if ( m_veVertexListType[i] == UINT_16 )    readingSize += 2;
00863         else if ( m_veVertexListType[i] == INT_32 ) readingSize += 4;
00864         else if ( m_veVertexListType[i] == UINT_32 )    readingSize += 4;
00865         else if ( m_veVertexListType[i] == FLOAT_32 )   readingSize += 4;
00866         else if ( m_veVertexListType[i] == FLOAT_64 )   readingSize += 8;
00867     }
00868     //---------------------------------------------------------------
00869     prModel->NewVertexListByNoVertices();
00870     int vertexNumber = 0;
00871     int index, dim;
00872     unsigned char * prBuffer = new unsigned char[ readingSize ];
00873     //---------------------------------------------------------------
00874     do {
00875         fread( prBuffer, readingSize, 1, inputFile );
00876         index = 0;
00877         //-------------------------------------------------
00878         for ( int i = 0; i < static_cast<int>(m_veVertexListAttrib.size()); ++i ) {
00879             //-----------------------------------
00880             if (   ( m_veVertexListAttrib[i] == X )
00881                 || ( m_veVertexListAttrib[i] == Y ) 
00882                 || ( m_veVertexListAttrib[i] == Z ) ) { 
00883                 //---------------------
00884                 if      ( m_veVertexListAttrib[i] == X )    dim = 0;
00885                 else if ( m_veVertexListAttrib[i] == Y )    dim = 1;
00886                 else                                        dim = 2;
00887                 //else if ( m_veVertexListAttrib[i] == Z )  dim = 2;
00888                 //---------------------
00889                 ConvertBigEnddianToLittleEnddian( m_veVertexListType[i], &(prBuffer[index]) );
00890                 if      ( m_veVertexListType[i] == INT_8 ) {
00891                     prModel->GetVertexList()[vertexNumber][dim] = *((char *)( &( prBuffer[index] ) ));
00892                 }
00893                 else if ( m_veVertexListType[i] == UINT_8 ) {
00894                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned char *)( &( prBuffer[index] ) ));
00895                 }
00896                 else if ( m_veVertexListType[i] == INT_16 ) {
00897                     prModel->GetVertexList()[vertexNumber][dim] = *((short int *)( &( prBuffer[index] ) ));
00898                 }
00899                 else if ( m_veVertexListType[i] == UINT_16 ) {
00900                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned short int *)( &( prBuffer[index] ) ));
00901                 }
00902                 else if ( m_veVertexListType[i] == INT_32 ) {
00903                     prModel->GetVertexList()[vertexNumber][dim] = *((long int *)( &( prBuffer[index] ) ));
00904                 }
00905                 else if ( m_veVertexListType[i] == UINT_32 ) {
00906                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned long int *)( &( prBuffer[index] ) ));
00907                 }
00908                 else if ( m_veVertexListType[i] == FLOAT_32 ) {
00909                     prModel->GetVertexList()[vertexNumber][dim] = *((float *)( &( prBuffer[index] ) ));
00910                 }
00911                 else if ( m_veVertexListType[i] == FLOAT_64 ) {
00912                     prModel->GetVertexList()[vertexNumber][dim] = *((double *)( &( prBuffer[index] ) ));
00913                 }
00914             }
00915             //-----------------------------------
00916             if      ( m_veVertexListType[i] == INT_8 )      index += 1;
00917             else if ( m_veVertexListType[i] == UINT_8 ) index += 1;
00918             else if ( m_veVertexListType[i] == INT_16 ) index += 2;
00919             else if ( m_veVertexListType[i] == UINT_16 )    index += 2;
00920             else if ( m_veVertexListType[i] == INT_32 ) index += 4;
00921             else if ( m_veVertexListType[i] == UINT_32 )    index += 4;
00922             else if ( m_veVertexListType[i] == FLOAT_32 )   index += 4;
00923             else if ( m_veVertexListType[i] == FLOAT_64 )   index += 8;
00924             //-----------------------------------
00925         }
00926         //-------------------------------------------------
00927 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
00928         std::cout << "Vertex# " << vertexNumber << " --> ";
00929         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][0];
00930         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][1];
00931         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][2];
00932         std::cout << "\n";
00933 #endif
00934         //-------------------------------------------------
00935         ++vertexNumber;
00936     } while ( vertexNumber < prModel->GetNoVertices() );
00937     //---------------------------------------------------------------
00938     delete [] prBuffer;
00939 }
00940 //-----------------------------------------------------------------------------
00941 // Process VERTEX LIST BINARY BIG ENDDIAN
00942 template <typename T>
00943 void ReadPly<T>::ProcessVERTEX_LIST_BINARY_BIG_ENDDIAN ( 
00944     FILE * inputFile, OpenGL::HalfEdgeModel<T> * const prModel )
00945 {
00946 #ifdef  TAPs_DEBUG_MODE
00947     std::cout << "Processing VERTEX LIST\n";
00948 #endif
00949 }
00950 //-----------------------------------------------------------------------------
00951 //=============================================================================
00952 //-----------------------------------------------------------------------------
00953 // Process FACE LIST BINARY BIG ENDDIAN
00954 template <typename T>
00955 void ReadPly<T>::ProcessFACE_LIST_BINARY_BIG_ENDDIAN ( 
00956     FILE * inputFile, OpenGL::PolygonalModel<T> * const prModel )
00957 {
00958 #ifdef  TAPs_DEBUG_MODE
00959     std::cout << "Processing FACE LIST\n";
00960 #endif
00961     //---------------------------------------------------------------
00962     // Example:  number of vertices for this face followed by vertex numbers
00963     //   4 0  1  2  3
00964     //   ...
00965     //   3 10 11 12
00966     //---------------------------------------------------------------
00967     prModel->NewFaceListByNoFaces();
00968     if ( prModel->GetNoFaces() == 0 )   return;
00969     //---------------------------------------------------------------
00970     int readingSizeBefore = 0;
00971     int readingSizeAfter = 0;
00972     int numberOfVerticesSize = 0;
00973     int vertexIndexSize = 0;
00974     int faceNo = 0;
00975     int vertexNo = 0;
00976     int numberOfVertices = 0;
00977     int index = -1;
00978     unsigned char prBuffer[256];
00979     //---------------------------------------------------------------
00980     for ( int i = 0; i < static_cast<int>( m_veFaceListAttrib.size() ); ++i ) {
00981         if ( m_veFaceListAttrib[i] == LIST_VERTEX_INDICES ) {
00982             index = i;
00983             //---------------------------------------------
00984             // Set data type for number of vertices
00985             switch ( m_veFaceListType[i] ) {
00986                 case INT_8:
00987                 case UINT_8:
00988                     numberOfVerticesSize = 1;
00989                     break;
00990                 case INT_16:
00991                 case UINT_16:
00992                     numberOfVerticesSize = 2;
00993                     break;
00994                 case INT_32:
00995                 case UINT_32:
00996                 case FLOAT_32:
00997                     numberOfVerticesSize = 4;
00998                     break;
00999                 case FLOAT_64:
01000                     numberOfVerticesSize = 8;
01001                     break;
01002             }
01003             //---------------------------------------------
01004             // Set data type for the list of vertex indices
01005             switch ( m_veFaceListType[++i] ) {
01006                 case INT_8:
01007                 case UINT_8:
01008                     vertexIndexSize = 1;
01009                     break;
01010                 case INT_16:
01011                 case UINT_16:
01012                     vertexIndexSize = 2;
01013                     break;
01014                 case INT_32:
01015                 case UINT_32:
01016                 case FLOAT_32:
01017                     vertexIndexSize = 4;
01018                     break;
01019                 case FLOAT_64:
01020                     vertexIndexSize = 8;
01021                     break;
01022             }
01023         }
01024         else {
01025             //---------------------------------------------
01026             // Set data type for this attribute
01027             switch ( m_veFaceListType[i] ) {
01028                 case INT_8:
01029                 case UINT_8:
01030                     if ( index == -1 )  readingSizeBefore += 1;
01031                     else                readingSizeAfter  += 1;
01032                     break;
01033                 case INT_16:
01034                 case UINT_16:
01035                     if ( index == -1 )  readingSizeBefore += 2;
01036                     else                readingSizeAfter  += 2;
01037                     break;
01038                 case INT_32:
01039                 case UINT_32:
01040                 case FLOAT_32:
01041                     if ( index == -1 )  readingSizeBefore += 4;
01042                     else                readingSizeAfter  += 4;
01043                     break;
01044                 case FLOAT_64:
01045                     if ( index == -1 )  readingSizeBefore += 8;
01046                     else                readingSizeAfter  += 8;
01047                     break;
01048             }
01049         }
01050     }
01051     //---------------------------------------------------------------
01052     // Set Faces
01053     do {
01054         //-------------------------------------------------
01055         // Get some attributes before face info
01056         fread( prBuffer, readingSizeBefore, 1, inputFile );
01057         //-------------------------------------------------
01058         // Get number of vertices for each face
01059         fread( prBuffer, numberOfVerticesSize, 1, inputFile );
01060         ConvertBigEnddianToLittleEnddian( m_veFaceListType[index], prBuffer );
01061         switch ( m_veFaceListType[index] ) {
01062             case INT_8:
01063                 numberOfVertices = *((char *)(prBuffer));
01064                 break;
01065             case UINT_8:
01066                 numberOfVertices = *((unsigned char *)(prBuffer));
01067                 break;
01068             case INT_16:
01069                 numberOfVertices = *((short int *)(prBuffer));
01070                 break;
01071             case UINT_16:
01072                 numberOfVertices = *((unsigned short int *)(prBuffer));
01073                 break;
01074             case INT_32:
01075                 numberOfVertices = *((long int *)(prBuffer));
01076                 break;
01077             case UINT_32:
01078                 numberOfVertices = *((unsigned long int *)(prBuffer));
01079                 break;
01080             case FLOAT_32:
01081                 numberOfVertices = *((float *)(prBuffer));
01082                 break;
01083             case FLOAT_64:
01084                 numberOfVertices = *((double *)(prBuffer));
01085                 break;
01086         }
01087         //-------------------------------------------------
01088 #ifdef  TAPs_DEBUG_MODE_DETAIL_4
01089         if ( numberOfVertices <= 0 ) {
01090             std::cerr << "ERROR: This face has " 
01091                       << numberOfVertices << " of vertices!" << std::endl;
01092         }
01093 #endif
01094         prModel->GetFaceList()[faceNo].SetNoVertices( numberOfVertices );
01095         //-------------------------------------------------
01096         // Get the list of vertex indices for each face
01097         fread( prBuffer, vertexIndexSize, numberOfVertices, inputFile );
01098         int index2 = 0;
01099         for ( int i = 0; i < numberOfVertices; ++i ) {
01100             if ( vertexIndexSize > 1 ) {
01101                 ConvertBigEnddianToLittleEnddian( m_veFaceListType[index+1], &(prBuffer[index2]) );
01102             }
01103             switch ( m_veFaceListType[index+1] ) {
01104                 case INT_8:
01105                     vertexNo = *((char *)( &(prBuffer[index2]) ));
01106                     break;
01107                 case UINT_8:
01108                     vertexNo = *((unsigned char *)( &(prBuffer[index2]) ));
01109                     break;
01110                 case INT_16:
01111                     vertexNo = *((short int *)( &(prBuffer[index2]) ));
01112                     break;
01113                 case UINT_16:
01114                     vertexNo = *((unsigned short int *)( &(prBuffer[index2]) ));
01115                     break;
01116                 case INT_32:
01117                     vertexNo = *((long int *)( &(prBuffer[index2]) ));
01118                     break;
01119                 case UINT_32:
01120                     vertexNo = *((unsigned long int *)( &(prBuffer[index2]) ));
01121                     break;
01122                 case FLOAT_32:
01123                     vertexNo = *((float *)( &(prBuffer[index2]) ));
01124                     break;
01125                 case FLOAT_64:
01126                     vertexNo = *((double *)( &(prBuffer[index2]) ));
01127                     break;
01128             }
01129             prModel->GetFaceList()[faceNo].SetVertexNo( i, vertexNo );
01130             index2 += vertexIndexSize;
01131         }
01132         //-------------------------------------------------
01133         // Get some attributes after face info
01134         fread( prBuffer, readingSizeAfter, 1, inputFile );
01135         //-------------------------------------------------
01136 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
01137         std::cout << "Face# " << faceNo << " has " << numberOfVertices << " vertices --> ";
01138         for ( int i = 0; i < numberOfVertices; ++i ) {
01139             std::cout << "\t" << vertexNo;
01140         }
01141         std::cout << "\n";
01142 #endif
01143         //-------------------------------------------------
01144         ++faceNo;
01145         //-------------------------------------------------
01146     } while ( faceNo < prModel->GetNoFaces() );
01147 }
01148 //-----------------------------------------------------------------------------
01149 // Process FACE LIST BINARY BIG ENDDIAN
01150 template <typename T>
01151 void ReadPly<T>::ProcessFACE_LIST_BINARY_BIG_ENDDIAN ( 
01152     FILE * inputFile, OpenGL::XPolygonalModel<T> * const prModel )
01153 {
01154 #ifdef  TAPs_DEBUG_MODE
01155     std::cout << "Processing FACE LIST\n";
01156 #endif
01157     //---------------------------------------------------------------
01158     // Example:  number of vertices for this face followed by vertex numbers
01159     //   4 0  1  2  3
01160     //   ...
01161     //   3 10 11 12
01162     //---------------------------------------------------------------
01163     prModel->NewFaceListByNoFaces();
01164     if ( prModel->GetNoFaces() == 0 )   return;
01165     //---------------------------------------------------------------
01166     int readingSizeBefore = 0;
01167     int readingSizeAfter = 0;
01168     int numberOfVerticesSize = 0;
01169     int vertexIndexSize = 0;
01170     int faceNo = 0;
01171     int vertexNo = 0;
01172     int numberOfVertices = 0;
01173     int index = -1;
01174     unsigned char prBuffer[256];
01175     //---------------------------------------------------------------
01176     for ( int i = 0; i < static_cast<int>( m_veFaceListAttrib.size() ); ++i ) {
01177         if ( m_veFaceListAttrib[i] == LIST_VERTEX_INDICES ) {
01178             index = i;
01179             //---------------------------------------------
01180             // Set data type for number of vertices
01181             switch ( m_veFaceListType[i] ) {
01182                 case INT_8:
01183                 case UINT_8:
01184                     numberOfVerticesSize = 1;
01185                     break;
01186                 case INT_16:
01187                 case UINT_16:
01188                     numberOfVerticesSize = 2;
01189                     break;
01190                 case INT_32:
01191                 case UINT_32:
01192                 case FLOAT_32:
01193                     numberOfVerticesSize = 4;
01194                     break;
01195                 case FLOAT_64:
01196                     numberOfVerticesSize = 8;
01197                     break;
01198             }
01199             //---------------------------------------------
01200             // Set data type for the list of vertex indices
01201             switch ( m_veFaceListType[++i] ) {
01202                 case INT_8:
01203                 case UINT_8:
01204                     vertexIndexSize = 1;
01205                     break;
01206                 case INT_16:
01207                 case UINT_16:
01208                     vertexIndexSize = 2;
01209                     break;
01210                 case INT_32:
01211                 case UINT_32:
01212                 case FLOAT_32:
01213                     vertexIndexSize = 4;
01214                     break;
01215                 case FLOAT_64:
01216                     vertexIndexSize = 8;
01217                     break;
01218             }
01219         }
01220         else {
01221             //---------------------------------------------
01222             // Set data type for this attribute
01223             switch ( m_veFaceListType[i] ) {
01224                 case INT_8:
01225                 case UINT_8:
01226                     if ( index == -1 )  readingSizeBefore += 1;
01227                     else                readingSizeAfter  += 1;
01228                     break;
01229                 case INT_16:
01230                 case UINT_16:
01231                     if ( index == -1 )  readingSizeBefore += 2;
01232                     else                readingSizeAfter  += 2;
01233                     break;
01234                 case INT_32:
01235                 case UINT_32:
01236                 case FLOAT_32:
01237                     if ( index == -1 )  readingSizeBefore += 4;
01238                     else                readingSizeAfter  += 4;
01239                     break;
01240                 case FLOAT_64:
01241                     if ( index == -1 )  readingSizeBefore += 8;
01242                     else                readingSizeAfter  += 8;
01243                     break;
01244             }
01245         }
01246     }
01247     //---------------------------------------------------------------
01248     // Set Faces
01249     do {
01250         //-------------------------------------------------
01251         // Get some attributes before face info
01252         fread( prBuffer, readingSizeBefore, 1, inputFile );
01253         //-------------------------------------------------
01254         // Get number of vertices for each face
01255         fread( prBuffer, numberOfVerticesSize, 1, inputFile );
01256         ConvertBigEnddianToLittleEnddian( m_veFaceListType[index], prBuffer );
01257         switch ( m_veFaceListType[index] ) {
01258             case INT_8:
01259                 numberOfVertices = *((char *)(prBuffer));
01260                 break;
01261             case UINT_8:
01262                 numberOfVertices = *((unsigned char *)(prBuffer));
01263                 break;
01264             case INT_16:
01265                 numberOfVertices = *((short int *)(prBuffer));
01266                 break;
01267             case UINT_16:
01268                 numberOfVertices = *((unsigned short int *)(prBuffer));
01269                 break;
01270             case INT_32:
01271                 numberOfVertices = *((long int *)(prBuffer));
01272                 break;
01273             case UINT_32:
01274                 numberOfVertices = *((unsigned long int *)(prBuffer));
01275                 break;
01276             case FLOAT_32:
01277                 numberOfVertices = *((float *)(prBuffer));
01278                 break;
01279             case FLOAT_64:
01280                 numberOfVertices = *((double *)(prBuffer));
01281                 break;
01282         }
01283         //-------------------------------------------------
01284 #ifdef  TAPs_DEBUG_MODE_DETAIL_4
01285         if ( numberOfVertices <= 0 ) {
01286             std::cerr << "ERROR: This face has " 
01287                       << numberOfVertices << " of vertices!" << std::endl;
01288         }
01289 #endif
01290         prModel->GetFaceList()[faceNo].SetNoVertices( numberOfVertices );
01291         //-------------------------------------------------
01292         // Get the list of vertex indices for each face
01293         fread( prBuffer, vertexIndexSize, numberOfVertices, inputFile );
01294         int index2 = 0;
01295         for ( int i = 0; i < numberOfVertices; ++i ) {
01296             if ( vertexIndexSize > 1 ) {
01297                 ConvertBigEnddianToLittleEnddian( m_veFaceListType[index+1], &(prBuffer[index2]) );
01298             }
01299             switch ( m_veFaceListType[index+1] ) {
01300                 case INT_8:
01301                     vertexNo = *((char *)( &(prBuffer[index2]) ));
01302                     break;
01303                 case UINT_8:
01304                     vertexNo = *((unsigned char *)( &(prBuffer[index2]) ));
01305                     break;
01306                 case INT_16:
01307                     vertexNo = *((short int *)( &(prBuffer[index2]) ));
01308                     break;
01309                 case UINT_16:
01310                     vertexNo = *((unsigned short int *)( &(prBuffer[index2]) ));
01311                     break;
01312                 case INT_32:
01313                     vertexNo = *((long int *)( &(prBuffer[index2]) ));
01314                     break;
01315                 case UINT_32:
01316                     vertexNo = *((unsigned long int *)( &(prBuffer[index2]) ));
01317                     break;
01318                 case FLOAT_32:
01319                     vertexNo = *((float *)( &(prBuffer[index2]) ));
01320                     break;
01321                 case FLOAT_64:
01322                     vertexNo = *((double *)( &(prBuffer[index2]) ));
01323                     break;
01324             }
01325             prModel->GetFaceList()[faceNo].SetVertexNo( i, vertexNo );
01326             index2 += vertexIndexSize;
01327         }
01328         //-------------------------------------------------
01329         // Get some attributes after face info
01330         fread( prBuffer, readingSizeAfter, 1, inputFile );
01331         //-------------------------------------------------
01332 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
01333         std::cout << "Face# " << faceNo << " has " << numberOfVertices << " vertices --> ";
01334         for ( int i = 0; i < numberOfVertices; ++i ) {
01335             std::cout << "\t" << vertexNo;
01336         }
01337         std::cout << "\n";
01338 #endif
01339         //-------------------------------------------------
01340         ++faceNo;
01341         //-------------------------------------------------
01342     } while ( faceNo < prModel->GetNoFaces() );
01343 }
01344 //-----------------------------------------------------------------------------
01345 // Process FACE LIST BINARY BIG ENDDIAN
01346 template <typename T>
01347 void ReadPly<T>::ProcessFACE_LIST_BINARY_BIG_ENDDIAN ( 
01348     FILE * inputFile, OpenGL::HalfEdgeModel<T> * const prModel )
01349 {
01350 #ifdef  TAPs_DEBUG_MODE
01351     std::cout << "Processing FACE LIST\n";
01352 #endif
01353 }
01354 //-----------------------------------------------------------------------------
01355 //=============================================================================
01356 //-----------------------------------------------------------------------------
01357 // Process VERTEX LIST BINARY LITTLE ENDDIAN
01358 template <typename T>
01359 void ReadPly<T>::ProcessVERTEX_LIST_BINARY_LITTLE_ENDDIAN ( 
01360     FILE * inputFile, OpenGL::PolygonalModel<T> * const prModel )
01361 {
01362 #ifdef  TAPs_DEBUG_MODE
01363     std::cout << "Processing VERTEX LIST\n";
01364 #endif
01365     //-------------------------------------------------------------------
01366     // Example: x y z and other values
01367     //   0 0 0 ...
01368     //   ...
01369     //   0 0 1 ...
01370     //---------------------------------------------------------------
01371     int readingSize = 0;
01372     //---------------------------------------------------------------
01373     for ( int i = 0; i < static_cast<int>(m_veVertexListType.size()); ++i ) {
01374         if      ( m_veVertexListType[i] == INT_8 )      readingSize += 1;
01375         else if ( m_veVertexListType[i] == UINT_8 ) readingSize += 1;
01376         else if ( m_veVertexListType[i] == INT_16 ) readingSize += 2;
01377         else if ( m_veVertexListType[i] == UINT_16 )    readingSize += 2;
01378         else if ( m_veVertexListType[i] == INT_32 ) readingSize += 4;
01379         else if ( m_veVertexListType[i] == UINT_32 )    readingSize += 4;
01380         else if ( m_veVertexListType[i] == FLOAT_32 )   readingSize += 4;
01381         else if ( m_veVertexListType[i] == FLOAT_64 )   readingSize += 8;
01382     }
01383     //---------------------------------------------------------------
01384     prModel->NewVertexListByNoVertices();
01385     int vertexNumber = 0;
01386     int index, dim;
01387     unsigned char * prBuffer = new unsigned char[ readingSize ];
01388     //---------------------------------------------------------------
01389     do {
01390         fread( prBuffer, readingSize, 1, inputFile );
01391         index = 0;
01392         //-------------------------------------------------
01393         for ( int i = 0; i < static_cast<int>(m_veVertexListAttrib.size()); ++i ) {
01394             //-----------------------------------
01395             if (   ( m_veVertexListAttrib[i] == X )
01396                 || ( m_veVertexListAttrib[i] == Y ) 
01397                 || ( m_veVertexListAttrib[i] == Z ) ) { 
01398                 //---------------------
01399                 if      ( m_veVertexListAttrib[i] == X )    dim = 0;
01400                 else if ( m_veVertexListAttrib[i] == Y )    dim = 1;
01401                 else                                        dim = 2;
01402                 //else if ( m_veVertexListAttrib[i] == Z )  dim = 2;
01403                 //---------------------
01404                 if      ( m_veVertexListType[i] == INT_8 ) {
01405                     prModel->GetVertexList()[vertexNumber][dim] = *((char *)( &( prBuffer[index] ) ));
01406                 }
01407                 else if ( m_veVertexListType[i] == UINT_8 ) {
01408                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned char *)( &( prBuffer[index] ) ));
01409                 }
01410                 else if ( m_veVertexListType[i] == INT_16 ) {
01411                     prModel->GetVertexList()[vertexNumber][dim] = *((short int *)( &( prBuffer[index] ) ));
01412                 }
01413                 else if ( m_veVertexListType[i] == UINT_16 ) {
01414                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned short int *)( &( prBuffer[index] ) ));
01415                 }
01416                 else if ( m_veVertexListType[i] == INT_32 ) {
01417                     prModel->GetVertexList()[vertexNumber][dim] = *((long int *)( &( prBuffer[index] ) ));
01418                 }
01419                 else if ( m_veVertexListType[i] == UINT_32 ) {
01420                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned long int *)( &( prBuffer[index] ) ));
01421                 }
01422                 else if ( m_veVertexListType[i] == FLOAT_32 ) {
01423                     prModel->GetVertexList()[vertexNumber][dim] = *((float *)( &( prBuffer[index] ) ));
01424                 }
01425                 else if ( m_veVertexListType[i] == FLOAT_64 ) {
01426                     prModel->GetVertexList()[vertexNumber][dim] = *((double *)( &( prBuffer[index] ) ));
01427                 }
01428             }
01429             //-----------------------------------
01430             if      ( m_veVertexListType[i] == INT_8 )      index += 1;
01431             else if ( m_veVertexListType[i] == UINT_8 ) index += 1;
01432             else if ( m_veVertexListType[i] == INT_16 ) index += 2;
01433             else if ( m_veVertexListType[i] == UINT_16 )    index += 2;
01434             else if ( m_veVertexListType[i] == INT_32 ) index += 4;
01435             else if ( m_veVertexListType[i] == UINT_32 )    index += 4;
01436             else if ( m_veVertexListType[i] == FLOAT_32 )   index += 4;
01437             else if ( m_veVertexListType[i] == FLOAT_64 )   index += 8;
01438             //-----------------------------------
01439         }
01440         //-------------------------------------------------
01441 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
01442         std::cout << "Vertex# " << vertexNumber << " --> ";
01443         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][0];
01444         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][1];
01445         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][2];
01446         std::cout << "\n";
01447 #endif
01448         //-------------------------------------------------
01449         ++vertexNumber;
01450     } while ( vertexNumber < prModel->GetNoVertices() );
01451     //---------------------------------------------------------------
01452     delete [] prBuffer;
01453 }
01454 //-----------------------------------------------------------------------------
01455 // Process VERTEX LIST BINARY LITTLE ENDDIAN
01456 template <typename T>
01457 void ReadPly<T>::ProcessVERTEX_LIST_BINARY_LITTLE_ENDDIAN ( 
01458     FILE * inputFile, OpenGL::XPolygonalModel<T> * const prModel )
01459 {
01460 #ifdef  TAPs_DEBUG_MODE
01461     std::cout << "Processing VERTEX LIST\n";
01462 #endif
01463     //-------------------------------------------------------------------
01464     // Example: x y z and other values
01465     //   0 0 0 ...
01466     //   ...
01467     //   0 0 1 ...
01468     //---------------------------------------------------------------
01469     int readingSize = 0;
01470     //---------------------------------------------------------------
01471     for ( int i = 0; i < static_cast<int>(m_veVertexListType.size()); ++i ) {
01472         if      ( m_veVertexListType[i] == INT_8 )      readingSize += 1;
01473         else if ( m_veVertexListType[i] == UINT_8 ) readingSize += 1;
01474         else if ( m_veVertexListType[i] == INT_16 ) readingSize += 2;
01475         else if ( m_veVertexListType[i] == UINT_16 )    readingSize += 2;
01476         else if ( m_veVertexListType[i] == INT_32 ) readingSize += 4;
01477         else if ( m_veVertexListType[i] == UINT_32 )    readingSize += 4;
01478         else if ( m_veVertexListType[i] == FLOAT_32 )   readingSize += 4;
01479         else if ( m_veVertexListType[i] == FLOAT_64 )   readingSize += 8;
01480     }
01481     //---------------------------------------------------------------
01482     prModel->NewVertexListByNoVertices();
01483     int vertexNumber = 0;
01484     int index, dim;
01485     unsigned char * prBuffer = new unsigned char[ readingSize ];
01486     //---------------------------------------------------------------
01487     do {
01488         fread( prBuffer, readingSize, 1, inputFile );
01489         index = 0;
01490         //-------------------------------------------------
01491         for ( int i = 0; i < static_cast<int>(m_veVertexListAttrib.size()); ++i ) {
01492             //-----------------------------------
01493             if (   ( m_veVertexListAttrib[i] == X )
01494                 || ( m_veVertexListAttrib[i] == Y ) 
01495                 || ( m_veVertexListAttrib[i] == Z ) ) { 
01496                 //---------------------
01497                 if      ( m_veVertexListAttrib[i] == X )    dim = 0;
01498                 else if ( m_veVertexListAttrib[i] == Y )    dim = 1;
01499                 else                                        dim = 2;
01500                 //else if ( m_veVertexListAttrib[i] == Z )  dim = 2;
01501                 //---------------------
01502                 if      ( m_veVertexListType[i] == INT_8 ) {
01503                     prModel->GetVertexList()[vertexNumber][dim] = *((char *)( &( prBuffer[index] ) ));
01504                 }
01505                 else if ( m_veVertexListType[i] == UINT_8 ) {
01506                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned char *)( &( prBuffer[index] ) ));
01507                 }
01508                 else if ( m_veVertexListType[i] == INT_16 ) {
01509                     prModel->GetVertexList()[vertexNumber][dim] = *((short int *)( &( prBuffer[index] ) ));
01510                 }
01511                 else if ( m_veVertexListType[i] == UINT_16 ) {
01512                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned short int *)( &( prBuffer[index] ) ));
01513                 }
01514                 else if ( m_veVertexListType[i] == INT_32 ) {
01515                     prModel->GetVertexList()[vertexNumber][dim] = *((long int *)( &( prBuffer[index] ) ));
01516                 }
01517                 else if ( m_veVertexListType[i] == UINT_32 ) {
01518                     prModel->GetVertexList()[vertexNumber][dim] = *((unsigned long int *)( &( prBuffer[index] ) ));
01519                 }
01520                 else if ( m_veVertexListType[i] == FLOAT_32 ) {
01521                     prModel->GetVertexList()[vertexNumber][dim] = *((float *)( &( prBuffer[index] ) ));
01522                 }
01523                 else if ( m_veVertexListType[i] == FLOAT_64 ) {
01524                     prModel->GetVertexList()[vertexNumber][dim] = *((double *)( &( prBuffer[index] ) ));
01525                 }
01526             }
01527             //-----------------------------------
01528             if      ( m_veVertexListType[i] == INT_8 )      index += 1;
01529             else if ( m_veVertexListType[i] == UINT_8 ) index += 1;
01530             else if ( m_veVertexListType[i] == INT_16 ) index += 2;
01531             else if ( m_veVertexListType[i] == UINT_16 )    index += 2;
01532             else if ( m_veVertexListType[i] == INT_32 ) index += 4;
01533             else if ( m_veVertexListType[i] == UINT_32 )    index += 4;
01534             else if ( m_veVertexListType[i] == FLOAT_32 )   index += 4;
01535             else if ( m_veVertexListType[i] == FLOAT_64 )   index += 8;
01536             //-----------------------------------
01537         }
01538         //-------------------------------------------------
01539 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
01540         std::cout << "Vertex# " << vertexNumber << " --> ";
01541         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][0];
01542         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][1];
01543         std::cout << "\t" << prModel->GetVertexList()[vertexNumber][2];
01544         std::cout << "\n";
01545 #endif
01546         //-------------------------------------------------
01547         ++vertexNumber;
01548     } while ( vertexNumber < prModel->GetNoVertices() );
01549     //---------------------------------------------------------------
01550     delete [] prBuffer;
01551 }
01552 //-----------------------------------------------------------------------------
01553 // Process VERTEX LIST BINARY LITTLE ENDDIAN
01554 template <typename T>
01555 void ReadPly<T>::ProcessVERTEX_LIST_BINARY_LITTLE_ENDDIAN ( 
01556     FILE * inputFile, OpenGL::HalfEdgeModel<T> * const prModel )
01557 {
01558 #ifdef  TAPs_DEBUG_MODE
01559     std::cout << "Processing VERTEX LIST\n";
01560 #endif
01561 }
01562 //-----------------------------------------------------------------------------
01563 //=============================================================================
01564 //-----------------------------------------------------------------------------
01565 // Process FACE LIST BINARY LITTLE ENDDIAN
01566 template <typename T>
01567 void ReadPly<T>::ProcessFACE_LIST_BINARY_LITTLE_ENDDIAN ( 
01568     FILE * inputFile, OpenGL::PolygonalModel<T> * const prModel )
01569 {
01570 #ifdef  TAPs_DEBUG_MODE
01571     std::cout << "Processing FACE LIST\n";
01572 #endif
01573     //---------------------------------------------------------------
01574     // Example:  number of vertices for this face followed by vertex numbers
01575     //   4 0  1  2  3
01576     //   ...
01577     //   3 10 11 12
01578     //---------------------------------------------------------------
01579     prModel->NewFaceListByNoFaces();
01580     if ( prModel->GetNoFaces() == 0 )   return;
01581     //---------------------------------------------------------------
01582     int readingSizeBefore = 0;
01583     int readingSizeAfter = 0;
01584     int numberOfVerticesSize = 0;
01585     int vertexIndexSize = 0;
01586     int faceNo = 0;
01587     int vertexNo = 0;
01588     int numberOfVertices = 0;
01589     int index = -1;
01590     unsigned char prBuffer[256];
01591     //---------------------------------------------------------------
01592     for ( int i = 0; i < static_cast<int>( m_veFaceListAttrib.size() ); ++i ) {
01593         if ( m_veFaceListAttrib[i] == LIST_VERTEX_INDICES ) {
01594             index = i;
01595             //---------------------------------------------
01596             // Set data type for number of vertices
01597             switch ( m_veFaceListType[i] ) {
01598                 case INT_8:
01599                 case UINT_8:
01600                     numberOfVerticesSize = 1;
01601                     break;
01602                 case INT_16:
01603                 case UINT_16:
01604                     numberOfVerticesSize = 2;
01605                     break;
01606                 case INT_32:
01607                 case UINT_32:
01608                 case FLOAT_32:
01609                     numberOfVerticesSize = 4;
01610                     break;
01611                 case FLOAT_64:
01612                     numberOfVerticesSize = 8;
01613                     break;
01614             }
01615             //---------------------------------------------
01616             // Set data type for the list of vertex indices
01617             switch ( m_veFaceListType[++i] ) {
01618                 case INT_8:
01619                 case UINT_8:
01620                     vertexIndexSize = 1;
01621                     break;
01622                 case INT_16:
01623                 case UINT_16:
01624                     vertexIndexSize = 2;
01625                     break;
01626                 case INT_32:
01627                 case UINT_32:
01628                 case FLOAT_32:
01629                     vertexIndexSize = 4;
01630                     break;
01631                 case FLOAT_64:
01632                     vertexIndexSize = 8;
01633                     break;
01634             }
01635         }
01636         else {
01637             //---------------------------------------------
01638             // Set data type for this attribute
01639             switch ( m_veFaceListType[i] ) {
01640                 case INT_8:
01641                 case UINT_8:
01642                     if ( index == -1 )  readingSizeBefore += 1;
01643                     else                readingSizeAfter  += 1;
01644                     break;
01645                 case INT_16:
01646                 case UINT_16:
01647                     if ( index == -1 )  readingSizeBefore += 2;
01648                     else                readingSizeAfter  += 2;
01649                     break;
01650                 case INT_32:
01651                 case UINT_32:
01652                 case FLOAT_32:
01653                     if ( index == -1 )  readingSizeBefore += 4;
01654                     else                readingSizeAfter  += 4;
01655                     break;
01656                 case FLOAT_64:
01657                     if ( index == -1 )  readingSizeBefore += 8;
01658                     else                readingSizeAfter  += 8;
01659                     break;
01660             }
01661         }
01662     }
01663     //---------------------------------------------------------------
01664     // Set Faces
01665     do {
01666         //-------------------------------------------------
01667         // Get some attributes before face info
01668         fread( prBuffer, readingSizeBefore, 1, inputFile );
01669         //-------------------------------------------------
01670         // Get number of vertices for each face
01671         fread( prBuffer, numberOfVerticesSize, 1, inputFile );
01672         switch ( m_veFaceListType[index] ) {
01673             case INT_8:
01674                 numberOfVertices = *((char *)(prBuffer));
01675                 break;
01676             case UINT_8:
01677                 numberOfVertices = *((unsigned char *)(prBuffer));
01678                 break;
01679             case INT_16:
01680                 numberOfVertices = *((short int *)(prBuffer));
01681                 break;
01682             case UINT_16:
01683                 numberOfVertices = *((unsigned short int *)(prBuffer));
01684                 break;
01685             case INT_32:
01686                 numberOfVertices = *((long int *)(prBuffer));
01687                 break;
01688             case UINT_32:
01689                 numberOfVertices = *((unsigned long int *)(prBuffer));
01690                 break;
01691             case FLOAT_32:
01692                 numberOfVertices = *((float *)(prBuffer));
01693                 break;
01694             case FLOAT_64:
01695                 numberOfVertices = *((double *)(prBuffer));
01696                 break;
01697         }
01698         //-------------------------------------------------
01699 #ifdef  TAPs_DEBUG_MODE_DETAIL_4
01700         if ( numberOfVertices <= 0 ) {
01701             std::cerr << "ERROR: This face has " 
01702                       << numberOfVertices << " of vertices!" << std::endl;
01703         }
01704 #endif
01705         prModel->GetFaceList()[faceNo].SetNoVertices( numberOfVertices );
01706         //-------------------------------------------------
01707         // Get the list of vertex indices for each face
01708         fread( prBuffer, vertexIndexSize, numberOfVertices, inputFile );
01709         int index2 = 0;
01710         for ( int i = 0; i < numberOfVertices; ++i ) {
01711             switch ( m_veFaceListType[index+1] ) {
01712                 case INT_8:
01713                     vertexNo = *((char *)( &(prBuffer[index2]) ));
01714                     break;
01715                 case UINT_8:
01716                     vertexNo = *((unsigned char *)( &(prBuffer[index2]) ));
01717                     break;
01718                 case INT_16:
01719                     vertexNo = *((short int *)( &(prBuffer[index2]) ));
01720                     break;
01721                 case UINT_16:
01722                     vertexNo = *((unsigned short int *)( &(prBuffer[index2]) ));
01723                     break;
01724                 case INT_32:
01725                     vertexNo = *((long int *)( &(prBuffer[index2]) ));
01726                     break;
01727                 case UINT_32:
01728                     vertexNo = *((unsigned long int *)( &(prBuffer[index2]) ));
01729                     break;
01730                 case FLOAT_32:
01731                     vertexNo = *((float *)( &(prBuffer[index2]) ));
01732                     break;
01733                 case FLOAT_64:
01734                     vertexNo = *((double *)( &(prBuffer[index2]) ));
01735                     break;
01736             }
01737             prModel->GetFaceList()[faceNo].SetVertexNo( i, vertexNo );
01738             index2 += vertexIndexSize;
01739         }
01740         //-------------------------------------------------
01741         // Get some attributes after face info
01742         fread( prBuffer, readingSizeAfter, 1, inputFile );
01743         //-------------------------------------------------
01744 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
01745         std::cout << "Face# " << faceNo << " has " << numberOfVertices << " vertices --> ";
01746         for ( int i = 0; i < numberOfVertices; ++i ) {
01747             std::cout << "\t" << vertexNo;
01748         }
01749         std::cout << "\n";
01750 #endif
01751         //-------------------------------------------------
01752         ++faceNo;
01753         //-------------------------------------------------
01754     } while ( faceNo < prModel->GetNoFaces() );
01755 }
01756 //-----------------------------------------------------------------------------
01757 // Process FACE LIST BINARY LITTLE ENDDIAN
01758 template <typename T>
01759 void ReadPly<T>::ProcessFACE_LIST_BINARY_LITTLE_ENDDIAN ( 
01760     FILE * inputFile, OpenGL::XPolygonalModel<T> * const prModel )
01761 {
01762 #ifdef  TAPs_DEBUG_MODE
01763     std::cout << "Processing FACE LIST\n";
01764 #endif
01765     //---------------------------------------------------------------
01766     // Example:  number of vertices for this face followed by vertex numbers
01767     //   4 0  1  2  3
01768     //   ...
01769     //   3 10 11 12
01770     //---------------------------------------------------------------
01771     prModel->NewFaceListByNoFaces();
01772     if ( prModel->GetNoFaces() == 0 )   return;
01773     //---------------------------------------------------------------
01774     int readingSizeBefore = 0;
01775     int readingSizeAfter = 0;
01776     int numberOfVerticesSize = 0;
01777     int vertexIndexSize = 0;
01778     int faceNo = 0;
01779     int vertexNo = 0;
01780     int numberOfVertices = 0;
01781     int index = -1;
01782     unsigned char prBuffer[256];
01783     //---------------------------------------------------------------
01784     for ( int i = 0; i < static_cast<int>( m_veFaceListAttrib.size() ); ++i ) {
01785         if ( m_veFaceListAttrib[i] == LIST_VERTEX_INDICES ) {
01786             index = i;
01787             //---------------------------------------------
01788             // Set data type for number of vertices
01789             switch ( m_veFaceListType[i] ) {
01790                 case INT_8:
01791                 case UINT_8:
01792                     numberOfVerticesSize = 1;
01793                     break;
01794                 case INT_16:
01795                 case UINT_16:
01796                     numberOfVerticesSize = 2;
01797                     break;
01798                 case INT_32:
01799                 case UINT_32:
01800                 case FLOAT_32:
01801                     numberOfVerticesSize = 4;
01802                     break;
01803                 case FLOAT_64:
01804                     numberOfVerticesSize = 8;
01805                     break;
01806             }
01807             //---------------------------------------------
01808             // Set data type for the list of vertex indices
01809             switch ( m_veFaceListType[++i] ) {
01810                 case INT_8:
01811                 case UINT_8:
01812                     vertexIndexSize = 1;
01813                     break;
01814                 case INT_16:
01815                 case UINT_16:
01816                     vertexIndexSize = 2;
01817                     break;
01818                 case INT_32:
01819                 case UINT_32:
01820                 case FLOAT_32:
01821                     vertexIndexSize = 4;
01822                     break;
01823                 case FLOAT_64:
01824                     vertexIndexSize = 8;
01825                     break;
01826             }
01827         }
01828         else {
01829             //---------------------------------------------
01830             // Set data type for this attribute
01831             switch ( m_veFaceListType[i] ) {
01832                 case INT_8:
01833                 case UINT_8:
01834                     if ( index == -1 )  readingSizeBefore += 1;
01835                     else                readingSizeAfter  += 1;
01836                     break;
01837                 case INT_16:
01838                 case UINT_16:
01839                     if ( index == -1 )  readingSizeBefore += 2;
01840                     else                readingSizeAfter  += 2;
01841                     break;
01842                 case INT_32:
01843                 case UINT_32:
01844                 case FLOAT_32:
01845                     if ( index == -1 )  readingSizeBefore += 4;
01846                     else                readingSizeAfter  += 4;
01847                     break;
01848                 case FLOAT_64:
01849                     if ( index == -1 )  readingSizeBefore += 8;
01850                     else                readingSizeAfter  += 8;
01851                     break;
01852             }
01853         }
01854     }
01855     //---------------------------------------------------------------
01856     // Set Faces
01857     do {
01858         //-------------------------------------------------
01859         // Get some attributes before face info
01860         fread( prBuffer, readingSizeBefore, 1, inputFile );
01861         //-------------------------------------------------
01862         // Get number of vertices for each face
01863         fread( prBuffer, numberOfVerticesSize, 1, inputFile );
01864         switch ( m_veFaceListType[index] ) {
01865             case INT_8:
01866                 numberOfVertices = *((char *)(prBuffer));
01867                 break;
01868             case UINT_8:
01869                 numberOfVertices = *((unsigned char *)(prBuffer));
01870                 break;
01871             case INT_16:
01872                 numberOfVertices = *((short int *)(prBuffer));
01873                 break;
01874             case UINT_16:
01875                 numberOfVertices = *((unsigned short int *)(prBuffer));
01876                 break;
01877             case INT_32:
01878                 numberOfVertices = *((long int *)(prBuffer));
01879                 break;
01880             case UINT_32:
01881                 numberOfVertices = *((unsigned long int *)(prBuffer));
01882                 break;
01883             case FLOAT_32:
01884                 numberOfVertices = *((float *)(prBuffer));
01885                 break;
01886             case FLOAT_64:
01887                 numberOfVertices = *((double *)(prBuffer));
01888                 break;
01889         }
01890         //-------------------------------------------------
01891 #ifdef  TAPs_DEBUG_MODE_DETAIL_4
01892         if ( numberOfVertices <= 0 ) {
01893             std::cerr << "ERROR: This face has " 
01894                       << numberOfVertices << " of vertices!" << std::endl;
01895         }
01896 #endif
01897         prModel->GetFaceList()[faceNo].SetNoVertices( numberOfVertices );
01898         //-------------------------------------------------
01899         // Get the list of vertex indices for each face
01900         fread( prBuffer, vertexIndexSize, numberOfVertices, inputFile );
01901         int index2 = 0;
01902         for ( int i = 0; i < numberOfVertices; ++i ) {
01903             switch ( m_veFaceListType[index+1] ) {
01904                 case INT_8:
01905                     vertexNo = *((char *)( &(prBuffer[index2]) ));
01906                     break;
01907                 case UINT_8:
01908                     vertexNo = *((unsigned char *)( &(prBuffer[index2]) ));
01909                     break;
01910                 case INT_16:
01911                     vertexNo = *((short int *)( &(prBuffer[index2]) ));
01912                     break;
01913                 case UINT_16:
01914                     vertexNo = *((unsigned short int *)( &(prBuffer[index2]) ));
01915                     break;
01916                 case INT_32:
01917                     vertexNo = *((long int *)( &(prBuffer[index2]) ));
01918                     break;
01919                 case UINT_32:
01920                     vertexNo = *((unsigned long int *)( &(prBuffer[index2]) ));
01921                     break;
01922                 case FLOAT_32:
01923                     vertexNo = *((float *)( &(prBuffer[index2]) ));
01924                     break;
01925                 case FLOAT_64:
01926                     vertexNo = *((double *)( &(prBuffer[index2]) ));
01927                     break;
01928             }
01929             prModel->GetFaceList()[faceNo].SetVertexNo( i, vertexNo );
01930             index2 += vertexIndexSize;
01931         }
01932         //-------------------------------------------------
01933         // Get some attributes after face info
01934         fread( prBuffer, readingSizeAfter, 1, inputFile );
01935         //-------------------------------------------------
01936 #ifdef  TAPs_DEBUG_MODE_DETAIL_3
01937         std::cout << "Face# " << faceNo << " has " << numberOfVertices << " vertices --> ";
01938         for ( int i = 0; i < numberOfVertices; ++i ) {
01939             std::cout << "\t" << vertexNo;
01940         }
01941         std::cout << "\n";
01942 #endif
01943         //-------------------------------------------------
01944         ++faceNo;
01945         //-------------------------------------------------
01946     } while ( faceNo < prModel->GetNoFaces() );
01947 }
01948 //-----------------------------------------------------------------------------
01949 // Process FACE LIST BINARY LITTLE ENDDIAN
01950 template <typename T>
01951 void ReadPly<T>::ProcessFACE_LIST_BINARY_LITTLE_ENDDIAN ( 
01952     FILE * inputFile, OpenGL::HalfEdgeModel<T> * const prModel )
01953 {
01954 #ifdef  TAPs_DEBUG_MODE
01955     std::cout << "Processing FACE LIST\n";
01956 #endif
01957 }
01958 //-----------------------------------------------------------------------------
01959 //=============================================================================
01960 //-----------------------------------------------------------------------------
01961 // Convert Big Enddian to Little Enddian
01962 template <typename T>
01963 void ReadPly<T>::ConvertBigEnddianToLittleEnddian ( 
01964     unsigned char dataType, unsigned char * prData )
01965 {
01966     unsigned char temp;
01967     switch ( dataType ) {
01968         case INT_16:
01969         case UINT_16:
01970             temp      = prData[0];
01971             prData[0] = prData[1];
01972             prData[1] = temp;
01973             break;
01974         case INT_32:
01975         case UINT_32:
01976         case FLOAT_32:
01977             temp      = prData[0];
01978             prData[0] = prData[3];
01979             prData[3] = temp;
01980             temp      = prData[1];
01981             prData[1] = prData[2];
01982             prData[2] = temp;
01983             break;
01984         case FLOAT_64:
01985             temp      = prData[0];
01986             prData[0] = prData[7];
01987             prData[7] = temp;
01988             temp      = prData[1];
01989             prData[1] = prData[6];
01990             prData[6] = temp;
01991             temp      = prData[2];
01992             prData[2] = prData[5];
01993             prData[5] = temp;
01994             temp      = prData[3];
01995             prData[3] = prData[4];
01996             prData[4] = temp;
01997             break;
01998     }
01999 }
02000 //-----------------------------------------------------------------------------
02001 //=============================================================================
02002 END_NAMESPACE_TAPs
02003 //-----------------------------------------------------------------------------
02004 //34567890123456789012345678901234567890123456789012345678901234567890123456789
02005 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines