![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsConverter.cpp 00003 00004 Converter class is a static class. 00005 See TAPsConverter.hpp for a detail description. 00006 00007 SUKITTI PUNAK (04/22/2005) 00008 UPDATE (04/25/2005) 00009 ******************************************************************************/ 00010 #include "TAPsConverter.hpp" 00011 // Using Inclusion Model (i.e. definitions are included in declarations) 00012 // (this name.cpp is included in name.hpp) 00013 // Each friend is defined directly inside its declaration. 00014 00015 BEGIN_NAMESPACE_TAPs 00016 //============================================================================= 00017 //----------------------------------------------------------------------------- 00018 template <typename T> 00019 Point3<T> * Converter<T>::ConvertABezierPatchToAQuadMesh ( 00020 Point3<T> * bPts, // i/p 00021 int uDegree, int vDegree, // i/p 00022 int uSub, int vSub ) // i/p 00023 { 00024 //---------------------------------------------------------------- 00025 // Allocate memory for meshPts 00026 int mSize = ( uSub+1 ) * ( vSub+1 ); 00027 Point3<T> * meshPts = new Point3<T>[ mSize ]; 00028 if ( !meshPts ) return NULL; 00029 //---------------------------------------------------------------- 00030 // Allocate memory for bPts 00031 int bSize = (uDegree + 1) * (vDegree + 1); 00032 Point3<T> * bPts1 = new Point3<T>[ bSize ]; 00033 Point3<T> * bPts2 = new Point3<T>[ bSize ]; 00034 if ( !bPts1 || !bPts2 ) { 00035 delete [] bPts1; 00036 delete [] bPts2; 00037 return NULL; 00038 } 00039 //if ( !bPts ) return NULL; 00040 //---------------------------------------------------------------- 00041 T uStep = static_cast<T>(1.0) / static_cast<T>(uSub); 00042 T vStep = static_cast<T>(1.0) / static_cast<T>(vSub); 00043 T u = 0, v; 00044 for ( int i = 0; i <= uSub; ++i, u += uStep ) { 00045 v = 0; 00046 for ( int j = 0; j <= vSub; ++j, v += vStep ) { 00047 // Reset Bezier (control) points 00048 for ( int p = 0; p < bSize; ++p ) { 00049 bPts1[p] = bPts[p]; 00050 } 00051 deCasteljauBiLinear( u, v, uDegree, vDegree, 00052 bPts1, bPts2, &meshPts[i*(vSub+1) + j] ); 00053 } 00054 } 00055 delete [] bPts1; 00056 delete [] bPts2; 00057 return meshPts; 00058 } 00059 //----------------------------------------------------------------------------- 00060 template <typename T> 00061 void Converter<T>::deCasteljauBiLinear ( 00062 T u, T v, int U, int V, // i/p 00063 Point3<T> * bPts_ip, // i/o bPts or control points 00064 Point3<T> * bPts_op, // i/o 00065 Point3<T> * meshPt ) // o/p 00066 { 00067 deCasteljauBiLinearRec( u, v, U, V, bPts_ip, bPts_op, meshPt ); 00068 } 00069 //----------------------------------------------------------------------------- 00070 template <typename T> 00071 void Converter<T>::deCasteljauBiLinearRec( 00072 T u, T v, int U, int V, // i/p 00073 Point3<T> * bPts_ip, // i/p 00074 Point3<T> * bPts_op, // o/p 00075 Point3<T> * meshPt ) // o/p 00076 { 00077 int inc = V + 1; 00078 T one = static_cast<T>( 1.0 ); 00079 for ( int i = 0; i < U; ++i ) { 00080 for ( int j = 0; j < V; ++j ) { 00081 for ( int d = 0; d < 3; ++d ) { 00082 bPts_op[i*V + j][d] = (one-v)*( (one-u)* bPts_ip[i*inc +j][d] 00083 + u * bPts_ip[(i+1)*inc +j][d] ) 00084 + v *( (one-u)* bPts_ip[i*inc +j+1][d] 00085 + u * bPts_ip[(i+1)*inc +j+1][d] ); 00086 } 00087 } 00088 } 00089 //---------------------------------------------------------------- 00090 if ( U == 1 && V == 1 ) { 00091 *meshPt = bPts_op[0]; 00092 } 00093 //else if ( U == 0 || V == 0 ) deCasteljauCurve 00094 else deCasteljauBiLinearRec( u, v, U-1, V-1, bPts_op, bPts_ip, meshPt ); // swap i/p and o/p 00095 } 00096 //----------------------------------------------------------------------------- 00097 template <typename T> 00098 bool Converter<T>::WriteGridPtsAsQuadMeshToA10FormatFile ( 00099 Point3<T> * gridPts, int uSize, int vSize, char * outFileName ) 00100 { 00101 //---------------------------------------------------------------- 00102 // Open the output file 00103 std::ofstream outFile ( outFileName, ios::out ); 00104 if ( !outFile ) { 00105 std::cerr << "File could not be opened" << std::endl; 00106 return false; 00107 } 00108 //---------------------------------------------------------------- 00109 // Write vertices 00110 outFile << uSize * vSize << "\n"; // write number of vertices 00111 int number = 0; 00112 for ( int u = 0; u < uSize; ++u ) { // write each vertex 00113 for ( int v = 0; v < vSize; ++v ) { 00114 outFile << ++number << "\t" 00115 << gridPts[ u*vSize + v ][0] << "\t" 00116 << gridPts[ u*vSize + v ][1] << "\t" 00117 << gridPts[ u*vSize + v ][2] << "\n"; 00118 } 00119 } 00120 //---------------------------------------------------------------- 00121 // Write quad faces 00122 int vDeg = vSize - 1; 00123 outFile << (uSize-1) * vDeg << "\n"; // write number of faces 00124 for ( int u = 0; u < uSize-1; ++u ) { // write each face 00125 for ( int v = 0; v < vSize-1; ++v ) { 00126 outFile << 4 << "\t" 00127 << u*vSize + v + 1 << " " 00128 << (u+1)*vSize + v + 1 << " " 00129 << (u+1)*vSize + v + 2 << " " 00130 << u*vSize + v + 2 << "\n"; 00131 } 00132 } 00133 outFile.close(); 00134 return true; 00135 } 00136 //----------------------------------------------------------------------------- 00137 template <typename T> 00138 bool Converter<T>::WriteGridPtsAsTriMeshToA10FormatFile ( 00139 Point3<T> * gridPts, int uSize, int vSize, char * outFileName ) 00140 { 00141 std::ofstream outFile ( outFileName, ios::out ); 00142 if ( !outFile ) { 00143 std::cerr << outFileName << " could not be opened!" << std::endl; 00144 return false; 00145 } 00146 //---------------------------------------------------------------- 00147 // Write vertices 00148 outFile << uSize * vSize << "\n"; // write number of vertices 00149 int number = 0; 00150 for ( int u = 0; u < uSize; ++u ) { // write each vertex 00151 for ( int v = 0; v < vSize; ++v ) { 00152 outFile << ++number << "\t" 00153 << gridPts[ u*vSize + v ][0] << "\t" 00154 << gridPts[ u*vSize + v ][1] << "\t" 00155 << gridPts[ u*vSize + v ][2] << "\n"; 00156 } 00157 } 00158 //---------------------------------------------------------------- 00159 // Write triangle faces 00160 int vDeg = vSize - 1; 00161 outFile << (uSize-1) * vDeg * 2 << "\n"; // write number of faces 00162 for ( int u = 0; u < uSize-1; ++u ) { // write each face 00163 for ( int v = 0; v < vSize-1; ++v ) { 00164 outFile << 3 << "\t" 00165 << u*vSize + v + 1 << " " 00166 << (u+1)*vSize + v + 1 << " " 00167 << (u+1)*vSize + v + 2 << "\n"; 00168 outFile << 3 << "\t" 00169 << (u+1)*vSize + v + 2 << " " 00170 << u*vSize + v + 2 << " " 00171 << u*vSize + v + 1 << "\n"; 00172 } 00173 } 00174 outFile.close(); 00175 return true; 00176 } 00177 //----------------------------------------------------------------------------- 00178 template <typename T> 00179 bool Converter<T>::WriteGridPtsAsTriMeshToA10FormatFile2 ( 00180 Point3<T> * gridPts, int uSize, int vSize, char * outFileName ) 00181 { 00182 //---------------------------------------------------------------- 00183 // Open the output file 00184 std::ofstream outFile ( outFileName, ios::out ); 00185 if ( !outFile ) { 00186 std::cerr << outFileName << " could not be opened!" << std::endl; 00187 return false; 00188 } 00189 //---------------------------------------------------------------- 00190 // Write vertices 00191 int vDeg = vSize - 1; 00192 int noOfExtraVertices = (uSize-1) * vDeg; 00193 // write number of vertices 00194 outFile << uSize * vSize + noOfExtraVertices << "\n"; 00195 int number = 0; 00196 // write each vertex 00197 for ( int u = 0; u < uSize; ++u ) { 00198 for ( int v = 0; v < vSize; ++v ) { 00199 outFile << ++number << "\t" 00200 << gridPts[ u*vSize + v ][0] << "\t" 00201 << gridPts[ u*vSize + v ][1] << "\t" 00202 << gridPts[ u*vSize + v ][2] << "\n"; 00203 } 00204 } 00205 // write each extra vertex 00206 for ( int u = 0; u < uSize-1; ++u ) { 00207 for ( int v = 0; v < vSize-1; ++v ) { 00208 Vector3<T> vertex = ( 00209 gridPts[ u*vSize + v ] + 00210 gridPts[ (u+1)*vSize + v ] + 00211 gridPts[ (u+1)*vSize + v + 1 ] + 00212 gridPts[ u*vSize + v + 1 ] 00213 ) / static_cast<T>(4); 00214 outFile << ++number << "\t" 00215 << vertex[0] << "\t" 00216 << vertex[1] << "\t" 00217 << vertex[2] << "\n"; 00218 } 00219 } 00220 //---------------------------------------------------------------- 00221 // Write triangle faces 00222 outFile << (uSize-1) * vDeg * 4 << "\n"; // write number of faces 00223 number = uSize*vSize + 1; 00224 for ( int u = 0; u < uSize-1; ++u ) { // write each face 00225 for ( int v = 0; v < vSize-1; ++v, ++number ) { 00226 outFile << 3 << "\t" 00227 << u*vSize + v + 1 << " " 00228 << (u+1)*vSize + v + 1 << " " 00229 << number << "\n"; 00230 outFile << 3 << "\t" 00231 << (u+1)*vSize + v + 1 << " " 00232 << (u+1)*vSize + v + 2 << " " 00233 << number << "\n"; 00234 outFile << 3 << "\t" 00235 << (u+1)*vSize + v + 2 << " " 00236 << u*vSize + v + 2 << " " 00237 << number << "\n"; 00238 outFile << 3 << "\t" 00239 << u*vSize + v + 2 << " " 00240 << u*vSize + v + 1 << " " 00241 << number << "\n"; 00242 } 00243 } 00244 outFile.close(); 00245 return true; 00246 } 00247 //----------------------------------------------------------------------------- 00248 template <typename T> 00249 Point3<T> * Converter<T>::ReadABezierPatchFromFile ( 00250 char * inFileName, // i/p 00251 int &uDeg, int &vDeg ) // o/p 00252 { 00253 //---------------------------------------------------------------- 00254 // Open the input file 00255 std::ifstream inFile ( inFileName, ios::in ); 00256 if ( !inFile ) { 00257 std::cerr << inFileName << " could not be opened!" << std::endl; 00258 return NULL; 00259 } 00260 //---------------------------------------------------------------- 00261 int type; 00262 inFile >> type; 00263 if ( type != 5 ) { 00264 std::cerr << inFileName << " does not contain a Bezier patch!" << std::endl; 00265 } 00266 inFile >> uDeg >> vDeg; 00267 //---------------------------------------------------------------- 00268 Point3<T> * bPts = new Point3<T>[ (uDeg+1) * (vDeg+1) ]; 00269 if ( !bPts ) return NULL; 00270 int index = 0; 00271 for ( int u = 0; u <= uDeg; ++u ) { 00272 for ( int v = 0; v <= vDeg; ++v, ++index ) { 00273 inFile >> bPts[index][0] >> bPts[index][1] >> bPts[index][2]; 00274 } 00275 } 00276 inFile.close(); 00277 return bPts; 00278 } 00279 //----------------------------------------------------------------------------- 00280 // This function is for converting the Bezier patch hexoid into a 10 format hexoid 00281 // the Bezier patch hexoid has 6 patches for six sides of the hexoid: 00282 /* 00283 +---+ 00284 | 5 | u and v indices 00285 +---+---+---+---+ +-u--> 00286 | 2 | 1 | 3 | 4 | | 00287 +---+---+---+---+ v 00288 | 6 | 00289 +---+ 00290 */ 00291 00292 template <typename T> 00293 bool Converter<T>::SpecialFnToCreateA10FormatFileFromHegDataFile ( int uSize, int vSize ) 00294 { 00295 //---------------------------------------------------------------- 00296 // Open the input file 00297 std::ifstream inFile ( 00298 "D:/Shared/MyWorksIII/TAPs/Applications/Data/HexDeg3.txt", 00299 ios::in ); 00300 if ( !inFile ) { 00301 std::cerr << "Input file could not be opened!" << std::endl; 00302 return false; 00303 } 00304 //---------------------------------------------------------------- 00305 // Open the output file 00306 std::ofstream outFile ( 00307 "D:/Shared/MyWorksIII/TAPs/Applications/Data/HexDeg3Tri.10", 00308 ios::out ); 00309 if ( !outFile ) { 00310 std::cerr << "Output file could not be opened!" << std::endl; 00311 return false; 00312 } 00313 //---------------------------------------------------------------- 00314 int uDeg, vDeg; 00315 Point3<T> * bPts[6]; 00316 Point3<T> * mPts[6]; 00317 int type; 00318 //---------------------------------------------------------------- 00319 for ( int i = 0; i < 6; ++i ) { 00320 inFile >> type; 00321 if ( type != 5 ) { 00322 std::cerr << "Input file does not contain a Bezier patch!" << std::endl; 00323 } 00324 inFile >> uDeg >> vDeg; 00325 //-------------------------------------------------- 00326 bPts[i] = new Point3<T>[ (uDeg+1) * (vDeg+1) ]; 00327 //-------------------------------------------------- 00328 int index = 0; 00329 for ( int u = 0; u <= uDeg; ++u ) { 00330 for ( int v = 0; v <= vDeg; ++v, ++index ) { 00331 inFile >> bPts[i][index][0] >> bPts[i][index][1] >> bPts[i][index][2]; 00332 } 00333 } 00334 mPts[i] = ConvertABezierPatchToAQuadMesh( bPts[i], uDeg, vDeg, uSize-1, vSize-1 ); 00335 } 00336 inFile.close(); 00337 00338 00339 //---------------------------------------------------------------- 00340 // Write vertices 00341 int noOfVertices = uSize * vSize; // patch# 1 00342 noOfVertices += 2 * uSize * (vSize-1); // patch# 3 & 4 00343 noOfVertices += uSize * (vSize-2); // patch# 2 00344 noOfVertices += 2 * (uSize-2) * (vSize-2); // patch# 5 & 6 00345 int number = 0, number1 = 0; 00346 outFile << noOfVertices << "\n"; // write number of vertices 00347 //---------------------------------------------------------------- 00348 // Write each vertex of patch# 1 00349 for ( int u = 0; u < uSize; ++u ) { 00350 for ( int v = 0; v < vSize; ++v ) { 00351 outFile << setiosflags( ios::fixed | ios::showpoint ) 00352 << ++number << "\t" 00353 << mPts[0][ u*vSize + v ][0] << setprecision( 6 ) << " " 00354 << mPts[0][ u*vSize + v ][1] << " " 00355 << mPts[0][ u*vSize + v ][2] << "\n"; 00356 } 00357 } 00358 //---------------------------------------------------------------- 00359 // Write each vertex of patch# 3 00360 for ( int u = 0; u < uSize; ++u ) { 00361 for ( int v = 1; v < vSize; ++v ) { 00362 outFile << ++number << "\t" 00363 << mPts[2][ u*vSize + v ][0] << " " 00364 << mPts[2][ u*vSize + v ][1] << " " 00365 << mPts[2][ u*vSize + v ][2] << "\n"; 00366 } 00367 } 00368 //---------------------------------------------------------------- 00369 // Write each vertex of patch# 4 00370 for ( int u = 0; u < uSize; ++u ) { 00371 for ( int v = 1; v < vSize; ++v ) { 00372 outFile << ++number << "\t" 00373 << mPts[3][ u*vSize + v ][0] << " " 00374 << mPts[3][ u*vSize + v ][1] << " " 00375 << mPts[3][ u*vSize + v ][2] << "\n"; 00376 } 00377 } 00378 //---------------------------------------------------------------- 00379 // Write each vertex of patch# 2 00380 for ( int u = 0; u < uSize; ++u ) { 00381 for ( int v = 1; v < vSize-1; ++v ) { 00382 outFile << ++number << "\t" 00383 << mPts[1][ u*vSize + v ][0] << " " 00384 << mPts[1][ u*vSize + v ][1] << " " 00385 << mPts[1][ u*vSize + v ][2] << "\n"; 00386 } 00387 } 00388 //---------------------------------------------------------------- 00389 // Write each vertex of patch# 5 00390 for ( int u = 1; u < uSize-1; ++u ) { 00391 for ( int v = 1; v < vSize-1; ++v ) { 00392 outFile << ++number << "\t" 00393 << mPts[4][ u*vSize + v ][0] << " " 00394 << mPts[4][ u*vSize + v ][1] << " " 00395 << mPts[4][ u*vSize + v ][2] << "\n"; 00396 } 00397 } 00398 //---------------------------------------------------------------- 00399 // Write each vertex of patch# 6 00400 for ( int u = 1; u < uSize-1; ++u ) { 00401 for ( int v = 1; v < vSize-1; ++v ) { 00402 outFile << ++number << "\t" 00403 << mPts[5][ u*vSize + v ][0] << " " 00404 << mPts[5][ u*vSize + v ][1] << " " 00405 << mPts[5][ u*vSize + v ][2] << "\n"; 00406 } 00407 } 00408 //---------------------------------------------------------------- 00409 // Write triangle faces (patch# 1) 00410 int inc, inc1; 00411 int noOfFaces = 10 * (uSize-1) * (vSize-1); 00412 noOfFaces += 2 * (uSize-3) * (uSize-3); 00413 noOfFaces += 2 * (uSize-3); 00414 noOfFaces += 2 * (uSize-3); 00415 noOfFaces += 2 * (uSize-3); 00416 noOfFaces += 2 * (uSize-3); 00417 noOfFaces += 8; 00418 outFile << noOfFaces << "\n"; // write number of faces 00419 for ( int u = 0; u < uSize-1; ++u ) { // write each face 00420 for ( int v = 0; v < vSize-1; ++v ) { 00421 outFile << 3 << " " 00422 << u*vSize + v + 1 << " " 00423 << (u+1)*vSize + v + 1 << " " 00424 << (u+1)*vSize + v + 2 << "\n"; 00425 outFile << 3 << " " 00426 << (u+1)*vSize + v + 2 << " " 00427 << u*vSize + v + 2 << " " 00428 << u*vSize + v + 1 << "\n"; 00429 } 00430 } 00431 //---------------------------------------------------------------- 00432 // Write triangle faces (patch# 3) 00433 number = uSize * vSize; // after patch# 1 00434 inc = vSize - 1; 00435 // Write faces 00436 for ( int u = 0; u < uSize-1; ++u ) { 00437 outFile << 3 << "\t" 00438 << u*vSize + vSize << " " 00439 << (u+1)*vSize + vSize << " " 00440 << number + (u+1)*inc + 1 << "\n"; 00441 outFile << 3 << "\t" 00442 << number + (u+1)*inc + 1 << " " 00443 << number + u*inc + 1 << " " 00444 << u*vSize + vSize << "\n"; 00445 } 00446 // Write faces of patch#3 connected with patch#1 00447 for ( int u = 0; u < uSize-1; ++u ) { 00448 for ( int v = 1; v < inc; ++v ) { 00449 outFile << 3 << "\t" 00450 << number + u*inc + v << " " 00451 << number + (u+1)*inc + v << " " 00452 << number + (u+1)*inc + v + 1 << "\n"; 00453 outFile << 3 << "\t" 00454 << number + (u+1)*inc + v + 1 << " " 00455 << number + u*inc + v + 1 << " " 00456 << number + u*inc + v << "\n"; 00457 } 00458 } 00459 //---------------------------------------------------------------- 00460 // Write triangle faces (patch# 4) 00461 number = uSize * vSize; // after patch# 1 00462 number1 = number + uSize * (vSize-1); // after patch# 1 and 3 00463 inc = vSize - 1; 00464 // Write faces 00465 for ( int u = 0; u < uSize-1; ++u ) { 00466 outFile << 3 << "\t" 00467 << number + u*inc + inc << " " 00468 << number + (u+1)*inc + inc << " " 00469 << number1 + (u+1)*inc + 1 << "\n"; 00470 outFile << 3 << "\t" 00471 << number1 + (u+1)*inc + 1 << " " 00472 << number1 + u*inc + 1 << " " 00473 << number + u*inc + inc << "\n"; 00474 } 00475 // Write faces of patch#4 connected with patch#3 00476 for ( int u = 0; u < uSize-1; ++u ) { 00477 for ( int v = 1; v < inc; ++v ) { 00478 outFile << 3 << "\t" 00479 << number1 + u*inc + v << " " 00480 << number1 + (u+1)*inc + v << " " 00481 << number1 + (u+1)*inc + v + 1 << "\n"; 00482 outFile << 3 << "\t" 00483 << number1 + (u+1)*inc + v + 1 << " " 00484 << number1 + u*inc + v + 1 << " " 00485 << number1 + u*inc + v << "\n"; 00486 } 00487 } 00488 //---------------------------------------------------------------- 00489 // Write triangle faces (patch# 2) 00490 number = number1; // after patch# 1 and 3 00491 number1 = number + uSize * (vSize-1); // after patch# 1, 3, and 4 00492 inc = vSize - 1; 00493 inc1 = inc - 1; 00494 // Write faces 00495 for ( int u = 0; u < uSize-1; ++u ) { 00496 for ( int v = 1; v < inc1; ++v ) { 00497 outFile << 3 << "\t" 00498 << number1 + u*inc1 + v << " " 00499 << number1 + (u+1)*inc1 + v << " " 00500 << number1 + (u+1)*inc1 + v + 1 << "\n"; 00501 outFile << 3 << "\t" 00502 << number1 + (u+1)*inc1 + v + 1 << " " 00503 << number1 + u*inc1 + v + 1 << " " 00504 << number1 + u*inc1 + v << "\n"; 00505 } 00506 } 00507 // Write faces of patch#2 connected with patch#4 00508 for ( int u = 0; u < uSize-1; ++u ) { 00509 outFile << 3 << "\t" 00510 << number + u*inc + inc << " " 00511 << number + (u+1)*inc + inc << " " 00512 << number1 + (u+1)*inc1 + 1 << "\n"; 00513 outFile << 3 << "\t" 00514 << number1 + (u+1)*inc1 + 1 << " " 00515 << number1 + u*inc1 + 1 << " " 00516 << number + u*inc + inc << "\n"; 00517 } 00518 // Write faces of patch#2 connected with patch#1 00519 for ( int u = 0; u < uSize-1; ++u ) { 00520 outFile << 3 << "\t" 00521 << number1 + u*inc1 + inc1 << " " 00522 << number1 + (u+1)*inc1 + inc1 << " " 00523 << (u+1)*vSize + 1 << "\n"; 00524 outFile << 3 << "\t" 00525 << number1 + u*inc1 + inc1 << " " 00526 << (u+1)*vSize + 1 << " " 00527 << u*vSize + 1 << "\n"; 00528 } 00529 //---------------------------------------------------------------- 00530 // Write triangle faces (patch# 5) 00531 number = number1; // after patch# 1, 3, and 4 00532 number1 = number + uSize * (vSize-2); // after patch# 1, 3, 4, and 2 00533 inc = vSize - 1; 00534 inc1 = inc - 1; 00535 // Write faces 00536 for ( int u = 0; u < uSize-3; ++u ) { 00537 for ( int v = 1; v < inc1; ++v ) { 00538 outFile << 3 << "\t" 00539 << number1 + u*inc1 + v << " " 00540 << number1 + (u+1)*inc1 + v << " " 00541 << number1 + (u+1)*inc1 + v + 1 << "\n"; 00542 outFile << 3 << "\t" 00543 << number1 + (u+1)*inc1 + v + 1 << " " 00544 << number1 + u*inc1 + v + 1 << " " 00545 << number1 + u*inc1 + v << "\n"; 00546 } 00547 } 00548 // Write faces of patch#5 connected with patch#1 00549 --inc1; 00550 for ( int v = 1; v < vSize-2; ++v ) { 00551 outFile << 3 << "\t" 00552 << number1 + (uSize-2)*inc1 + v << " " 00553 << v + 1 << " " 00554 << v + 2 << "\n"; 00555 outFile << 3 << "\t" 00556 << v + 2 << " " 00557 << number1 + (uSize-2)*inc1 + v + 1 << " " 00558 << number1 + (uSize-2)*inc1 + v << "\n"; 00559 } 00560 // Write faces of patch#5 connected with patch#3 00561 number = uSize * vSize; // vertex after patch#1 00562 ++inc1; 00563 for ( int u = 0; u < uSize-3; ++u ) { 00564 int op = vSize - 3 - u; 00565 outFile << 3 << "\t" 00566 << number1 + (uSize-2)*u + inc1 << " " 00567 << number1 + (uSize-2)*(u+1) + inc1 << " " 00568 << number + op << "\n"; 00569 outFile << 3 << "\t" 00570 << number + op << " " 00571 << number + op + 1 << " " 00572 << number1 + (uSize-2)*u + inc1 << "\n"; 00573 } 00574 // Write faces of patch#5 connected with patch#4 00575 number = uSize * (vSize + (vSize-1)); // vertex after patch# 1 and 3 00576 for ( int v = 1; v < vSize-2; ++v ) { 00577 int op = vSize - 1 - v; 00578 outFile << 3 << "\t" 00579 << number + op << " " 00580 << number1 + v << " " 00581 << number1 + v + 1 << "\n"; 00582 outFile << 3 << "\t" 00583 << number1 + v + 1 << " " 00584 << number + op - 1 << " " 00585 << number + op << "\n"; 00586 } 00587 // Write faces of patch#5 connected with patch#2 00588 number = uSize * (vSize + (vSize-1)*2); // vertex after patch#1, 3, and 4 00589 for ( int u = 1; u < uSize-2; ++u ) { 00590 outFile << 3 << "\t" 00591 << number1 + (uSize-2)*u + 1 << " " 00592 << number + u << " " 00593 << number + u + 1 << "\n"; 00594 outFile << 3 << "\t" 00595 << number1 + (uSize-2)*u + 1 << " " 00596 << number1 + (uSize-2)*(u-1) + 1 << " " 00597 << number + u << "\n"; 00598 } 00599 // Write cornors of patch#5 00600 { 00601 //---------------------------------------- 00602 // Bottom left 00603 //number = uSize * (vSize + (vSize-1)*2); // vertex after patch#1, 3, and 4 00604 int v1 = number + vSize - 2; 00605 int v2 = 1; 00606 int v3 = 2; 00607 int v4 = number1 + (uSize-2)*(vSize-3) + 1; 00608 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00609 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00610 //---------------------------------------- 00611 // Bottom right 00612 v1 = number1 + (uSize-2)*(vSize-2); 00613 v2 = vSize - 1; 00614 v3 = vSize; 00615 v4 = uSize*vSize + 1; 00616 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00617 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00618 //---------------------------------------- 00619 // Top left 00620 v1 = uSize * (vSize + (vSize-1)) + vSize - 1; 00621 v2 = uSize * (vSize + (vSize-1)*2) + 1; 00622 v3 = number1 + 1; 00623 v4 = v1 - 1; 00624 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00625 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00626 //---------------------------------------- 00627 // Top right 00628 v1 = uSize * (vSize + (vSize-1)) + 1; 00629 v2 = number1 + vSize - 2; 00630 v3 = uSize*vSize + vSize - 2; 00631 v4 = uSize*vSize + vSize - 1; 00632 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00633 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00634 } 00635 //---------------------------------------------------------------- 00636 // Write triangle faces (patch# 6) 00637 number = uSize * (vSize + (vSize-1)*2 + (vSize-2)); // after patch# 1, 3, 4, and 2 00638 number1 = number + (uSize-2)*(vSize-2); // after patch# 1, 3, 4, 2, and 5 00639 inc = vSize - 1; 00640 inc1 = inc - 1; 00641 // Write faces 00642 for ( int u = 0; u < uSize-3; ++u ) { 00643 for ( int v = 1; v < inc1; ++v ) { 00644 outFile << 3 << "\t" 00645 << number1 + u*inc1 + v << " " 00646 << number1 + (u+1)*inc1 + v << " " 00647 << number1 + (u+1)*inc1 + v + 1 << "\n"; 00648 outFile << 3 << "\t" 00649 << number1 + (u+1)*inc1 + v + 1 << " " 00650 << number1 + u*inc1 + v + 1 << " " 00651 << number1 + u*inc1 + v << "\n"; 00652 } 00653 } 00654 // Write faces of patch#6 connected with patch#1 00655 for ( int v = 1; v < vSize-2; ++v ) { 00656 outFile << 3 << "\t" 00657 << uSize*(vSize-1) + v + 1 << " " 00658 << number1 + v << " " 00659 << number1 + v + 1 << "\n"; 00660 outFile << 3 << "\t" 00661 << number1 + v + 1 << " " 00662 << uSize*(vSize-1) + v + 2 << " " 00663 << uSize*(vSize-1) + v + 1 << "\n"; 00664 } 00665 // Write faces of patch#6 connected with patch#3 00666 number = uSize * vSize + (uSize-1)*(vSize-1) + 2; // vertex after patch#1 + some of patch#3 00667 for ( int u = 0; u < uSize-3; ++u ) { 00668 outFile << 3 << "\t" 00669 << number1 + (uSize-2)*u + inc1 << " " 00670 << number1 + (uSize-2)*(u+1) + inc1 << " " 00671 << number + u << "\n"; 00672 outFile << 3 << "\t" 00673 << number + u << " " 00674 << number + u - 1 << " " 00675 << number1 + (uSize-2)*u + inc1 << "\n"; 00676 } 00677 // Write faces of patch#6 connected with patch#4 00678 number = uSize * (vSize + (vSize-1)); // vertex after patch#1 and 3 00679 number += (uSize-1)*(vSize-1); // and some of patch#4 00680 for ( int v = 1; v < vSize-2; ++v ) { 00681 int op = vSize - v - 2; 00682 outFile << 3 << "\t" 00683 << number1 + (uSize-2)*(vSize-3) + v << " " 00684 << number + op + 1 << " " 00685 << number + op << "\n"; 00686 outFile << 3 << "\t" 00687 << number + op << " " 00688 << number1 + (uSize-2)*(vSize-3) + v + 1<< " " 00689 << number1 + (uSize-2)*(vSize-3) + v << "\n"; 00690 } 00691 // Write faces of patch#6 connected with patch#2 00692 number = uSize * (vSize + (vSize-1)*2); // vertex after patch#1, 3, and 4 00693 number += (uSize)*(vSize-3); // and some of patch#2 00694 for ( int u = 0; u < uSize-3; ++u ) { 00695 int op = vSize - u; 00696 outFile << 3 << "\t" 00697 << number + op << " " 00698 << number + op - 1 << " " 00699 << number1 + (u+1)*(vSize-2) + 1 << "\n"; 00700 outFile << 3 << "\t" 00701 << number1 + (u+1)*(vSize-2) + 1 << " " 00702 << number1 + (u)*(vSize-2) + 1 << " " 00703 << number + op << "\n"; 00704 } 00705 // Write cornors of patch#6 00706 { 00707 //---------------------------------------- 00708 // Top left 00709 number = (uSize-1) * (vSize); 00710 int v1 = number + 1; 00711 int v2 = uSize * (vSize + (vSize-1)*2) + uSize*(vSize-2); 00712 int v3 = number1 + 1; 00713 int v4 = number + 2; 00714 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00715 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00716 //---------------------------------------- 00717 // Top right 00718 number = (uSize) * (vSize); 00719 v1 = number - 1; 00720 v2 = number1 + vSize - 2; 00721 v3 = uSize*vSize + (uSize-1)*(vSize-1) + 1; 00722 v4 = uSize * vSize; 00723 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00724 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00725 //---------------------------------------- 00726 // Bottom left 00727 number = uSize * (vSize + (vSize-1)) + (uSize)*(vSize-1); 00728 v1 = uSize * (vSize + (vSize-1)*2) + (uSize-1)*(vSize-2) + 1; 00729 v2 = number; 00730 v3 = number - 1; 00731 v4 = number1 + (uSize-2)*(vSize-3) + 1; 00732 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00733 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00734 //---------------------------------------- 00735 // Bottom right 00736 number = uSize*vSize + (uSize)*(vSize-1); 00737 v1 = number1 + (uSize-2)*(vSize-2); 00738 v2 = uSize * (vSize + (vSize-1)) + (uSize-1)*(vSize-1) + 1; 00739 v3 = number; 00740 v4 = number - 1; 00741 outFile << 3 << "\t" << v1 << " " << v2 << " " << v3 << "\n"; 00742 outFile << 3 << "\t" << v3 << " " << v4 << " " << v1 << "\n"; 00743 } 00744 //---------------------------------------------------------------- 00745 for ( int i = 0; i < 6; ++i ) { 00746 delete [] bPts[i]; 00747 delete [] mPts[i]; 00748 } 00749 outFile.close(); 00750 return true; 00751 } 00752 //----------------------------------------------------------------------------- 00753 //============================================================================= 00754 END_NAMESPACE_TAPs 00755 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00756 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8