MeshLib C++ Docs
Loading...
Searching...
No Matches
MRMeshIntersect.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRPointOnFace.h"
4#include "MRTriPoint.h"
5#include "MRLine3.h"
6#include "MRMeshPart.h"
7#include "MRMeshTriPoint.h"
8#include <cfloat>
9#include <functional>
10
11namespace MR
12{
13
16
17struct MeshIntersectionResult
18{
20 PointOnFace proj;
21
23 MeshTriPoint mtp;
24
26 float distanceAlongLine = 0;
27
29 explicit operator bool() const { return proj.face.valid(); }
30};
31
38[[nodiscard]] MRMESH_API MeshIntersectionResult rayMeshIntersect( const MeshPart& meshPart, const Line3f& line,
39 float rayStart = 0.0f, float rayEnd = FLT_MAX, const IntersectionPrecomputes<float>* prec = nullptr, bool closestIntersect = true,
40 const FacePredicate & validFaces = {} );
41
48[[nodiscard]] MRMESH_API MeshIntersectionResult rayMeshIntersect( const MeshPart& meshPart, const Line3d& line,
49 double rayStart = 0.0, double rayEnd = DBL_MAX, const IntersectionPrecomputes<double>* prec = nullptr, bool closestIntersect = true,
50 const FacePredicate & validFaces = {} );
51
52struct MultiRayMeshIntersectResult
53{
54 // outputs (each one if optional) for every ray:
55 BitSet * intersectingRays = nullptr;
56 std::vector<float> * rayDistances = nullptr;
57 std::vector<FaceId> * isectFaces = nullptr;
58 std::vector<TriPointf> * isectBary = nullptr;
59 std::vector<Vector3f> * isectPts = nullptr;
60};
61
66 // input:
67 const MeshPart& meshPart,
68 const std::vector<Vector3f>& origins,
69 const std::vector<Vector3f>& dirs,
70 const MultiRayMeshIntersectResult& result,
71 // advanced options:
72 float rayStart = 0.0f, float rayEnd = FLT_MAX,
73 bool closestIntersect = true,
74 const FacePredicate & validFaces = {}
75);
76
77struct MultiMeshIntersectionResult : MeshIntersectionResult
78{
80 const Mesh * mesh = nullptr;
81};
82
83template<typename T>
85{
86 Line3<T> line;
88 const Mesh * mesh = nullptr;
89 const AABBTree * tree = nullptr;
90 const FaceBitSet * region = nullptr;
91};
92using Line3fMesh = Line3Mesh<float>;
93using Line3dMesh = Line3Mesh<double>;
94
97[[nodiscard]] MRMESH_API MultiMeshIntersectionResult rayMultiMeshAnyIntersect( const std::vector<Line3fMesh> & lineMeshes,
98 float rayStart = 0.0f, float rayEnd = FLT_MAX );
100[[nodiscard]] MRMESH_API MultiMeshIntersectionResult rayMultiMeshAnyIntersect( const std::vector<Line3dMesh> & lineMeshes,
101 double rayStart = 0.0, double rayEnd = DBL_MAX );
102
105using MeshIntersectionCallback = std::function<bool(const MeshIntersectionResult &)>;
108MRMESH_API void rayMeshIntersectAll( const MeshPart& meshPart, const Line3f& line, MeshIntersectionCallback callback,
109 float rayStart = 0.0f, float rayEnd = FLT_MAX, const IntersectionPrecomputes<float>* prec = nullptr );
111MRMESH_API void rayMeshIntersectAll( const MeshPart& meshPart, const Line3d& line, MeshIntersectionCallback callback,
112 double rayStart = 0.0, double rayEnd = DBL_MAX, const IntersectionPrecomputes<double>* prec = nullptr );
113
119MRMESH_API void planeMeshIntersect( const MeshPart& meshPart, const Plane3f & plane,
121 std::vector<FaceId> * fsVec = nullptr );
122
128MRMESH_API void xyPlaneMeshIntersect( const MeshPart& meshPart, float zLevel,
130 std::vector<FaceId> * fsVec = nullptr );
131
133
134} // namespace MR
#define MRMESH_API
Definition MRMeshFwd.h:80
Definition MRAABBTree.h:16
Definition MRMeshIntersect.h:18
new unsafe MR.MeshTriPoint mtp
new unsafe ref float distanceAlongLine
new unsafe MR.PointOnFace proj
Definition MRMesh/MRMesh.h:23
Definition MRMeshIntersect.h:78
new unsafe MR.? Const_Mesh mesh
Definition MRMeshIntersect.h:53
new unsafe MR.Std.? Vector_MRTriPointf isectBary
new unsafe MR.? BitSet intersectingRays
new unsafe MR.Std.? Vector_MRFaceId isectFaces
new unsafe MR.Std.? Vector_Float rayDistances
MRMESH_API void multiRayMeshIntersect(const MeshPart &meshPart, const std::vector< Vector3f > &origins, const std::vector< Vector3f > &dirs, const MultiRayMeshIntersectResult &result, float rayStart=0.0f, float rayEnd=FLT_MAX, bool closestIntersect=true, const FacePredicate &validFaces={})
MRMESH_API MeshIntersectionResult rayMeshIntersect(const MeshPart &meshPart, const Line3f &line, float rayStart=0.0f, float rayEnd=FLT_MAX, const IntersectionPrecomputes< float > *prec=nullptr, bool closestIntersect=true, const FacePredicate &validFaces={})
MRMESH_API void xyPlaneMeshIntersect(const MeshPart &meshPart, float zLevel, FaceBitSet *fs, UndirectedEdgeBitSet *ues, VertBitSet *vs, std::vector< FaceId > *fsVec=nullptr)
MRMESH_API MultiMeshIntersectionResult rayMultiMeshAnyIntersect(const std::vector< Line3fMesh > &lineMeshes, float rayStart=0.0f, float rayEnd=FLT_MAX)
MRMESH_API void planeMeshIntersect(const MeshPart &meshPart, const Plane3f &plane, FaceBitSet *fs, UndirectedEdgeBitSet *ues, VertBitSet *vs, std::vector< FaceId > *fsVec=nullptr)
Line3Mesh< double > Line3dMesh
Definition MRMeshIntersect.h:93
Line3Mesh< float > Line3fMesh
Definition MRMeshIntersect.h:92
std::function< bool(const MeshIntersectionResult &)> MeshIntersectionCallback
Definition MRMeshIntersect.h:105
MRMESH_API void rayMeshIntersectAll(const MeshPart &meshPart, const Line3f &line, MeshIntersectionCallback callback, float rayStart=0.0f, float rayEnd=FLT_MAX, const IntersectionPrecomputes< float > *prec=nullptr)
Definition MRCameraOrientationPlugin.h:8
Definition MRMeshFwd.h:503
Definition MRMeshIntersect.h:85
Line3< T > line
in the reference frame of mesh
Definition MRMeshIntersect.h:86
const Mesh * mesh
must be set a valid pointer before use
Definition MRMeshIntersect.h:88
const FaceBitSet * region
may remain nullptr, meaning all mesh
Definition MRMeshIntersect.h:90
const AABBTree * tree
must be set a valid pointer before use
Definition MRMeshIntersect.h:89
IntersectionPrecomputes< T > * prec
set it to a valid pointer for better performance
Definition MRMeshIntersect.h:87