basic/geometry/Mesh.cpp

Go to the documentation of this file.
00001 //## begin module%37431D0E02A4.cm preserve=no
00002 //        %X% %Q% %Z% %W%
00003 //## end module%37431D0E02A4.cm
00004 
00005 //## begin module%37431D0E02A4.cp preserve=no
00006 //## end module%37431D0E02A4.cp
00007 
00008 //## Module: Mesh%37431D0E02A4; Pseudo Package body
00009 //## Source file: C:\project\mpk\code\geometry\Mesh.cpp
00010 
00011 //## begin module%37431D0E02A4.additionalIncludes preserve=no
00012 //## end module%37431D0E02A4.additionalIncludes
00013 
00014 //## begin module%37431D0E02A4.includes preserve=yes
00015 #include <additional/streams/mystreams.h>
00016 #include <geometry/IGS/IGS_MeshTri.h>
00017 #include <math\math2.h>
00018 #include "math\Vector4.h"
00019 #include "geometry\Mesh.h"
00020 #include "geometry\MPK_Segment.h"
00021 
00022 
00023 //## begin Mesh::maxVcollideIndex%374F30DD01C0.attr preserve=no  private: static int {UA} -1
00024 int Mesh::maxVcollideIndex = -1;
00025 //## end Mesh::maxVcollideIndex%374F30DD01C0.attr
00026 
00027 //## begin Mesh::vcollide%374F32D60339.attr preserve=no  private: static VCollide* {UA} NULL
00028 VCollide* Mesh::vcollide = NULL;
00029 //## end Mesh::vcollide%374F32D60339.attr
00030 
00031 //## begin Mesh::countInstances%380CDEEA014D.attr preserve=no  private: static int {UA} 0
00032 int Mesh::countInstances = 0;
00033 //## end Mesh::countInstances%380CDEEA014D.attr
00034 
00035 
00036 
00037 
00038 
00039 Mesh::Mesh (FrameManager* frameManager)
00040   //## begin Mesh::Mesh%927145471.hasinit preserve=no
00041   //## end Mesh::Mesh%927145471.hasinit
00042   //## begin Mesh::Mesh%927145471.initialization preserve=yes
00043   :ObjectBase( frameManager ) ,
00044   vcollideIndex( -1 )
00045   //## end Mesh::Mesh%927145471.initialization
00046 {
00047   //## begin Mesh::Mesh%927145471.body preserve=yes
00048         countInstances++ ;
00049   //## end Mesh::Mesh%927145471.body
00050 }
00051 
00052 Mesh::Mesh (const Mesh& right)
00053   //## begin Mesh::Mesh%927145472.hasinit preserve=no
00054   //## end Mesh::Mesh%927145472.hasinit
00055   //## begin Mesh::Mesh%927145472.initialization preserve=yes
00056   :ObjectBase( right ),
00057   vcollideIndex( -1 )
00058   //## end Mesh::Mesh%927145472.initialization
00059 {
00060   //## begin Mesh::Mesh%927145472.body preserve=yes
00061 
00062         //add all the vertexes in the right
00063         this->vertexes = right.vertexes;
00064         
00065         //add all the facets in the right
00066         this->facets = right.facets;
00067 
00068         countInstances++ ;
00069   //## end Mesh::Mesh%927145472.body
00070 }
00071 
00072 //=============================================================================
00073 // Constructor
00074 //
00075 // Description: creates a mesh out of an IGS_MeshTri
00076 //=============================================================================
00077 Mesh::Mesh( const IGS_MeshTri& right )
00078 :
00079         ObjectBase( NULL )
00080 {
00081         int i;
00082         int size = right.GetNumVertexes();
00083         for( i = 0; i < size; i++ )
00084         {
00085                 const Vector4& vertex = right.GetVertex( i );
00086                 IJG_Assert( vertex.Magnitude() < 1000.0 );      //gerneally vertexes this big are actually just errors in file IO
00087                 this->AddVertex( vertex );
00088         }
00089 
00090         size = right.GetNumTriangles();
00091         for( i = 0; i < size; i++ )
00092         {
00093                 const IGS_MeshTri::Triangle& triangle = right.GetTriangle( i );
00094                 this->AddFacet( Facet( triangle.v0, triangle.v1, triangle.v2 ) );
00095         }
00096 }
00097 
00098 Mesh::~Mesh()
00099 {
00100   //## begin Mesh::~Mesh%.body preserve=yes
00101         if( vcollide != NULL )
00102         {
00103                 delete vcollide ;
00104                 vcollide = NULL ;
00105         }
00106         facets.clear() ;
00107         vertexes.clear() ;
00108         countInstances-- ;
00109   //## end Mesh::~Mesh%.body
00110 }
00111 
00112 
00113 
00114 //## Other Operations (implementation)
00115 bool Mesh::CanCheckInterference (const Entity* entity) const
00116 {
00117   //## begin Mesh::CanCheckInterference%927145473.body preserve=yes
00118         if( dynamic_cast< const Mesh* >( entity ) != NULL )
00119         {
00120                 return true ;
00121         }
00122         return false ;
00123   //## end Mesh::CanCheckInterference%927145473.body
00124 }
00125 
00126 Entity* Mesh::Clone () const
00127 {
00128   //## begin Mesh::Clone%927145474.body preserve=yes
00129         return new Mesh( *this ) ;
00130   //## end Mesh::Clone%927145474.body
00131 }
00132 
00133 bool Mesh::IsInterfering (const Entity* entity) const
00134 {
00135   //## begin Mesh::IsInterfering%927145475.body preserve=yes
00136         //IMPROVE: add this back in later
00137         //assert( CanCheckInterference( entity ) ) ;    //IMPROVE: this should be error handled
00138         
00139         //determine the type of the entity
00140         if( dynamic_cast< const Mesh* >( entity ) != NULL )
00141         {
00142                 return( IsInterfering( dynamic_cast< const Mesh* >( entity ) ) ) ;
00143         }
00144         else
00145         {
00146                 //IMPROVE: this should cause an assertion, remove the return statement
00147                 return false ;
00148                 assert( false ) ;       //should never get to here due to the assert( CanCheckInterference )
00149         }
00150         return false ;
00151   //## end Mesh::IsInterfering%927145475.body
00152 }
00153 
00154 //=============================================================================
00155 // Mesh::GetFacets
00156 //=============================================================================
00157 FACETVECTOR& Mesh::GetFacets()
00158 {
00159     return facets;
00160 }
00161 
00162 //=============================================================================
00163 // Mesh::GetFacets
00164 //=============================================================================
00165 const FACETVECTOR& Mesh::GetFacets() const
00166 {
00167     return facets;
00168 }
00169 
00170 //=============================================================================
00171 // Mesh::GetVertexes
00172 //=============================================================================
00173 VECTOR4VECTOR& Mesh::GetVertexes()
00174 {
00175     return vertexes;
00176 }
00177 
00178 //=============================================================================
00179 // Mesh::GetVertexes
00180 //=============================================================================
00181 const VECTOR4VECTOR& Mesh::GetVertexes() const
00182 {
00183     return vertexes;
00184 }
00185 
00186 void Mesh::AddFacet (const Facet& facet)
00187 {
00188   //## begin Mesh::AddFacet%927145476.body preserve=yes
00189         if( facet.vertexNumbers.size() < 3 )
00190         {
00191                 //trying to add an invalid facet
00192                 return;
00193         }
00194         facets.push_back( facet ) ;             //IMPROVE: use a mapping here, not a vector 
00195   //## end Mesh::AddFacet%927145476.body
00196 }
00197 
00198 void Mesh::AddVertex (const Vector4& vertex)
00199 {
00200   //## begin Mesh::AddVertex%927145477.body preserve=yes
00201         vertexes.push_back( vertex ) ;          //IMPROVE: use a mapping here, not a vector
00202   //## end Mesh::AddVertex%927145477.body
00203 }
00204 
00205 bool Mesh::ReadFromIcollideFile (std::string fileName)
00206 {
00207         return true ;
00208   //## end Mesh::ReadFromIcollideFile%927145478.body
00209 }
00210 
00211 //got to here
00212 
00213 
00214 void Mesh::SetCoordinates (const std::vector<Vector4>& vertexes)
00215 {
00216   //## begin Mesh::SetCoordinates%927307376.body preserve=yes
00217         this->vertexes.clear() ;
00218         for( int i = 0; i < vertexes.size(); i++ )
00219         {
00220                 this->vertexes.push_back( vertexes[ i ] ) ;
00221         }
00222   //## end Mesh::SetCoordinates%927307376.body
00223 }
00224 
00225 void Mesh::TransformVerticies (const Matrix4x4& transform)
00226 {
00227   //## begin Mesh::TransformVerticies%927223871.body preserve=yes
00228         for( int i = 0; i < vertexes.size(); i++ )
00229         {
00230                 Vector4 old = vertexes[ i ] ;
00231                 Vector4 transformed = transform * vertexes[ i ] ;
00232                 Vector4& stored = vertexes[ i ] ;
00233                 stored = transformed ;
00234         }
00235   //## end Mesh::TransformVerticies%927223871.body
00236 }
00237 
00238 void Mesh::SetCoordinateEnumerations (const std::vector< std::vector < unsigned int > >& vertexes)
00239 {
00240   //## begin Mesh::SetCoordinateEnumerations%927307377.body preserve=yes
00241         facets.clear() ;
00242         int vertexSize = vertexes.size() ;
00243         for( int i = 0; i < vertexes.size(); i++ )
00244         {
00245                 const std::vector< unsigned int >& facetPoints = vertexes[ i ] ;
00246                 Facet facet ;
00247                 int facetsSize = vertexes[ i ].size() ;
00248                 for( int j = 0; j < facetPoints.size(); j++ )
00249                 {
00250                         facet.vertexNumbers.push_back( facetPoints[ j ] ) ;
00251                 }
00252                 if( facet.vertexNumbers.size() >=3 )
00253                 {
00254                         facets.push_back( facet ) ;
00255                 }
00256                 else
00257                 {
00258                         //attempting to add an invalid facet
00259                 }
00260         }
00261   //## end Mesh::SetCoordinateEnumerations%927307377.body
00262 }
00263 
00264 //got to here
00265 
00266 void Mesh::AddToVcollide (VCollide& vcollide) const
00267 {
00268   //## begin Mesh::AddToVcollide%927920610.body preserve=yes
00269         assert( vcollideIndex == -1 ) ;
00270 
00271         //ask vcollide to create a new object
00272         int success = vcollide.NewObject( &vcollideIndex );
00273         if( vcollideIndex > maxVcollideIndex )
00274         {
00275                 maxVcollideIndex = vcollideIndex ;
00276         }
00277         assert( success == VC_OK ) ;
00278 
00279         //need to add each triangle to vcollide individually
00280         for( int i = 0; i < facets.size(); i++ )
00281         {
00282                 Facet face = facets[ i ] ;
00283                 int edges = face.vertexNumbers.size() ;
00284                 assert( edges == 3 ) ;
00285                 double v1[ 3 ] ;
00286                 double v2[ 3 ] ;
00287                 double v3[ 3 ] ;
00288 
00289                 //copy the vertex points of the mesh into the arrays above
00290                 for( int j = 0; j < 3; j++ )
00291                 {
00292                         v1[ j ] = vertexes[ face.vertexNumbers[ 0 ] ][ j ] ;
00293                         v2[ j ] = vertexes[ face.vertexNumbers[ 1 ] ][ j ] ;
00294                         v3[ j ] = vertexes[ face.vertexNumbers[ 2 ] ][ j ] ;
00295                 }
00296                 vcollide.AddTri( v1, v2, v3 ) ;
00297         }
00298 
00299         //tell VCollide that we're done adding the object
00300         success = vcollide.EndObject() ;
00301         if( success == VC_ERR_EMPTY_OBJECT )
00302         {
00303                 vcollideIndex = -1 ;    //this is an empty object - it won't collide with anything
00304                 assert( false ) ;
00305         }
00306         assert( success == VC_OK ) ;
00307 
00308         //deactivate the object from all collision detection queries
00309         //IMPROVE: This is not working at present- 
00310         //for( i = 0; i < maxVcollideIndex; i++ )
00311         //{
00312         //      success = vcollide.DeactivatePair( vcollideIndex, i ) ;
00313         //      assert( success == VC_OK ) ;
00314         //}
00315         //success = vcollide->DeactivateObject ( vcollideIndex );
00316         //assert( success == VC_OK ) ;
00317 
00318   //## end Mesh::AddToVcollide%927920610.body
00319 }
00320 
00321 bool Mesh::IsInterfering (const Mesh* entity) const
00322 {
00323   //## begin Mesh::IsInterfering%927920611.body preserve=yes
00324 
00325         static int numberOfTimesCalled = 0 ;
00326         numberOfTimesCalled++ ;
00327 
00328         //make sure the vcollide library is instantiated
00329         if( vcollide == NULL )
00330         {
00331                 vcollide = new( VCollide ) ;
00332         }
00333 
00334         //make sure this mesh has been added to the vcollide detector
00335         if( vcollideIndex == -1 )
00336         {
00337                 AddToVcollide( *vcollide ) ;
00338         }
00339 
00340         //make sure that the target mesh has also been added to the vcollide detector
00341         if( entity->vcollideIndex == -1 )
00342         {
00343                 entity->AddToVcollide( *vcollide ) ;
00344         }
00345 
00346         //query vcollide to see if the two entities intersect
00347         //set the pair of objects to test intersections
00348         int success = vcollide->ActivatePair( vcollideIndex, entity->vcollideIndex ) ;
00349         assert( success == VC_OK ) ;
00350 
00351         //update the transformation matricies associated with these objects
00352         double trans1[4][4] ;
00353         double trans2[4][4] ;
00354         Matrix4x4 m1 = GetTransform() ; 
00355         Matrix4x4 m2 = entity->GetTransform() ;
00356         for( int i = 0; i < 4; i++ )
00357         {
00358                 for( int j = 0; j < 4; j++ )
00359                 {
00360                         trans1[ j ][ i ] = m1( j, i ) ;         //IMPROVE: this loop is potentially slow
00361                         trans2[ j ][ i ] = m2( j, i ) ;
00362                 }
00363         }
00364 
00365         vcollide->UpdateTrans( vcollideIndex, trans1 ) ;
00366         vcollide->UpdateTrans( entity->vcollideIndex, trans2 ) ;
00367 
00368         //query the collisions
00369         success = vcollide->Collide() ;
00370         assert( success = VC_OK ) ;
00371 
00372         VCReportType vcrep[ 1 ] ;
00373         int number = vcollide->Report( 1, vcrep ) ;
00374 
00375         //look at the actual report
00376 
00377         //unset the pair of objects to test intersections
00378         vcollide->DeactivatePair( vcollideIndex, entity->vcollideIndex ) ;
00379         //vcollide
00380 
00381         if( number > 0 )
00382         {
00383                 return true ;
00384         }
00385         return false ;
00386   //## end Mesh::IsInterfering%927920611.body
00387 }
00388 
00389 void Mesh::ResetVcollide ()
00390 {
00391   //## begin Mesh::ResetVcollide%927936640.body preserve=yes
00392         delete vcollide ;       //IMPROVE: do I need to delete all the objects too? I hope not
00393         vcollide = NULL ;
00394         vcollide = new VCollide ;
00395         maxVcollideIndex = -1 ;
00396   //## end Mesh::ResetVcollide%927936640.body
00397 }
00398 //got to here
00399 
00400 void Mesh::Splice (const Mesh& mesh)
00401 {
00402   //## begin Mesh::Splice%931291668.body preserve=yes
00403         //IMPROVE: make this splicing a little bit smarter
00404         int vertexSize = vertexes.size() ;
00405 
00406     int i;
00407         for( i = 0; i < mesh.vertexes.size(); i++ )
00408         {
00409                 vertexes.push_back( mesh.vertexes[ i ] ) ;
00410         }
00411 
00412         for( i = 0; i < mesh.facets.size(); i++ )
00413         {
00414                 Facet f = mesh.facets[ i ] ;
00415                 for( int j = 0; j < f.vertexNumbers.size(); j++ )
00416                 {
00417                         f.vertexNumbers[ j ] += vertexSize ;
00418                 }
00419                 facets.push_back( f ) ;
00420         }
00421         assert( false ) ;
00422   //## end Mesh::Splice%931291668.body
00423 }
00424 
00425 void Mesh::SetFrame (const Matrix4x4& frame)
00426 {
00427   //## begin Mesh::SetFrame%928263344.body preserve=yes
00428         TransformVerticies( frame ) ;   //IMPROVE: repeated calls to this functino will have the wrong result
00429   //## end Mesh::SetFrame%928263344.body
00430 }
00431 
00432 bool Mesh::IsInterfering (const MPK_Sphere* entity) const
00433 {
00434   //## begin Mesh::IsInterfering%931291670.body preserve=yes
00435         //IMPROVE: this is not going to be efficient
00436 
00437         //iterate through all the facets
00438         for( int f = 0; f < facets.size(); f++ )
00439         {
00440                 Facet facet = facets[ f ] ;
00441                 //check the endpoints of the facet
00442         int i;
00443                 for( i = 0; i < facet.vertexNumbers.size(); i++ )
00444                 {
00445                         Vector4 offset = ( entity->Position() - vertexes[ facet.vertexNumbers[ i ] ] ) ;
00446                         double distance = offset.MagSquared() ;
00447                         if( distance < Sqr( entity->Radius() ) )
00448                         {
00449                                 return true ;
00450                         }
00451                 }
00452 
00453                 //check the segments making up the facet
00454                 for( i = 0; i < facet.vertexNumbers.size(); i++ )
00455                 {
00456                         int v1 = i ;
00457                         int v2 = ( i + 1 ) % facet.vertexNumbers.size() ;
00458 
00459             MPK::Segment s( this->frameManager ) ;      //IMPROVE: can't I use a segment without a framemanager?
00460                         s.SetStart( vertexes[ v1 ] ) ;
00461                         s.SetEnd( vertexes[ v2 ] ) ;
00462                         if( s.IsInterfering( entity ) )
00463                         {
00464                                 return true ;
00465                         }
00466                 }
00467 
00468                 //check the sphere and this facet's interior
00469                 assert( false ) ;
00470         }
00471         return false ;
00472   //## end Mesh::IsInterfering%931291670.body
00473 }
00474 
00475 void Mesh::Serialize (ostream& os) const
00476 {
00477   //## begin Mesh::Serialize%934154736.body preserve=yes
00478         using std::endl ;
00479         os << "#mesh" << endl ;
00480 
00481         //output all the vertexes
00482         os << "#vertexes " << vertexes.size() << endl ;
00483     int i;
00484         for( i = 0; i < vertexes.size(); i++ )
00485         {
00486                 os << vertexes[ i ] << endl ;
00487         }
00488 
00489         //output all the facets
00490         os << "#facets " << facets.size() << endl ;
00491         for( i = 0; i < facets.size(); i++ )
00492         {
00493                 os << facets[ i ] << endl ; 
00494         }
00495 
00496         os << "#end_mesh" << endl ;
00497   //## end Mesh::Serialize%934154736.body
00498 }
00499 
00500 void Mesh::Deserialize(IfstreamWithComments& is)
00501 {
00502 
00503   //## begin Mesh::Deserialize%934154737.body preserve=yes
00504         char marker[ 300 ] = "" ;
00505 
00506         //input the vertexes
00507         vertexes.clear() ;
00508         eatwhite( is ) ;
00509         is.getline( marker, 300, ' ' ) ;
00510         assert( strcmp( marker, "#vertexes" ) == 0 ) ;
00511         int vertexNumber = -1 ;
00512         is >> vertexNumber ;
00513 
00514     int i;
00515         for( i = 0; i < vertexNumber; i++ )
00516         {
00517                 Vector4 readIn ;
00518                 is >> readIn ;
00519                 vertexes.push_back( readIn ) ;
00520         }
00521 /*
00522         //input the facets
00523         facets.clear() ;
00524         eatwhite( is ) ;
00525         is.getline( marker, 300, ' ' ) ;
00526         assert( strcmp( marker, "#facets" ) == 0 ) ;
00527         int facetNumber = -1 ;
00528         is >> facetNumber ;
00529 
00530         for( i = 0; i < facetNumber; i++ )
00531         {
00532                 Facet readIn ;
00533                 is >> readIn ;
00534                 facets.push_back( readIn ) ;
00535         }
00536  
00537     eatwhite( is ) ;
00538         is.getline( marker, 300 ) ;
00539         assert( strcmp( marker, "#end_mesh" ) == 0 ) ;
00540 
00541 */
00542   //## end Mesh::Deserialize%934154737.body
00543 }
00544 
00545 bool Mesh::Validate () const
00546 {
00547   //## begin Mesh::Validate%971655314.body preserve=yes
00548         int i;
00549         for( i = 0; i < this->vertexes.size(); i++ )
00550         {
00551                 Vector4 vertex = vertexes[ i ];
00552         }
00553 
00554         for( i = 0; i < facets.size(); i++ )
00555         {
00556                 Facet f = facets[ i ];
00557                 int j;
00558                 for( j = 0; j < f.vertexNumbers.size(); j++ )
00559                 {
00560                         int vertexNum = f.vertexNumbers[ j ];
00561                         if( vertexNum > vertexes.size() )
00562                         {
00563                                 return false;
00564                         }
00565 
00566                         if( vertexNum < 0 )
00567                         {
00568                                 return false;
00569                         }
00570                 }
00571         }
00572         return true;
00573   //## end Mesh::Validate%971655314.body
00574 }
00575 
00576 // Additional Declarations
00577   //## begin Mesh%37431D0E02A4.declarations preserve=yes
00578 int Mesh::TotalPolys() const
00579 {
00580         return facets.size() ;
00581 }
00582 
00583 bool Mesh::Verify() const
00584 {
00585         return true;
00586 }
00587   //## end Mesh%37431D0E02A4.declarations
00588 //## begin module%37431D0E02A4.epilog preserve=yes
00589 //## end module%37431D0E02A4.epilog

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