00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
00024 int Mesh::maxVcollideIndex = -1;
00025
00026
00027
00028 VCollide* Mesh::vcollide = NULL;
00029
00030
00031
00032 int Mesh::countInstances = 0;
00033
00034
00035
00036
00037
00038
00039 Mesh::Mesh (FrameManager* frameManager)
00040
00041
00042
00043 :ObjectBase( frameManager ) ,
00044 vcollideIndex( -1 )
00045
00046 {
00047
00048 countInstances++ ;
00049
00050 }
00051
00052 Mesh::Mesh (const Mesh& right)
00053
00054
00055
00056 :ObjectBase( right ),
00057 vcollideIndex( -1 )
00058
00059 {
00060
00061
00062
00063 this->vertexes = right.vertexes;
00064
00065
00066 this->facets = right.facets;
00067
00068 countInstances++ ;
00069
00070 }
00071
00072
00073
00074
00075
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 );
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
00101 if( vcollide != NULL )
00102 {
00103 delete vcollide ;
00104 vcollide = NULL ;
00105 }
00106 facets.clear() ;
00107 vertexes.clear() ;
00108 countInstances-- ;
00109
00110 }
00111
00112
00113
00114
00115 bool Mesh::CanCheckInterference (const Entity* entity) const
00116 {
00117
00118 if( dynamic_cast< const Mesh* >( entity ) != NULL )
00119 {
00120 return true ;
00121 }
00122 return false ;
00123
00124 }
00125
00126 Entity* Mesh::Clone () const
00127 {
00128
00129 return new Mesh( *this ) ;
00130
00131 }
00132
00133 bool Mesh::IsInterfering (const Entity* entity) const
00134 {
00135
00136
00137
00138
00139
00140 if( dynamic_cast< const Mesh* >( entity ) != NULL )
00141 {
00142 return( IsInterfering( dynamic_cast< const Mesh* >( entity ) ) ) ;
00143 }
00144 else
00145 {
00146
00147 return false ;
00148 assert( false ) ;
00149 }
00150 return false ;
00151
00152 }
00153
00154
00155
00156
00157 FACETVECTOR& Mesh::GetFacets()
00158 {
00159 return facets;
00160 }
00161
00162
00163
00164
00165 const FACETVECTOR& Mesh::GetFacets() const
00166 {
00167 return facets;
00168 }
00169
00170
00171
00172
00173 VECTOR4VECTOR& Mesh::GetVertexes()
00174 {
00175 return vertexes;
00176 }
00177
00178
00179
00180
00181 const VECTOR4VECTOR& Mesh::GetVertexes() const
00182 {
00183 return vertexes;
00184 }
00185
00186 void Mesh::AddFacet (const Facet& facet)
00187 {
00188
00189 if( facet.vertexNumbers.size() < 3 )
00190 {
00191
00192 return;
00193 }
00194 facets.push_back( facet ) ;
00195
00196 }
00197
00198 void Mesh::AddVertex (const Vector4& vertex)
00199 {
00200
00201 vertexes.push_back( vertex ) ;
00202
00203 }
00204
00205 bool Mesh::ReadFromIcollideFile (std::string fileName)
00206 {
00207 return true ;
00208
00209 }
00210
00211
00212
00213
00214 void Mesh::SetCoordinates (const std::vector<Vector4>& vertexes)
00215 {
00216
00217 this->vertexes.clear() ;
00218 for( int i = 0; i < vertexes.size(); i++ )
00219 {
00220 this->vertexes.push_back( vertexes[ i ] ) ;
00221 }
00222
00223 }
00224
00225 void Mesh::TransformVerticies (const Matrix4x4& transform)
00226 {
00227
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
00236 }
00237
00238 void Mesh::SetCoordinateEnumerations (const std::vector< std::vector < unsigned int > >& vertexes)
00239 {
00240
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
00259 }
00260 }
00261
00262 }
00263
00264
00265
00266 void Mesh::AddToVcollide (VCollide& vcollide) const
00267 {
00268
00269 assert( vcollideIndex == -1 ) ;
00270
00271
00272 int success = vcollide.NewObject( &vcollideIndex );
00273 if( vcollideIndex > maxVcollideIndex )
00274 {
00275 maxVcollideIndex = vcollideIndex ;
00276 }
00277 assert( success == VC_OK ) ;
00278
00279
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
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
00300 success = vcollide.EndObject() ;
00301 if( success == VC_ERR_EMPTY_OBJECT )
00302 {
00303 vcollideIndex = -1 ;
00304 assert( false ) ;
00305 }
00306 assert( success == VC_OK ) ;
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 }
00320
00321 bool Mesh::IsInterfering (const Mesh* entity) const
00322 {
00323
00324
00325 static int numberOfTimesCalled = 0 ;
00326 numberOfTimesCalled++ ;
00327
00328
00329 if( vcollide == NULL )
00330 {
00331 vcollide = new( VCollide ) ;
00332 }
00333
00334
00335 if( vcollideIndex == -1 )
00336 {
00337 AddToVcollide( *vcollide ) ;
00338 }
00339
00340
00341 if( entity->vcollideIndex == -1 )
00342 {
00343 entity->AddToVcollide( *vcollide ) ;
00344 }
00345
00346
00347
00348 int success = vcollide->ActivatePair( vcollideIndex, entity->vcollideIndex ) ;
00349 assert( success == VC_OK ) ;
00350
00351
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 ) ;
00361 trans2[ j ][ i ] = m2( j, i ) ;
00362 }
00363 }
00364
00365 vcollide->UpdateTrans( vcollideIndex, trans1 ) ;
00366 vcollide->UpdateTrans( entity->vcollideIndex, trans2 ) ;
00367
00368
00369 success = vcollide->Collide() ;
00370 assert( success = VC_OK ) ;
00371
00372 VCReportType vcrep[ 1 ] ;
00373 int number = vcollide->Report( 1, vcrep ) ;
00374
00375
00376
00377
00378 vcollide->DeactivatePair( vcollideIndex, entity->vcollideIndex ) ;
00379
00380
00381 if( number > 0 )
00382 {
00383 return true ;
00384 }
00385 return false ;
00386
00387 }
00388
00389 void Mesh::ResetVcollide ()
00390 {
00391
00392 delete vcollide ;
00393 vcollide = NULL ;
00394 vcollide = new VCollide ;
00395 maxVcollideIndex = -1 ;
00396
00397 }
00398
00399
00400 void Mesh::Splice (const Mesh& mesh)
00401 {
00402
00403
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
00423 }
00424
00425 void Mesh::SetFrame (const Matrix4x4& frame)
00426 {
00427
00428 TransformVerticies( frame ) ;
00429
00430 }
00431
00432 bool Mesh::IsInterfering (const MPK_Sphere* entity) const
00433 {
00434
00435
00436
00437
00438 for( int f = 0; f < facets.size(); f++ )
00439 {
00440 Facet facet = facets[ f ] ;
00441
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
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 ) ;
00460 s.SetStart( vertexes[ v1 ] ) ;
00461 s.SetEnd( vertexes[ v2 ] ) ;
00462 if( s.IsInterfering( entity ) )
00463 {
00464 return true ;
00465 }
00466 }
00467
00468
00469 assert( false ) ;
00470 }
00471 return false ;
00472
00473 }
00474
00475 void Mesh::Serialize (ostream& os) const
00476 {
00477
00478 using std::endl ;
00479 os << "#mesh" << endl ;
00480
00481
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
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
00498 }
00499
00500 void Mesh::Deserialize(IfstreamWithComments& is)
00501 {
00502
00503
00504 char marker[ 300 ] = "" ;
00505
00506
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
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543 }
00544
00545 bool Mesh::Validate () const
00546 {
00547
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
00574 }
00575
00576
00577
00578 int Mesh::TotalPolys() const
00579 {
00580 return facets.size() ;
00581 }
00582
00583 bool Mesh::Verify() const
00584 {
00585 return true;
00586 }
00587
00588
00589