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
00012
00013
00014
00015 IGS_MeshTri::IGS_MeshTri()
00016 {
00017 assert( false );
00018 }
00019
00020
00021
00022
00023
00024
00025 IGS_MeshTri::IGS_MeshTri( const IGS_MeshTri& right )
00026 {
00027 assert( false );
00028 }
00029
00030
00031
00032
00033
00034
00035 IGS_MeshTri::IGS_MeshTri( const IGS_Mesh& right )
00036 :
00037 IGS_MeshBase( right )
00038 {
00039
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
00051
00052
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
00071
00072
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
00085
00086
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
00111
00112
00113
00114 int IGS_MeshTri::GetNumTriangles() const
00115 {
00116 return this->m_Triangles.size();
00117 }
00118
00119
00120
00121
00122
00123
00124 const IGS_MeshTri::Triangle& IGS_MeshTri::GetTriangle( const int i ) const
00125 {
00126 return this->m_Triangles[ i ];
00127 }
00128
00129
00130
00131
00132
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
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
00156
00157
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