![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsFace.cpp 00003 00004 Face class is a class for 3D Face. 00005 It contains a set of pointers to its vertices in CCW order. 00006 Example: 00007 2-------1 00008 \ \ 00009 \ \ 00010 \ 0 00011 \ / 00012 \ / 00013 \ / 00014 3 00015 00016 SUKITTI PUNAK (10/18/2004) 00017 UPDATE (04/04/2005) 00018 ******************************************************************************/ 00019 #include "TAPsFace.hpp" 00020 // Using Inclusion Model (i.e. definitions are included in declarations) 00021 // (this name.cpp is included in name.hpp) 00022 // Each friend is defined directly inside its declaration. 00023 00024 BEGIN_NAMESPACE_TAPs 00025 //============================================================================= 00026 // Constructors and Destructor 00027 //----------------------------------------------------------------------------- 00028 template <typename T> 00029 Face<T>::Face ( Vector3<T> normal ) 00030 : m_iVertexList( NULL ), m_iNoVertices( 0 ), 00031 m_v3N( normal ), m_pt2DTexCoords( NULL ), m_iNo2DTexCoords( 0 ) 00032 {} 00033 //----------------------------------------------------------------------------- 00034 template <typename T> 00035 Face<T>::Face ( int * vList, int n, Vector3<T> normal ) 00036 : m_iNoVertices( n ), m_v3N( normal ), 00037 m_pt2DTexCoords( NULL ), m_iNo2DTexCoords( 0 ) 00038 { 00039 m_iVertexList = new int[n]; 00040 if ( m_iVertexList == NULL ) 00041 { 00042 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex list!" 00043 << std::endl; 00044 exit(1); 00045 } 00046 for (int i = 0; i < n; ++i ) 00047 { 00048 m_iVertexList[i] = vList[i]; 00049 } 00050 00051 #ifdef TAPs_ENABLE_FACE_VERTEX_COLOR 00052 m_iVertexColorList = new int[n]; 00053 if ( m_iVertexColorList == NULL ) 00054 { 00055 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex color list!" 00056 << std::endl; 00057 exit(1); 00058 } 00059 #endif//TAPs_ENABLE_FACE_VERTEX_COLOR 00060 00061 #ifdef TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00062 m_iVertexTextureList = new int[n]; 00063 if ( m_iVertexTextureList == NULL ) 00064 { 00065 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex texture coordinate list!" 00066 << std::endl; 00067 exit(1); 00068 } 00069 #endif//TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00070 } 00071 //----------------------------------------------------------------------------- 00072 template <typename T> 00073 Face<T>::Face ( Face<T> const &f ) 00074 : m_iNoVertices( f.m_iNoVertices ), 00075 m_v3N( normal ), 00076 m_iNo2DTexCoords( f.m_iNo2DTexCoords ) 00077 { 00078 //---------------------------------------------------------------- 00079 // Copy Vertex List (Loop) 00080 m_iVertexList = new int[m_iNoVertices]; 00081 if ( m_iVertexList == NULL ) 00082 { 00083 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex list!" 00084 << std::endl; 00085 exit(1); 00086 } 00087 for (int i = 0; i < m_iNoVertices; ++i ) 00088 { 00089 m_iVertexList[i] = f.m_iVertexList[i]; 00090 } 00091 //---------------------------------------------------------------- 00092 #ifdef TAPs_ENABLE_FACE_VERTEX_COLOR 00093 // Copy Vertex Color list (Loop) 00094 m_iVertexColorList = new int[m_iNoVertices]; 00095 if ( m_iVertexColorList == NULL ) 00096 { 00097 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex color list!" 00098 << std::endl; 00099 exit(1); 00100 } 00101 for (int i = 0; i < m_iNoVertices; ++i ) 00102 { 00103 m_iVertexColorList[i] = f.m_iVertexColorList[i]; 00104 } 00105 #endif//TAPs_ENABLE_FACE_VERTEX_COLOR 00106 //---------------------------------------------------------------- 00107 #ifdef TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00108 // Copy Vertex Texture Coordinate list (Loop) 00109 m_iVertexTextureList = new int[m_iNoVertices]; 00110 if ( m_iVertexTextureList == NULL ) 00111 { 00112 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex texture coordinate list!" 00113 << std::endl; 00114 exit(1); 00115 } 00116 for (int i = 0; i < m_iNoVertices; ++i ) 00117 { 00118 m_iVertexTextureList[i] = f.m_iVertexTextureList[i]; 00119 } 00120 #endif//TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00121 //---------------------------------------------------------------- 00122 // Copy Texture Coordinates 00123 m_pt2DTexCoords = new T[2*m_iNo2DTexCoords]; 00124 if ( m_pt2DTexCoords == NULL ) 00125 { 00126 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a texture coordinates!" 00127 << std::endl; 00128 exit(1); 00129 } 00130 for (int i = 0; i < 2*m_iNo2DTexCoords; ++i ) 00131 { 00132 m_pt2DTexCoords[i] = f.m_pt2DTexCoords[i]; 00133 } 00134 } 00135 //----------------------------------------------------------------------------- 00136 template <typename T> 00137 Face<T>::~Face () 00138 { 00139 // delete texture coordinates 00140 if ( m_pt2DTexCoords ) { 00141 delete [] m_pt2DTexCoords; 00142 m_pt2DTexCoords = NULL; 00143 } 00144 // delete vertex list 00145 if ( m_iVertexList ) { 00146 delete [] m_iVertexList; 00147 m_iVertexList = NULL; 00148 } 00149 00150 #ifdef TAPs_ENABLE_FACE_VERTEX_COLOR 00151 // delete vertex color list 00152 if ( m_iVertexColorList ) { 00153 delete [] m_iVertexColorList; 00154 m_iVertexColorList = NULL; 00155 } 00156 #endif//TAPs_ENABLE_FACE_VERTEX_COLOR 00157 00158 #ifdef TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00159 // delete vertex texture coordinate list 00160 if ( m_iVertexTextureList ) { 00161 delete [] m_iVertexTextureList; 00162 m_iVertexTextureList = NULL; 00163 } 00164 #endif//TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00165 } 00166 //----------------------------------------------------------------------------- 00167 //============================================================================= 00168 // Member Access for Vertex List 00169 //----------------------------------------------------------------------------- 00170 template <typename T> 00171 inline int Face<T>::GetNoVertices () const 00172 { return m_iNoVertices; } 00173 //----------------------------------------------------------------------------- 00174 template <typename T> 00175 inline void Face<T>::SetNoVertices ( int n ) 00176 { 00177 if ( m_iVertexList ) delete [] m_iVertexList; 00178 m_iVertexList = new int[n]; 00179 m_iNoVertices = n; 00180 00181 #ifdef TAPs_ENABLE_FACE_VERTEX_COLOR 00182 if ( m_iVertexColorList ) delete [] m_iVertexColorList; 00183 m_iVertexColorList = new int[n]; 00184 #endif//TAPs_ENABLE_FACE_VERTEX_COLOR 00185 00186 #ifdef TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00187 if ( m_iVertexTextureList ) delete [] m_iVertexTextureList; 00188 m_iVertexTextureList = new int[n]; 00189 #endif//TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00190 } 00191 //----------------------------------------------------------------------------- 00192 template <typename T> 00193 inline int Face<T>::GetVertexNo ( int i ) const 00194 { 00195 assert( 0 <= i && i < m_iNoVertices ); 00196 return m_iVertexList[i]; 00197 } 00198 //----------------------------------------------------------------------------- 00199 template <typename T> 00200 inline void Face<T>::SetVertexNo ( int i, int vNo ) 00201 { 00202 assert( 0 <= i && i < m_iNoVertices ); 00203 m_iVertexList[i] = vNo; 00204 } 00205 00206 #ifdef TAPs_ENABLE_FACE_VERTEX_COLOR 00207 template <typename T> 00208 inline int Face<T>::GetVertexColorNo( int i ) const 00209 { 00210 assert( 0 <= i && i < m_iNoVertices ); 00211 return m_iVertexColorList[i]; 00212 } 00213 00214 template <typename T> 00215 inline void Face<T>::SetVertexColorNo( int i, int vNo ) 00216 { 00217 assert( 0 <= i && i < m_iNoVertices ); 00218 m_iVertexColorList[i] = vNo; 00219 } 00220 #endif//TAPs_ENABLE_FACE_VERTEX_COLOR 00221 00222 #ifdef TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00223 template <typename T> 00224 inline int Face<T>::GetVertexTextureNo( int i ) const 00225 { 00226 assert( 0 <= i && i < m_iNoVertices ); 00227 return m_iVertexTextureList[i]; 00228 } 00229 00230 template <typename T> 00231 inline void Face<T>::SetVertexTextureNo( int i, int vNo ) 00232 { 00233 assert( 0 <= i && i < m_iNoVertices ); 00234 m_iVertexTextureList[i] = vNo; 00235 } 00236 #endif//TAPs_ENABLE_FACE_VERTEX_TEXTURE_COORDINATES 00237 00238 //----------------------------------------------------------------------------- 00239 //============================================================================= 00240 // Member Access for Texture Coordinates 00241 //----------------------------------------------------------------------------- 00242 template <typename T> 00243 inline int Face<T>::GetNoTexCoords () const 00244 { return m_iNo2DTexCoords; } 00245 //----------------------------------------------------------------------------- 00246 template <typename T> 00247 inline void Face<T>::SetNoTexCoords ( int n ) 00248 { 00249 if ( m_pt2DTexCoords ) delete [] m_pt2DTexCoords; 00250 m_pt2DTexCoords = new T[2*n]; 00251 m_iNo2DTexCoords = n; 00252 } 00253 //----------------------------------------------------------------------------- 00254 template <typename T> 00255 inline T Face<T>::GetTexCoordNoS ( int i ) const 00256 { 00257 assert( 0 <= i && i < m_iNo2DTexCoords ); 00258 return m_pt2DTexCoords[i*2]; 00259 } 00260 //----------------------------------------------------------------------------- 00261 template <typename T> 00262 inline T Face<T>::GetTexCoordNoT ( int i ) const 00263 { 00264 assert( 0 <= i && i < m_iNo2DTexCoords ); 00265 return m_pt2DTexCoords[i*2 + 1]; 00266 } 00267 //----------------------------------------------------------------------------- 00268 template <typename T> 00269 inline void Face<T>::GetTexCoordNoS ( int i, T &s ) const 00270 { 00271 assert( 0 <= i && i < m_iNo2DTexCoords ); 00272 s = m_pt2DTexCoords[i*2]; 00273 } 00274 //----------------------------------------------------------------------------- 00275 template <typename T> 00276 inline void Face<T>::GetTexCoordNoT ( int i, T &t ) const 00277 { 00278 assert( 0 <= i && i < m_iNo2DTexCoords ); 00279 t = m_pt2DTexCoords[i*2 + 1]; 00280 } 00281 //----------------------------------------------------------------------------- 00282 template <typename T> 00283 inline void Face<T>::SetTexCoordNoS ( int i, T s ) 00284 { 00285 assert( 0 <= i && i < m_iNo2DTexCoords ); 00286 m_pt2DTexCoords[i*2] = s; 00287 } 00288 //----------------------------------------------------------------------------- 00289 template <typename T> 00290 inline void Face<T>::SetTexCoordNoT ( int i, T t ) 00291 { 00292 assert( 0 <= i && i < m_iNo2DTexCoords ); 00293 m_pt2DTexCoords[i*2 + 1] = t; 00294 } 00295 //----------------------------------------------------------------------------- 00296 template <typename T> 00297 inline void Face<T>::GetTexCoordNo ( int i, T &s, T &t ) const 00298 { 00299 assert( 0 <= i && i < m_iNo2DTexCoords ); 00300 s = m_pt2DTexCoords[i*2 ]; 00301 t = m_pt2DTexCoords[i*2 + 1]; 00302 } 00303 //----------------------------------------------------------------------------- 00304 template <typename T> 00305 inline void Face<T>::SetTexCoordNo ( int i, T s, T t ) 00306 { 00307 assert( 0 <= i && i < m_iNo2DTexCoords ); 00308 m_pt2DTexCoords[i*2 ] = s; 00309 m_pt2DTexCoords[i*2 + 1] = t; 00310 } 00311 //----------------------------------------------------------------------------- 00312 template <typename T> 00313 inline T Face<T>::GetTexCoordHalfNo ( int i ) const 00314 { 00315 assert( 0 <= i && i < m_iNo2DTexCoords*2 ); 00316 return m_pt2DTexCoords[i]; 00317 } 00318 //----------------------------------------------------------------------------- 00319 template <typename T> 00320 inline void Face<T>::GetTexCoordHalfNo ( int i, T &v ) const 00321 { 00322 assert( 0 <= i && i < m_iNo2DTexCoords*2 ); 00323 v = m_pt2DTexCoords[i]; 00324 } 00325 //----------------------------------------------------------------------------- 00326 template <typename T> 00327 inline void Face<T>::SetTexCoordHalfNo ( int i, T v ) 00328 { 00329 assert( 0 <= i && i < m_iNo2DTexCoords*2 ); 00330 m_pt2DTexCoords[i] = v; 00331 } 00332 //----------------------------------------------------------------------------- 00333 //============================================================================= 00334 // Assignment Operator 00335 //----------------------------------------------------------------------------- 00336 template <typename T> 00337 inline Face<T> & Face<T>::operator= ( Face<T> const &f ) 00338 { 00339 int *vertexList = m_iVertexList; // vertex list 00340 T *texCoords = m_pt2DTexCoords; // texture coordinate list 00341 //---------------------------------------------------------------- 00342 // Set vertex List (Loop) 00343 m_iVertexList = new int[f.m_iNoVertices]; 00344 if ( m_iVertexList == NULL ) 00345 { 00346 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a vertex list!" 00347 << std::endl; 00348 m_iVertexList = vertexList; 00349 exit(1); 00350 } 00351 for (int i = 0; i < f.m_iNoVertices; ++i ) 00352 { 00353 m_iVertexList[i] = f.m_iVertexList[i]; 00354 } 00355 //---------------------------------------------------------------- 00356 // Set texture coordinates 00357 m_pt2DTexCoords = new T[2*f.m_iNo2DTexCoords]; 00358 if ( m_pt2DTexCoords == NULL ) 00359 { 00360 std::cerr << "[MEMORY ALLOC ERR] In Class Face: Cannot create a texture coordinates!" 00361 << std::endl; 00362 m_pt2DTexCoords = texCoords; 00363 exit(1); 00364 } 00365 for (int i = 0; i < 2*f.m_iNo2DTexCoords; ++i ) 00366 { 00367 m_pt2DTexCoords[i] = f.m_pt2DTexCoords[i]; 00368 } 00369 m_iNoVertices = f.m_iNoVertices; // number of vertices 00370 m_v3N = f.m_v3N; // normal vector 00371 m_iNo2DTexCoords = f.m_iNo2DTexCoords; // number of texture coordinates 00372 return *this; 00373 } 00374 //----------------------------------------------------------------------------- 00375 //============================================================================= 00376 END_NAMESPACE_TAPs 00377 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00378 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8