![]() |
TAPs 0.7.7.3
|
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----+----