| 274 | } |
| 275 | |
| 276 | MeshMeshCollisionStatus findCollisionStatus( const MeshPart& a, const MeshPart& b, const MeshMeshDistanceResult& distRes, |
| 277 | const AffineXf3f* rigidB2A /*= nullptr*/, std::vector<FaceFace>* collisions /*= nullptr */ ) |
| 278 | { |
| 279 | MR_TIMER; |
| 280 | MeshMeshCollisionStatus status; |
| 281 | if ( distRes.distSq == 0.0f ) |
| 282 | { |
| 283 | auto thisCollisions = findCollidingTriangles( a, b, rigidB2A ); |
| 284 | status = thisCollisions.empty() ? MeshMeshCollisionStatus::Touching : MeshMeshCollisionStatus::Colliding; |
| 285 | if ( collisions ) |
| 286 | *collisions = std::move( thisCollisions ); |
| 287 | return status; |
| 288 | } |
| 289 | MeshProjectionResult aRes, bRes; |
| 290 | aRes.proj = distRes.a; |
| 291 | bRes.proj = distRes.b; |
| 292 | aRes.mtp = a.mesh.toTriPoint( distRes.a ); |
| 293 | bRes.mtp = b.mesh.toTriPoint( distRes.b ); |
| 294 | bRes.distSq = aRes.distSq = distRes.distSq; |
| 295 | bool isBOutside = a.mesh.isOutsideByProjNorm( rigidB2A ? ( *rigidB2A )( distRes.b.point ) : distRes.b.point, aRes, a.region ); |
| 296 | bool isAOutside = b.mesh.isOutsideByProjNorm( rigidB2A ? rigidB2A->inverse()( distRes.a.point ) : distRes.a.point, bRes, b.region ); |
| 297 | if ( isBOutside && isAOutside ) |
| 298 | status = MeshMeshCollisionStatus::BothOutside; |
| 299 | else if ( !isBOutside && !isAOutside ) |
| 300 | status = MeshMeshCollisionStatus::BothInside; |
| 301 | else if ( isBOutside ) |
| 302 | status = MeshMeshCollisionStatus::AInside; |
| 303 | else |
| 304 | status = MeshMeshCollisionStatus::BInside; |
| 305 | return status; |
| 306 | } |
| 307 | |
| 308 | MeshMeshCollisionStatus findCollisionStatus( const MeshPart& a, const MeshPart& b, const AffineXf3f* rigidB2A /*= nullptr */ ) |
| 309 | { |
no test coverage detected