MeshLib
 
Loading...
Searching...
No Matches
MRObjectVoxels.h
Go to the documentation of this file.
1#pragma once
2#include "MRMeshFwd.h"
3#ifndef MRMESH_NO_OPENVDB
6#include "MRHistogram.h"
7#include "MRVolumeIndexer.h"
8#include "MRVoxelsVolume.h"
9#include "MRMarchingCubes.h"
10
11namespace MR
12{
13
17{
18public:
20 ObjectVoxels& operator = ( ObjectVoxels&& ) noexcept = default;
21 ObjectVoxels( ObjectVoxels&& ) noexcept = default;
22 virtual ~ObjectVoxels() = default;
23
24 constexpr static const char* TypeName() noexcept { return "ObjectVoxels"; }
25 virtual const char* typeName() const override { return TypeName(); }
26
27 MRMESH_API virtual void applyScale( float scaleFactor ) override;
28
30 const std::shared_ptr<Mesh>& surface() const { return mesh_; }
31
33 const VdbVolume& vdbVolume() const { return vdbVolume_; };
34 VdbVolume& varVdbVolume() { return vdbVolume_; }
35
37 const FloatGrid& grid() const { return vdbVolume_.data; }
38
39 [[nodiscard]] virtual bool hasModel() const override { return bool( vdbVolume_.data ); }
40
42 const Vector3i& dimensions() const
43 { return vdbVolume_.dims; }
45 float getIsoValue() const
46 { return isoValue_; }
48 const Histogram& histogram() const
49 { return histogram_; }
50
51 const Vector3f& voxelSize() const
52 { return vdbVolume_.voxelSize; }
53
54 MRMESH_API virtual std::vector<std::string> getInfoLines() const override;
55 virtual std::string getClassName() const override { return "Voxels"; }
56
58 MRMESH_API void construct( const SimpleVolume& simpleVolume, ProgressCallback cb = {} );
60 MRMESH_API void construct( const FloatGrid& grid, const Vector3f& voxelSize, ProgressCallback cb = {} );
62 MRMESH_API void construct( const VdbVolume& vdbVolume, ProgressCallback cb = {} );
66
69 MRMESH_API virtual Expected<bool> setIsoValue( float iso, ProgressCallback cb = {}, bool updateSurface = true );
70
73 MRMESH_API std::shared_ptr<Mesh> updateIsoSurface( std::shared_ptr<Mesh> mesh );
76 MRMESH_API VdbVolume updateVdbVolume( VdbVolume vdbVolume );
80
84 MRMESH_API Expected<std::shared_ptr<Mesh>> recalculateIsoSurface( const VdbVolume& volume, float iso, ProgressCallback cb = {} ) const;
86 MRMESH_API Histogram recalculateHistogram( std::optional<Vector2f> minmax, ProgressCallback cb = {} ) const;
88 bool getDualMarchingCubes() const { return dualMarchingCubes_; }
91 MRMESH_API virtual void setDualMarchingCubes( bool on, bool updateSurface = true, ProgressCallback cb = {} );
93 virtual void setVoxelPointPositioner( VoxelPointPositioner positioner ) { positioner_ = positioner; }
94
95
99 MRMESH_API virtual void setActiveBounds( const Box3i& activeBox, ProgressCallback cb = {}, bool updateSurface = true );
102 MRMESH_API const Box3i& getActiveBounds() const;
105
106 const VoxelBitSet& getSelectedVoxels() const { return selectedVoxels_; }
107 void selectVoxels( const VoxelBitSet& selectedVoxels ) { selectedVoxels_ = selectedVoxels; }
108
110 const VoxelBitSet& getVolumeRenderActiveVoxels() const { return volumeRenderActiveVoxels_; }
112 MRMESH_API void setVolumeRenderActiveVoxels( const VoxelBitSet& activeVoxels );
113
117 MRMESH_API VoxelId getVoxelIdByCoordinate( const Vector3i& coord ) const;
118 MRMESH_API VoxelId getVoxelIdByPoint( const Vector3f& point ) const;
120
122 const VolumeIndexer& getVolumeIndexer() const { return indexer_; }
123
124 // prepare data for volume rendering
125 // returns false if canceled or voxel data is empty
127
128 bool isVolumeRenderingEnabled() const { return volumeRendering_; }
129 // this function should only be called from GUI thread because it changes rendering object,
130 // it can take some time to prepare data, so you can prepare data with progress callback
131 // by calling `prepareDataForVolumeRendering(cb)` function before calling this one
133 // move volume rendering data to caller: basically used in RenderVolumeObject
134 [[nodiscard]] std::unique_ptr<SimpleVolume> getVolumeRenderingData() const { return std::move( volumeRenderingData_ ); }
135
136 // struct to control volume rendering texture
138 {
139 // volume texture smoothing
140 FilterType volumeFilterType{ FilterType::Linear };
141 // shading model
142 enum class ShadingType
143 {
144 None,
145 ValueGradient,
146 AlphaGradient
147 } shadingType{ ShadingType::None };
148 // coloring type
149 enum class LutType
150 {
151 GrayShades,
152 Rainbow,
153 OneColor
154 } lutType{ LutType::Rainbow };
155 // color that is used for OneColor mode
156 Color oneColor{ Color::white() };
157 // minimum colored value (voxels with lower values are transparent)
158 float min{ 0.0f };
159 // maximum colored value (voxels with higher values are transparent)
160 float max{ 0.0f };
161 // type of alpha function on texture
162 enum class AlphaType
163 {
164 Constant,
165 LinearIncreasing,
166 LinearDecreasing
167 } alphaType{ AlphaType::Constant };
168 uint8_t alphaLimit{ 10 };
169 bool operator==( const VolumeRenderingParams& )const = default;
170 };
171 const VolumeRenderingParams& getVolumeRenderingParams() const { return volumeRenderingParams_; }
173
174 MRMESH_API virtual bool hasVisualRepresentation() const override;
175
177 MRMESH_API void setMaxSurfaceVertices( int maxVerts );
179 int getMaxSurfaceVertices() const { return maxSurfaceVertices_; }
180
181 MRMESH_API virtual std::shared_ptr<Object> clone() const override;
182 MRMESH_API virtual std::shared_ptr<Object> shallowClone() const override;
183
184 MRMESH_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true ) override;
185
187 [[nodiscard]] MRMESH_API size_t activeVoxels() const;
188
191
193 [[nodiscard]] MRMESH_API virtual size_t heapBytes() const override;
194
196 [[nodiscard]] const char * serializeFormat() const { return serializeFormat_; }
197
199 MRMESH_API void setSerializeFormat( const char * newFormat );
200
204
205private:
206 VolumeRenderingParams volumeRenderingParams_;
207 mutable UniquePtr<SimpleVolume> volumeRenderingData_;
208
209 int maxSurfaceVertices_{ 5'000'000 };
210 VdbVolume vdbVolume_;
211 float isoValue_{0.0f};
212 bool dualMarchingCubes_{true};
213 VoxelPointPositioner positioner_ = {};
214 Histogram histogram_;
215 mutable std::optional<Box3i> activeBounds_;
216 mutable std::optional<size_t> activeVoxels_;
217
218 const char * serializeFormat_ = ".raw";
219
221 VolumeIndexer indexer_ = VolumeIndexer( vdbVolume_.dims );
222 Vector3f reverseVoxelSize_;
223
224 void updateHistogram_( float min, float max, ProgressCallback cb = {} );
225
226
228 void setDefaultColors_();
229
231 void setDefaultSceneProperties_();
232
233protected:
234 VoxelBitSet selectedVoxels_;
236
237 ObjectVoxels( const ObjectVoxels& other ) = default;
238 bool volumeRendering_{ false };
239
241 MRMESH_API virtual void swapBase_( Object& other ) override;
244 MRMESH_API virtual void swapSignals_( Object& other ) override;
245
246 MRMESH_API virtual void serializeFields_( Json::Value& root ) const override;
247
248 MRMESH_API void deserializeFields_( const Json::Value& root ) override;
249
250 MRMESH_API VoidOrErrStr deserializeModel_( const std::filesystem::path& path, ProgressCallback progressCb = {} ) override;
251
252 MRMESH_API virtual Expected<std::future<VoidOrErrStr>> serializeModel_( const std::filesystem::path& path ) const override;
253};
254
255
256}
257#endif
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:46
#define MRMESH_CLASS
Definition MRMesh/MRMeshFwd.h:50
Definition MRHistogram.h:10
Definition MRObjectMeshHolder.h:30
Definition MRObjectVoxels.h:17
virtual MRMESH_API std::shared_ptr< Object > clone() const override
virtual MRMESH_API void applyScale(float scaleFactor) override
scale object size (all point positions)
const Vector3i & dimensions() const
Returns dimensions of voxel objects.
Definition MRObjectVoxels.h:42
VdbVolume & varVdbVolume()
Definition MRObjectVoxels.h:34
MRMESH_API const Box3i & getActiveBounds() const
MRMESH_API void updateHistogramAndSurface(ProgressCallback cb={})
std::unique_ptr< SimpleVolume > getVolumeRenderingData() const
Definition MRObjectVoxels.h:134
const Vector3f & voxelSize() const
Definition MRObjectVoxels.h:51
MRMESH_API void construct(const SimpleVolume &simpleVolume, ProgressCallback cb={})
Clears all internal data and then creates grid and calculates histogram (surface is not built,...
virtual MRMESH_API Expected< bool > setIsoValue(float iso, ProgressCallback cb={}, bool updateSurface=true)
const VoxelBitSet & getVolumeRenderActiveVoxels() const
get active (visible) voxels
Definition MRObjectVoxels.h:110
virtual MRMESH_API void serializeFields_(Json::Value &root) const override
const char * serializeFormat() const
returns file extension used to serialize the voxels
Definition MRObjectVoxels.h:196
bool isVolumeRenderingEnabled() const
Definition MRObjectVoxels.h:128
const VolumeRenderingParams & getVolumeRenderingParams() const
Definition MRObjectVoxels.h:171
virtual MRMESH_API std::shared_ptr< Object > shallowClone() const override
const VoxelBitSet & getSelectedVoxels() const
Definition MRObjectVoxels.h:106
virtual MRMESH_API void setDirtyFlags(uint32_t mask, bool invalidateCaches=true) override
bool getDualMarchingCubes() const
returns true if the iso-surface is built using Dual Marching Cubes algorithm or false if using Standa...
Definition MRObjectVoxels.h:88
float getIsoValue() const
Returns current iso value.
Definition MRObjectVoxels.h:45
const std::shared_ptr< Mesh > & surface() const
Returns iso surface, empty if iso value is not set.
Definition MRObjectVoxels.h:30
virtual MRMESH_API size_t heapBytes() const override
returns the amount of memory this object occupies on heap
MRMESH_API Histogram updateHistogram(Histogram histogram)
IsoSurfaceChangedSignal isoSurfaceChangedSignal
Definition MRObjectVoxels.h:203
MRMESH_API Vector3i getCoordinateByVoxelId(VoxelId id) const
MRMESH_API Expected< std::shared_ptr< Mesh > > recalculateIsoSurface(const VdbVolume &volume, float iso, ProgressCallback cb={}) const
Same as above, but takes external volume.
const VdbVolume & vdbVolume() const
Return VdbVolume.
Definition MRObjectVoxels.h:33
void selectVoxels(const VoxelBitSet &selectedVoxels)
Definition MRObjectVoxels.h:107
MRMESH_API void setSerializeFormat(const char *newFormat)
sets file extension used to serialize the voxels: must be not null and must start from '....
const FloatGrid & grid() const
Returns Float grid which contains voxels data, see more on openvdb::FloatGrid.
Definition MRObjectVoxels.h:37
VoxelBitSet volumeRenderActiveVoxels_
Definition MRObjectVoxels.h:235
virtual MRMESH_API Expected< std::future< VoidOrErrStr > > serializeModel_(const std::filesystem::path &path) const override
MRMESH_API size_t activeVoxels() const
returns cached information about the number of active voxels
MRMESH_API void construct(const FloatGrid &grid, const Vector3f &voxelSize, ProgressCallback cb={})
Clears all internal data and calculates histogram.
MRMESH_API VoxelId getVoxelIdByPoint(const Vector3f &point) const
virtual std::string getClassName() const override
return human readable name of subclass
Definition MRObjectVoxels.h:55
const VolumeIndexer & getVolumeIndexer() const
Returns indexer with more options.
Definition MRObjectVoxels.h:122
MRMESH_API void deserializeFields_(const Json::Value &root) override
virtual MRMESH_API bool hasVisualRepresentation() const override
mesh object can be seen if the mesh has at least one edge
virtual MRMESH_API void setActiveBounds(const Box3i &activeBox, ProgressCallback cb={}, bool updateSurface=true)
virtual MRMESH_API void swapSignals_(Object &other) override
MRMESH_API void enableVolumeRendering(bool on)
MRMESH_API void construct(const VdbVolume &vdbVolume, ProgressCallback cb={})
Clears all internal data and calculates histogram.
MRMESH_API Histogram recalculateHistogram(std::optional< Vector2f > minmax, ProgressCallback cb={}) const
Calculates and returns new histogram.
MRMESH_API bool prepareDataForVolumeRendering(ProgressCallback cb={}) const
int getMaxSurfaceVertices() const
gets top limit on the number of vertices in the iso-surface
Definition MRObjectVoxels.h:179
MRMESH_API VdbVolume updateVdbVolume(VdbVolume vdbVolume)
MRMESH_API VoidOrErrStr deserializeModel_(const std::filesystem::path &path, ProgressCallback progressCb={}) override
Reads model from file.
MRMESH_API std::shared_ptr< Mesh > updateIsoSurface(std::shared_ptr< Mesh > mesh)
virtual MRMESH_API void setDualMarchingCubes(bool on, bool updateSurface=true, ProgressCallback cb={})
virtual MRMESH_API void invalidateActiveBoundsCaches()
Call this function in main thread post processing if you call setActiveBounds from progress bar threa...
ObjectVoxels(ProtectedStruct, const ObjectVoxels &obj)
Definition MRObjectVoxels.h:190
MRMESH_API ObjectVoxels()
MRMESH_API Expected< std::shared_ptr< Mesh > > recalculateIsoSurface(float iso, ProgressCallback cb={}) const
Calculates and return new mesh or error message.
MRMESH_API void setVolumeRenderingParams(const VolumeRenderingParams &params)
MRMESH_API VoxelId getVoxelIdByCoordinate(const Vector3i &coord) const
virtual MRMESH_API std::vector< std::string > getInfoLines() const override
return several info lines that can better describe the object in the UI
MRMESH_API void setMaxSurfaceVertices(int maxVerts)
sets top limit on the number of vertices in the iso-surface
VoxelBitSet selectedVoxels_
Definition MRObjectVoxels.h:234
virtual MRMESH_API void swapBase_(Object &other) override
swaps this object with other
MRMESH_API void setVolumeRenderActiveVoxels(const VoxelBitSet &activeVoxels)
set active (visible) voxels (using only in Volume Rendering mode)
virtual const char * typeName() const override
Definition MRObjectVoxels.h:25
virtual void setVoxelPointPositioner(VoxelPointPositioner positioner)
set voxel point positioner for Marching Cubes (only for Standard Marching Cubes)
Definition MRObjectVoxels.h:93
ObjectVoxels(const ObjectVoxels &other)=default
const Histogram & histogram() const
Returns histogram.
Definition MRObjectVoxels.h:48
virtual bool hasModel() const override
Definition MRObjectVoxels.h:39
named object in the data model
Definition MRObject.h:60
Definition MRVolumeIndexer.h:65
represents a 3-dimentional float-typed vector
Definition MRDotNet/MRVector3.h:8
std::function< bool(float)> ProgressCallback
Definition MRMesh/MRMeshFwd.h:589
@ None
special value not to limit path in one slice
Definition MRVoxelPath.h:33
Definition MRCameraOrientationPlugin.h:7
std::shared_ptr< OpenVdbFloatGrid > FloatGrid
Definition MRMesh/MRMeshFwd.h:537
FilterType
Definition MRMesh/MRMeshFwd.h:592
tl::expected< T, E > Expected
Definition MRExpected.h:49
std::function< Vector3f(const Vector3f &, const Vector3f &, float, float, float)> VoxelPointPositioner
Definition MRMarchingCubes.h:16
Expected< void > VoidOrErrStr
return type for a void function that can produce an error string
Definition MRExpected.h:60
Definition MRColor.h:9
Definition MRObjectVoxels.h:138
ShadingType
Definition MRObjectVoxels.h:143
bool operator==(const VolumeRenderingParams &) const =default
LutType
Definition MRObjectVoxels.h:150
AlphaType
Definition MRObjectVoxels.h:163
Definition MRObject.h:246
Definition MRUniquePtr.h:12