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