MeshLib
 
Loading...
Searching...
No Matches
MRObjectVoxels.h
Go to the documentation of this file.
1#pragma once
2#include "MRVoxelsFwd.h"
3
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 MRVOXELS_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 MRVOXELS_API virtual std::vector<std::string> getInfoLines() const override;
55 virtual std::string getClassName() const override { return "Voxels"; }
56
60 MRVOXELS_API void construct( const SimpleVolume& simpleVolume, const std::optional<Vector2f> & minmax = {}, ProgressCallback cb = {}, bool normalPlusGrad = false );
61
64 MRVOXELS_API void construct( const SimpleVolumeMinMax& simpleVolumeMinMax, ProgressCallback cb = {}, bool normalPlusGrad = false );
65
68 MRVOXELS_API void construct( const FloatGrid& grid, const Vector3f& voxelSize, const std::optional<Vector2f> & minmax = {} );
69
71 MRVOXELS_API void construct( const VdbVolume& vdbVolume );
72
76
79 MRVOXELS_API virtual Expected<bool> setIsoValue( float iso, ProgressCallback cb = {}, bool updateSurface = true );
80
83 MRVOXELS_API std::shared_ptr<Mesh> updateIsoSurface( std::shared_ptr<Mesh> mesh );
86 MRVOXELS_API VdbVolume updateVdbVolume( VdbVolume vdbVolume );
90
94 MRVOXELS_API Expected<std::shared_ptr<Mesh>> recalculateIsoSurface( const VdbVolume& volume, float iso, ProgressCallback cb = {} ) const;
96 MRVOXELS_API Histogram recalculateHistogram( std::optional<Vector2f> minmax, ProgressCallback cb = {} ) const;
98 bool getDualMarchingCubes() const { return dualMarchingCubes_; }
101 MRVOXELS_API virtual void setDualMarchingCubes( bool on, bool updateSurface = true, ProgressCallback cb = {} );
103 virtual void setVoxelPointPositioner( VoxelPointPositioner positioner ) { positioner_ = positioner; }
104
105
109 MRVOXELS_API virtual void setActiveBounds( const Box3i& activeBox, ProgressCallback cb = {}, bool updateSurface = true );
112 MRVOXELS_API const Box3i& getActiveBounds() const;
115
116 const VoxelBitSet& getSelectedVoxels() const { return selectedVoxels_; }
117 void selectVoxels( const VoxelBitSet& selectedVoxels ) { selectedVoxels_ = selectedVoxels; }
118
120 const VoxelBitSet& getVolumeRenderActiveVoxels() const { return volumeRenderActiveVoxels_; }
122 MRVOXELS_API void setVolumeRenderActiveVoxels( const VoxelBitSet& activeVoxels );
123
127 MRVOXELS_API VoxelId getVoxelIdByCoordinate( const Vector3i& coord ) const;
128 MRVOXELS_API VoxelId getVoxelIdByPoint( const Vector3f& point ) const;
130
132 const VolumeIndexer& getVolumeIndexer() const { return indexer_; }
133
134 // prepare data for volume rendering
135 // returns false if canceled or voxel data is empty
137
138 bool isVolumeRenderingEnabled() const { return volumeRendering_; }
139 // this function should only be called from GUI thread because it changes rendering object,
140 // it can take some time to prepare data, so you can prepare data with progress callback
141 // by calling `prepareDataForVolumeRendering(cb)` function before calling this one
143 // move volume rendering data to caller: basically used in RenderVolumeObject
144 [[nodiscard]] std::unique_ptr<SimpleVolume> getVolumeRenderingData() const { return std::move( volumeRenderingData_ ); }
145
146 // struct to control volume rendering texture
148 {
149 // volume texture smoothing
150 FilterType volumeFilterType{ FilterType::Linear };
151 // shading model
152 enum class ShadingType
153 {
154 None,
155 ValueGradient,
156 AlphaGradient
157 } shadingType{ ShadingType::None };
158 // coloring type
159 enum class LutType
160 {
161 GrayShades,
162 Rainbow,
163 OneColor
164 } lutType{ LutType::Rainbow };
165 // color that is used for OneColor mode
166 Color oneColor{ Color::white() };
167 // minimum colored value (voxels with lower values are transparent)
168 float min{ 0.0f };
169 // maximum colored value (voxels with higher values are transparent)
170 float max{ 0.0f };
171 // type of alpha function on texture
172 enum class AlphaType
173 {
174 Constant,
175 LinearIncreasing,
176 LinearDecreasing
177 } alphaType{ AlphaType::Constant };
178 uint8_t alphaLimit{ 10 };
179 bool operator==( const VolumeRenderingParams& )const = default;
180 };
181 const VolumeRenderingParams& getVolumeRenderingParams() const { return volumeRenderingParams_; }
183
184 MRVOXELS_API virtual bool hasVisualRepresentation() const override;
185
189 int getMaxSurfaceVertices() const { return maxSurfaceVertices_; }
190
191 MRVOXELS_API virtual std::shared_ptr<Object> clone() const override;
192 MRVOXELS_API virtual std::shared_ptr<Object> shallowClone() const override;
193
194 MRVOXELS_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true ) override;
195
197 [[nodiscard]] MRVOXELS_API size_t activeVoxels() const;
198
201
203 [[nodiscard]] MRVOXELS_API virtual size_t heapBytes() const override;
204
206 [[nodiscard]] const char * serializeFormat() const { return serializeFormat_; }
207
209 MRVOXELS_API void setSerializeFormat( const char * newFormat );
210
214
215private:
216 VolumeRenderingParams volumeRenderingParams_;
217 mutable UniquePtr<SimpleVolume> volumeRenderingData_;
218
219 int maxSurfaceVertices_{ 5'000'000 };
220 VdbVolume vdbVolume_;
221 float isoValue_{0.0f};
222 bool dualMarchingCubes_{true};
223 VoxelPointPositioner positioner_ = {};
224 Histogram histogram_;
225 mutable std::optional<Box3i> activeBounds_;
226 mutable std::optional<size_t> activeVoxels_;
227
228 const char * serializeFormat_ = ".raw";
229
231 VolumeIndexer indexer_ = VolumeIndexer( vdbVolume_.dims );
232 Vector3f reverseVoxelSize_;
233
234 void updateHistogram_( float min, float max, ProgressCallback cb = {} );
235
236
238 void setDefaultColors_();
239
241 void setDefaultSceneProperties_();
242
243protected:
244 VoxelBitSet selectedVoxels_;
246
247 ObjectVoxels( const ObjectVoxels& other ) = default;
248 bool volumeRendering_{ false };
249
251 MRVOXELS_API virtual void swapBase_( Object& other ) override;
254 MRVOXELS_API virtual void swapSignals_( Object& other ) override;
255
256 MRVOXELS_API virtual void serializeFields_( Json::Value& root ) const override;
257
258 MRVOXELS_API void deserializeFields_( const Json::Value& root ) override;
259
260 MRVOXELS_API Expected<void> deserializeModel_( const std::filesystem::path& path, ProgressCallback progressCb = {} ) override;
261
262 MRVOXELS_API virtual Expected<std::future<Expected<void>>> serializeModel_( const std::filesystem::path& path ) const override;
263};
264
265
266}
#define MRVOXELS_API
Definition MRVoxelsFwd.h:13
#define MRVOXELS_CLASS
Definition MRVoxelsFwd.h:14
Definition MRHistogram.h:10
Definition MRObjectMeshHolder.h:30
Definition MRObjectVoxels.h:17
virtual MRVOXELS_API Expected< std::future< Expected< void > > > serializeModel_(const std::filesystem::path &path) const override
virtual MRVOXELS_API void setDualMarchingCubes(bool on, bool updateSurface=true, ProgressCallback cb={})
MRVOXELS_API Expected< std::shared_ptr< Mesh > > recalculateIsoSurface(float iso, ProgressCallback cb={}) const
Calculates and return new mesh or error message.
const Vector3i & dimensions() const
Returns dimensions of voxel objects.
Definition MRObjectVoxels.h:42
VdbVolume & varVdbVolume()
Definition MRObjectVoxels.h:34
std::unique_ptr< SimpleVolume > getVolumeRenderingData() const
Definition MRObjectVoxels.h:144
const Vector3f & voxelSize() const
Definition MRObjectVoxels.h:51
MRVOXELS_API std::shared_ptr< Mesh > updateIsoSurface(std::shared_ptr< Mesh > mesh)
const VoxelBitSet & getVolumeRenderActiveVoxels() const
get active (visible) voxels
Definition MRObjectVoxels.h:120
MRVOXELS_API Vector3i getCoordinateByVoxelId(VoxelId id) const
const char * serializeFormat() const
returns file extension used to serialize the voxels
Definition MRObjectVoxels.h:206
bool isVolumeRenderingEnabled() const
Definition MRObjectVoxels.h:138
const VolumeRenderingParams & getVolumeRenderingParams() const
Definition MRObjectVoxels.h:181
virtual MRVOXELS_API std::shared_ptr< Object > clone() const override
const VoxelBitSet & getSelectedVoxels() const
Definition MRObjectVoxels.h:116
bool getDualMarchingCubes() const
returns true if the iso-surface is built using Dual Marching Cubes algorithm or false if using Standa...
Definition MRObjectVoxels.h:98
virtual MRVOXELS_API void invalidateActiveBoundsCaches()
Call this function in main thread post processing if you call setActiveBounds from progress bar threa...
float getIsoValue() const
Returns current iso value.
Definition MRObjectVoxels.h:45
MRVOXELS_API void deserializeFields_(const Json::Value &root) override
const std::shared_ptr< Mesh > & surface() const
Returns iso surface, empty if iso value is not set.
Definition MRObjectVoxels.h:30
MRVOXELS_API Histogram updateHistogram(Histogram histogram)
IsoSurfaceChangedSignal isoSurfaceChangedSignal
Definition MRObjectVoxels.h:213
virtual MRVOXELS_API void setDirtyFlags(uint32_t mask, bool invalidateCaches=true) override
const VdbVolume & vdbVolume() const
Return VdbVolume.
Definition MRObjectVoxels.h:33
void selectVoxels(const VoxelBitSet &selectedVoxels)
Definition MRObjectVoxels.h:117
MRVOXELS_API Expected< std::shared_ptr< Mesh > > recalculateIsoSurface(const VdbVolume &volume, float iso, ProgressCallback cb={}) const
Same as above, but takes external volume.
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:245
MRVOXELS_API void construct(const FloatGrid &grid, const Vector3f &voxelSize, const std::optional< Vector2f > &minmax={})
MRVOXELS_API void setVolumeRenderingParams(const VolumeRenderingParams &params)
MRVOXELS_API VoxelId getVoxelIdByCoordinate(const Vector3i &coord) const
MRVOXELS_API void construct(const VdbVolume &vdbVolume)
Clears all internal data and then creates grid and calculates histogram (surface is not built,...
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:132
MRVOXELS_API void setVolumeRenderActiveVoxels(const VoxelBitSet &activeVoxels)
set active (visible) voxels (using only in Volume Rendering mode)
MRVOXELS_API void updateHistogramAndSurface(ProgressCallback cb={})
MRVOXELS_API ObjectVoxels()
MRVOXELS_API void enableVolumeRendering(bool on)
virtual MRVOXELS_API void serializeFields_(Json::Value &root) const override
MRVOXELS_API void construct(const SimpleVolume &simpleVolume, const std::optional< Vector2f > &minmax={}, ProgressCallback cb={}, bool normalPlusGrad=false)
MRVOXELS_API VdbVolume updateVdbVolume(VdbVolume vdbVolume)
virtual MRVOXELS_API Expected< bool > setIsoValue(float iso, ProgressCallback cb={}, bool updateSurface=true)
int getMaxSurfaceVertices() const
gets top limit on the number of vertices in the iso-surface
Definition MRObjectVoxels.h:189
MRVOXELS_API bool prepareDataForVolumeRendering(ProgressCallback cb={}) const
virtual MRVOXELS_API void setActiveBounds(const Box3i &activeBox, ProgressCallback cb={}, bool updateSurface=true)
MRVOXELS_API const Box3i & getActiveBounds() const
ObjectVoxels(ProtectedStruct, const ObjectVoxels &obj)
Definition MRObjectVoxels.h:200
virtual MRVOXELS_API void swapBase_(Object &other) override
swaps this object with other
VoxelBitSet selectedVoxels_
Definition MRObjectVoxels.h:244
MRVOXELS_API void setMaxSurfaceVertices(int maxVerts)
sets top limit on the number of vertices in the iso-surface
virtual MRVOXELS_API void swapSignals_(Object &other) override
virtual const char * typeName() const override
Definition MRObjectVoxels.h:25
MRVOXELS_API size_t activeVoxels() const
returns cached information about the number of active voxels
virtual MRVOXELS_API size_t heapBytes() const override
returns the amount of memory this object occupies on heap
virtual MRVOXELS_API bool hasVisualRepresentation() const override
mesh object can be seen if the mesh has at least one edge
virtual MRVOXELS_API std::vector< std::string > getInfoLines() const override
return several info lines that can better describe the object in the UI
virtual void setVoxelPointPositioner(VoxelPointPositioner positioner)
set voxel point positioner for Marching Cubes (only for Standard Marching Cubes)
Definition MRObjectVoxels.h:103
MRVOXELS_API VoxelId getVoxelIdByPoint(const Vector3f &point) const
ObjectVoxels(const ObjectVoxels &other)=default
MRVOXELS_API Expected< void > deserializeModel_(const std::filesystem::path &path, ProgressCallback progressCb={}) override
Reads model from file.
const Histogram & histogram() const
Returns histogram.
Definition MRObjectVoxels.h:48
MRVOXELS_API Histogram recalculateHistogram(std::optional< Vector2f > minmax, ProgressCallback cb={}) const
Calculates and returns new histogram.
MRVOXELS_API void setSerializeFormat(const char *newFormat)
sets file extension used to serialize the voxels: must be not null and must start from '....
virtual MRVOXELS_API std::shared_ptr< Object > shallowClone() const override
virtual MRVOXELS_API void applyScale(float scaleFactor) override
scale object size (all point positions)
virtual bool hasModel() const override
Definition MRObjectVoxels.h:39
MRVOXELS_API void construct(const SimpleVolumeMinMax &simpleVolumeMinMax, ProgressCallback cb={}, bool normalPlusGrad=false)
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:571
@ None
special value not to limit path in one slice
Definition MRVoxelPath.h:33
Definition MRCameraOrientationPlugin.h:8
std::shared_ptr< OpenVdbFloatGrid > FloatGrid
Definition MRVoxelsFwd.h:25
FilterType
Definition MRMesh/MRMeshFwd.h:574
tl::expected< T, E > Expected
Definition MRExpected.h:58
std::function< Vector3f(const Vector3f &, const Vector3f &, float, float, float)> VoxelPointPositioner
Definition MRMarchingCubes.h:16
Definition MRColor.h:9
Definition MRObjectVoxels.h:148
ShadingType
Definition MRObjectVoxels.h:153
bool operator==(const VolumeRenderingParams &) const =default
LutType
Definition MRObjectVoxels.h:160
AlphaType
Definition MRObjectVoxels.h:173
Definition MRObject.h:246
Definition MRUniquePtr.h:12