MeshLib C++ Docs
Loading...
Searching...
No Matches
MRMesh/MRMeshCollidePrecise.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRId.h"
4#include "MRMeshPart.h"
6
7#include <functional>
8
9namespace MR
10{
11
14
16struct EdgeTri
17{
18 EdgeId edge;
19 FaceId tri;
20 EdgeTri() = default;
21 EdgeTri( EdgeId e, FaceId t ) : edge( e ), tri( t ) { }
22};
23
24inline bool operator==( const EdgeTri& a, const EdgeTri& b )
25{
26 return a.edge.undirected() == b.edge.undirected() && a.tri == b.tri;
27}
28
32{
33 EdgeId edge;
35 {
36 unsigned int isEdgeATriB : 1 = 0;
37 unsigned int face : 31 = 0;
38 bool operator==( const FlaggedTri& ) const = default;
40
41 [[nodiscard]] FaceId tri() const { return FaceId( flaggedTri.face ); }
42 [[nodiscard]] bool isEdgeATriB() const { return bool( flaggedTri.isEdgeATriB ); }
43 [[nodiscard]] EdgeTri edgeTri() const { return EdgeTri( edge, tri() ); }
44
45 [[nodiscard]] bool valid() const { return edge.valid(); }
46 [[nodiscard]] explicit operator bool() const { return edge.valid(); }
47
48 VarEdgeTri() = default;
49 VarEdgeTri( bool isEdgeATriB, EdgeId e, FaceId t )
50 {
51 assert( t.valid() );
52 edge = e;
54 flaggedTri.face = t;
55 }
56 VarEdgeTri( bool isEdgeATriB, const EdgeTri& et ) : VarEdgeTri( isEdgeATriB, et.edge, et.tri ) {}
57
58 [[nodiscard]] bool operator==( const VarEdgeTri& ) const = default;
59};
60static_assert( sizeof( VarEdgeTri ) == 8 );
61
63using PreciseCollisionResult = std::vector<VarEdgeTri>;
64
70MRMESH_API PreciseCollisionResult findCollidingEdgeTrisPrecise( const MeshPart & a, const MeshPart & b,
71 ConvertToIntVector conv, const AffineXf3f* rigidB2A = nullptr, bool anyIntersection = false );
72
79MRMESH_API std::vector<EdgeTri> findSelfCollidingEdgeTrisPrecise( const MeshPart& mp,
80 ConvertToIntVector conv, bool anyIntersection = false, const AffineXf3f* rigidB2A = nullptr, int aVertSizes = 0 );
81
84 const Mesh & a, const std::vector<EdgeId> & edgesA,
85 const Mesh & b, const std::vector<FaceId> & facesB,
86 ConvertToIntVector conv, const AffineXf3f * rigidB2A = nullptr );
87
90 const Mesh & a, const std::vector<FaceId> & facesA,
91 const Mesh & b, const std::vector<EdgeId> & edgesB,
92 ConvertToIntVector conv, const AffineXf3f * rigidB2A = nullptr );
93
98MRMESH_API CoordinateConverters getVectorConverters( const MeshPart& a, const MeshPart& b,
99 const AffineXf3f* rigidB2A = nullptr );
100
102
103} // namespace MR
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:79
MRMESH_API PreciseCollisionResult findCollidingEdgeTrisPrecise(const MeshPart &a, const MeshPart &b, ConvertToIntVector conv, const AffineXf3f *rigidB2A=nullptr, bool anyIntersection=false)
finds all pairs of colliding edges from one mesh and triangle from another mesh
MRMESH_API CoordinateConverters getVectorConverters(const MeshPart &a, const MeshPart &b, const AffineXf3f *rigidB2A=nullptr)
creates simple converters from Vector3f to Vector3i and back in mesh parts area range
std::vector< VarEdgeTri > PreciseCollisionResult
each edge is directed to have its origin inside and its destination outside of the other mesh
Definition MRMesh/MRMeshCollidePrecise.h:63
MRMESH_API std::vector< EdgeTri > findSelfCollidingEdgeTrisPrecise(const MeshPart &mp, ConvertToIntVector conv, bool anyIntersection=false, const AffineXf3f *rigidB2A=nullptr, int aVertSizes=0)
finds all pairs of colliding edges and triangle within one mesh
MRMESH_API bool operator==(const BitSet &a, const BitSet &b)
compare that two bit sets have the same set bits (they can be equal even if sizes are distinct but la...
Definition MRCameraOrientationPlugin.h:8
std::function< Vector3i(const Vector3f &)> ConvertToIntVector
float-to-int coordinate converter
Definition MRMesh/MRPrecisePredicates3.h:47
this struct contains coordinate converters float-int-float
Definition MRMesh/MRPrecisePredicates3.h:52
edge from one mesh and triangle from another mesh
Definition MRMesh/MRMeshCollidePrecise.h:17
EdgeTri(EdgeId e, FaceId t)
Definition MRMesh/MRMeshCollidePrecise.h:21
EdgeId edge
Definition MRMesh/MRMeshCollidePrecise.h:18
EdgeTri()=default
FaceId tri
Definition MRMesh/MRMeshCollidePrecise.h:19
Definition MRMesh/MRMesh.h:22
Definition MRMesh/MRMeshCollidePrecise.h:35
unsigned int isEdgeATriB
Definition MRMesh/MRMeshCollidePrecise.h:36
bool operator==(const FlaggedTri &) const =default
unsigned int face
Definition MRMesh/MRMeshCollidePrecise.h:37
Definition MRMesh/MRMeshCollidePrecise.h:32
EdgeTri edgeTri() const
Definition MRMesh/MRMeshCollidePrecise.h:43
bool isEdgeATriB() const
Definition MRMesh/MRMeshCollidePrecise.h:42
EdgeId edge
Definition MRMesh/MRMeshCollidePrecise.h:33
bool operator==(const VarEdgeTri &) const =default
bool valid() const
Definition MRMesh/MRMeshCollidePrecise.h:45
VarEdgeTri(bool isEdgeATriB, const EdgeTri &et)
Definition MRMesh/MRMeshCollidePrecise.h:56
VarEdgeTri()=default
struct MR::VarEdgeTri::FlaggedTri flaggedTri
VarEdgeTri(bool isEdgeATriB, EdgeId e, FaceId t)
Definition MRMesh/MRMeshCollidePrecise.h:49
FaceId tri() const
Definition MRMesh/MRMeshCollidePrecise.h:41