basic/geometry/IGS/IGS_MeshTri.cpp

Go to the documentation of this file.
00001 #ifndef NOGL
00002 #include "opengl/glos.h"
00003 #include <gl/gl.h>
00004 #endif
00005 #include "IGS_Mesh.h"
00006 #include "IGS_MeshTri.h"
00007 #include <stdio.h>
00008 
00009 
00010 //=============================================================================
00011 // Constructor
00012 //
00013 // Description: Default constructor
00014 //=============================================================================
00015 IGS_MeshTri::IGS_MeshTri()
00016 {
00017         assert( false );
00018 }
00019 
00020 //=============================================================================
00021 // Constructor
00022 //
00023 // Description: Copy Constructor
00024 //=============================================================================
00025 IGS_MeshTri::IGS_MeshTri( const IGS_MeshTri& right )
00026 {
00027         assert( false );
00028 }
00029 
00030 //=============================================================================
00031 // Constructor
00032 //
00033 // Description: copys from a regular IGS_Mesh
00034 //=============================================================================
00035 IGS_MeshTri::IGS_MeshTri( const IGS_Mesh& right )
00036 :
00037         IGS_MeshBase( right )
00038 {
00039         //copy the facetes of the IGS_Mesh one at a time
00040         int i;
00041         int size = right.facets.size();
00042         for( i = 0; i < right.facets.size(); i++ )
00043         {
00044                 const MeshFacet& f = right.facets[ i ];
00045                 this->AddFacet( f );
00046         }
00047 }
00048 
00049 //=============================================================================
00050 // AddFacet
00051 //
00052 // Description: Adds a polyhedral facet to this mesh
00053 //=============================================================================
00054 void IGS_MeshTri::AddFacet( const MeshFacet& f )
00055 {
00056         int i;
00057         int size = f.Size();
00058 
00059         int v0 = f.GetVertexNum( 0 );
00060         int v1 = f.GetVertexNum( 1 );
00061         for( i = 2; i < size; i++ )
00062         {
00063                 int v2 = f.GetVertexNum( i );
00064                 this->AddTriangle( v0, v1, v2 );
00065                 v1 = v2;
00066         }
00067 }
00068 
00069 //=============================================================================
00070 // AddTriangle
00071 //
00072 // Description: Adds a triangle to this object
00073 //=============================================================================
00074 void IGS_MeshTri::AddTriangle( const int v0, const int v1, const int v2 )
00075 {
00076         Triangle addme;
00077         addme.v0 = v0;
00078         addme.v1 = v1;
00079         addme.v2 = v2;
00080         this->m_Triangles.push_back( addme );
00081 }
00082 
00083 //=============================================================================
00084 // ComputeNormalForTriangle
00085 //
00086 // Description: if there has been normal assigned for this triangle, assign one
00087 //=============================================================================
00088 Vector4 IGS_MeshTri::ComputeNormalForTriangle( const int triangleNumber )
00089 {
00090         const Triangle& t = this->m_Triangles[ triangleNumber ];
00091 
00092         const Vector4& v0 = this->GetVertex( t.v0 );
00093         const Vector4& v1 = this->GetVertex( t.v1 );
00094         const Vector4& v2 = this->GetVertex( t.v2 );
00095 
00096         Vector4 normal = ( v1 - v0 ).Cross( v2 - v0 );
00097         double mag = normal.Magnitude();
00098         if( mag == 0 )
00099         {
00100                 printf( "IGS_MeshTri::ComputeNormalForFacet - found degenerate triangle\n" );
00101         }
00102         else
00103         {
00104                 normal.Normalize();
00105         }
00106         return ( normal );
00107 }
00108 
00109 //=============================================================================
00110 // GetNumTriangles
00111 //
00112 // Description: Returns the number of triangles used in this mesh
00113 //=============================================================================
00114 int IGS_MeshTri::GetNumTriangles() const
00115 {
00116         return this->m_Triangles.size();
00117 }
00118 
00119 //=============================================================================
00120 // GetTriangle
00121 //
00122 // Description: Allows access to the underlying triangles
00123 //=============================================================================
00124 const IGS_MeshTri::Triangle& IGS_MeshTri::GetTriangle( const int i ) const
00125 {
00126         return this->m_Triangles[ i ];
00127 }
00128 
00129 //=============================================================================
00130 // Prepare
00131 //
00132 // Description: Prepares the mesh for rendering by precomputing all the normals
00133 //=============================================================================
00134 void IGS_MeshTri::Prepare( const IGS_Controller& controller )
00135 {
00136         if( IGS_Object::PreparationComplete() )
00137         {
00138                 return;
00139         }
00140         IGS_Object::Prepare( controller );
00141 
00142         //compute normals for each triangle
00143         int size = this->m_Triangles.size();
00144         int i;
00145         for( i = 0; i < size; i++ )
00146         {
00147                 Vector4 normal = this->ComputeNormalForTriangle( i );
00148                 int normalNum = this->AddNormal( normal );
00149                 Triangle& t = this->m_Triangles[ i ];
00150                 t.n = normalNum;
00151         }
00152 }
00153 
00154 //=============================================================================
00155 // Render
00156 //
00157 // Description: Actually renders the object to the screen
00158 //=============================================================================
00159 void IGS_MeshTri::Render( const IGS_Controller& controller ) const
00160 {
00161 #ifndef NOGL
00162         ::glBegin( GL_TRIANGLES );
00163 
00164         int i;
00165         int size = this->m_Triangles.size();
00166         for( i = 0; i < size; i++ )
00167         {
00168                 const Triangle& t = m_Triangles[ i ];
00169                 const Vector4& v0 = m_Vertexes[ t.v0 ];
00170                 const Vector4& v1 = m_Vertexes[ t.v1 ];
00171                 const Vector4& v2 = m_Vertexes[ t.v2 ];
00172                 const Vector4& n = m_Normals[ t.n ];
00173                 ::glNormal3d( n[ 0 ], n[ 1 ], n[ 2 ] );
00174                 ::glVertex3d( v0[ 0 ], v0[ 1 ], v0[ 2 ] );
00175                 ::glVertex3d( v1[ 0 ], v1[ 1 ], v1[ 2 ] );
00176                 ::glVertex3d( v2[ 0 ], v2[ 1 ], v2[ 2 ] );
00177         }
00178 
00179         ::glEnd();
00180 #endif
00181 };
00182 
00183 

Generated on Sat Apr 1 21:30:32 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO