MeshLib C++ Docs
Loading...
Searching...
No Matches
MRSurfaceDistanceBuilder.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRId.h"
4#include "MRVector.h"
5#include "MRVector3.h"
6#include <cfloat>
7#include <optional>
8#include <queue>
9
10namespace MR
11{
12
16
17struct VertDistance
18{
20 VertId vert;
22 float distance = FLT_MAX;
23
24 VertDistance() = default;
25 VertDistance( VertId v, float d ) : vert( v ), distance( d ) { }
26};
27
29inline bool operator <( const VertDistance & a, const VertDistance & b )
30{
31 return a.distance > b.distance;
32}
33
35class SurfaceDistanceBuilder
36{
37public:
38 MRMESH_API SurfaceDistanceBuilder( const Mesh & mesh, const VertBitSet* region );
39 SurfaceDistanceBuilder( const Mesh & mesh, const Vector3f & target, const VertBitSet* region ) :
40 SurfaceDistanceBuilder( mesh, region) { target_ = target; }
42 MRMESH_API void addStartRegion( const VertBitSet & region, float startDistance );
44 MRMESH_API void addStartVertices( const HashMap<VertId, float>& startVertices );
46 MRMESH_API void addStart( const MeshTriPoint & start );
47
50 MRMESH_API void setMaxVertUpdates( int v );
51
53 MRMESH_API VertId growOne();
55 VertScalars takeDistanceMap() { return std::move( vertDistanceMap_ ); }
56
57public:
59 bool done() const { return nextVerts_.empty(); }
61 float doneDistance() const { return nextVerts_.empty() ? FLT_MAX : nextVerts_.top().distance; }
62
63private:
64 const Mesh & mesh_;
65 const VertBitSet* region_{nullptr};
66 VertScalars vertDistanceMap_;
67 Vector<char,VertId> vertUpdatedTimes_;
68 std::priority_queue<VertDistance> nextVerts_;
69 std::optional<Vector3f> target_;
70 int maxVertUpdates_ = 3;
71
75 bool suggestVertDistance_( VertDistance c );
77 void suggestDistancesAround_( VertId v );
79 void considerLeftTriPath_( EdgeId e );
81 float metricToPenalty_( float metric, VertId v ) const;
82};
83
85
86} // namespace MR
#define MRMESH_API
Definition MRMeshFwd.h:80
unsafe SurfaceDistanceBuilder(MR._ByValue_SurfaceDistanceBuilder _other)
unsafe MR.VertScalars takeDistanceMap()
unsafe void addStartVertices(MR.Phmap.Const_FlatHashMap_MRVertId_Float startVertices)
unsafe void addStart(MR.Const_MeshTriPoint start)
unsafe void addStartRegion(MR.Const_VertBitSet region, float startDistance)
unsafe void setMaxVertUpdates(int v)
unsafe MR.VertId growOne()
Definition MRSurfaceDistanceBuilder.h:18
unsafe VertDistance()
new unsafe ref MR.VertId vert
new unsafe ref float distance
bool operator<(const VertDistance &a, const VertDistance &b)
smaller distance to be the first
Definition MRSurfaceDistanceBuilder.h:29
Definition MRCameraOrientationPlugin.h:8