MeshLib C++ Docs
Loading...
Searching...
No Matches
MRSeparationPoint.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRId.h"
4#include "MRVector3.h"
5#include "MRVector.h"
6#include "MRphmap.h"
7#include <array>
8
9namespace MR
10{
13
14
15enum class NeighborDir
16{
17 X, Y, Z, Count
18};
19
20using SeparationPointSet = std::array<VertId, size_t( NeighborDir::Count )>;
21using SeparationPointMap = HashMap<size_t, SeparationPointSet>;
22
25{
26public:
27 struct alignas(64) Block
28 {
30 std::vector<Vector3f> coords;
32 VertId shift;
33
35 VertId nextVid() const { return VertId( coords.size() ); }
36
37 Triangulation tris;
39 };
40
42 MRMESH_API void resize( size_t blockCount, size_t blockSize );
43
45 Block & getBlock( size_t blockIndex ) { return blocks_[blockIndex]; }
46
49 MRMESH_API int makeUniqueVids();
50
52 auto findSeparationPointSet( size_t voxelId ) const -> const SeparationPointSet *
53 {
54 const auto & map = blocks_[voxelId / blockSize_].smap;
55 auto it = map.find( voxelId );
56 return ( it != map.end() ) ? &it->second : nullptr;
57 }
58
60 MRMESH_API Triangulation getTriangulation( Vector<VoxelId, FaceId>* outVoxelPerFaceMap = nullptr ) const;
61
63 MRMESH_API void getPoints( VertCoords & points ) const;
64
65private:
66 size_t blockSize_ = 0;
67 std::vector<Block> blocks_;
68};
69
70}
storage for points on voxel edges used in Marching Cubes algorithms
Definition MRSeparationPoint.h:25
std::vector<T>-like container that requires specific indexing type,
Definition MRVector.h:23
SeparationPointMap smap
Definition MRSeparationPoint.h:29
NeighborDir
Definition MRSeparationPoint.h:16
VertId nextVid() const
during filling, it is the id of next valid point;
Definition MRSeparationPoint.h:35
MRMESH_API Triangulation getTriangulation(Vector< VoxelId, FaceId > *outVoxelPerFaceMap=nullptr) const
combines triangulations from every block into one and returns it
Vector< VoxelId, FaceId > faceMap
Definition MRSeparationPoint.h:38
auto findSeparationPointSet(size_t voxelId) const -> const SeparationPointSet *
finds the set (locating the block) by voxel id
Definition MRSeparationPoint.h:52
std::vector< Vector3f > coords
Definition MRSeparationPoint.h:30
MRMESH_API void getPoints(VertCoords &points) const
obtains coordinates of all stored points
Triangulation tris
Definition MRSeparationPoint.h:37
std::array< VertId, size_t(NeighborDir::Count)> SeparationPointSet
Definition MRSeparationPoint.h:20
MRMESH_API int makeUniqueVids()
VertId shift
after makeUniqueVids(), it is the unique id of first point in coords
Definition MRSeparationPoint.h:32
HashMap< size_t, SeparationPointSet > SeparationPointMap
Definition MRSeparationPoint.h:21
MRMESH_API void resize(size_t blockCount, size_t blockSize)
prepares storage for given number of blocks, each containing given size of voxels
Block & getBlock(size_t blockIndex)
get block for filling in the thread responsible for it
Definition MRSeparationPoint.h:45
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRSeparationPoint.h:28