MeshLib C++ Docs
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{
15
16
19class MRVOXELS_CLASS ObjectVoxels : public ObjectMeshHolder
20{
21public:
22 MRVOXELS_API ObjectVoxels();
23 ObjectVoxels& operator = ( ObjectVoxels&& ) noexcept = default;
24 ObjectVoxels( ObjectVoxels&& ) noexcept = default;
25 virtual ~ObjectVoxels() = default;
26
27 constexpr static const char* StaticTypeName() noexcept { return "ObjectVoxels"; }
28 virtual const char* typeName() const override { return StaticTypeName(); }
29
30 constexpr static const char* StaticClassName() noexcept { return "Voxel Volume"; }
31 virtual std::string className() const override { return StaticClassName(); }
32
33 constexpr static const char* StaticClassNameInPlural() noexcept { return "Voxel Volumes"; }
34 virtual std::string classNameInPlural() const override { return StaticClassNameInPlural(); }
35
36 MRVOXELS_API virtual void applyScale( float scaleFactor ) override;
37
39 const std::shared_ptr<Mesh>& surface() const { return data_.mesh; }
40
42 const VdbVolume& vdbVolume() const { return vdbVolume_; };
43 VdbVolume& varVdbVolume() { return vdbVolume_; }
44
46 const FloatGrid& grid() const { return vdbVolume_.data; }
47
48 [[nodiscard]] virtual bool hasModel() const override { return bool( vdbVolume_.data ); }
49
51 const Vector3i& dimensions() const
52 { return vdbVolume_.dims; }
54 float getIsoValue() const
55 { return isoValue_; }
57 const Histogram& histogram() const
58 { return histogram_; }
59
60 const Vector3f& voxelSize() const
61 { return vdbVolume_.voxelSize; }
62
63 MRVOXELS_API virtual std::vector<std::string> getInfoLines() const override;
64
69 MRVOXELS_API void construct( const SimpleVolume& simpleVolume, const std::optional<Vector2f> & minmax = {}, ProgressCallback cb = {}, bool normalPlusGrad = false );
70
74 MRVOXELS_API void construct( const SimpleVolumeMinMax& simpleVolumeMinMax, ProgressCallback cb = {}, bool normalPlusGrad = false );
75
78 MRVOXELS_API void construct( const FloatGrid& grid, const Vector3f& voxelSize, const std::optional<Vector2f> & minmax = {} );
79
81 MRVOXELS_API void construct( const VdbVolume& vdbVolume );
82
85 MRVOXELS_API void updateHistogramAndSurface( ProgressCallback cb = {} );
86
89 MRVOXELS_API virtual Expected<bool> setIsoValue( float iso, ProgressCallback cb = {}, bool updateSurface = true );
90
93 MRVOXELS_API std::shared_ptr<Mesh> updateIsoSurface( std::shared_ptr<Mesh> mesh );
96 MRVOXELS_API VdbVolume updateVdbVolume( VdbVolume vdbVolume );
99 MRVOXELS_API Histogram updateHistogram( Histogram histogram );
100
102 MRVOXELS_API Expected<std::shared_ptr<Mesh>> recalculateIsoSurface( float iso, ProgressCallback cb = {} ) const;
104 MRVOXELS_API Expected<std::shared_ptr<Mesh>> recalculateIsoSurface( const VdbVolume& volume, float iso, ProgressCallback cb = {} ) const;
106 MRVOXELS_API Histogram recalculateHistogram( std::optional<Vector2f> minmax, ProgressCallback cb = {} ) const;
108 bool getDualMarchingCubes() const { return dualMarchingCubes_; }
111 MRVOXELS_API virtual void setDualMarchingCubes( bool on, bool updateSurface = true, ProgressCallback cb = {} );
113 virtual void setVoxelPointPositioner( VoxelPointPositioner positioner ) { positioner_ = positioner; }
114
115
119 MRVOXELS_API virtual void setActiveBounds( const Box3i& activeBox, ProgressCallback cb = {}, bool updateSurface = true );
122 MRVOXELS_API const Box3i& getActiveBounds() const;
124 MRVOXELS_API virtual void invalidateActiveBoundsCaches();
125
126 const VoxelBitSet& getSelectedVoxels() const { return selectedVoxels_; }
127 void selectVoxels( const VoxelBitSet& selectedVoxels ) { selectedVoxels_ = selectedVoxels; }
128
130 const VoxelBitSet& getVolumeRenderActiveVoxels() const { return volumeRenderActiveVoxels_; }
132 MRVOXELS_API void setVolumeRenderActiveVoxels( const VoxelBitSet& activeVoxels );
133
137 MRVOXELS_API VoxelId getVoxelIdByCoordinate( const Vector3i& coord ) const;
138 MRVOXELS_API VoxelId getVoxelIdByPoint( const Vector3f& point ) const;
139 MRVOXELS_API Vector3i getCoordinateByVoxelId( VoxelId id ) const;
140
142 const VolumeIndexer& getVolumeIndexer() const { return indexer_; }
143
146 MRVOXELS_API bool prepareDataForVolumeRendering( ProgressCallback cb = {} ) const;
147
148 bool isVolumeRenderingEnabled() const { return volumeRendering_; }
152 MRVOXELS_API void enableVolumeRendering( bool on );
154 [[nodiscard]] std::unique_ptr<SimpleVolume> getVolumeRenderingData() const { return std::move( volumeRenderingData_ ); }
155
158 {
160 FilterType volumeFilterType{ FilterType::Linear };
162 enum class ShadingType
163 {
164 None,
165 ValueGradient,
166 AlphaGradient
167 } shadingType{ ShadingType::None };
169 enum class LutType
170 {
171 GrayShades,
172 Rainbow,
173 OneColor
174 } lutType{ LutType::Rainbow };
176 Color oneColor{ Color::white() };
178 float min{ 0.0f };
180 float max{ 0.0f };
183 float samplingStep{ -1.0f };
185 enum class AlphaType
186 {
187 Constant,
188 LinearIncreasing,
189 LinearDecreasing
190 } alphaType{ AlphaType::Constant };
191 uint8_t alphaLimit{ 10 };
192 bool operator==( const VolumeRenderingParams& )const = default;
193 };
194 const VolumeRenderingParams& getVolumeRenderingParams() const { return volumeRenderingParams_; }
195 MRVOXELS_API void setVolumeRenderingParams( const VolumeRenderingParams& params );
196
197 MRVOXELS_API virtual bool hasVisualRepresentation() const override;
198
200 MRVOXELS_API void setMaxSurfaceVertices( int maxVerts );
202 int getMaxSurfaceVertices() const { return maxSurfaceVertices_; }
203
204 MRVOXELS_API virtual std::shared_ptr<Object> clone() const override;
205 MRVOXELS_API virtual std::shared_ptr<Object> shallowClone() const override;
206
207 MRVOXELS_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true ) override;
208
210 [[nodiscard]] MRVOXELS_API size_t activeVoxels() const;
211
214
216 [[nodiscard]] MRVOXELS_API virtual size_t heapBytes() const override;
217
219 [[nodiscard]] const char * serializeFormat() const { return serializeFormat_; }
220
223 MRVOXELS_API void setSerializeFormat( const char * newFormat );
224
226 MRVOXELS_API void resetFrontColor() override;
227
231
235
236private:
237 VolumeRenderingParams volumeRenderingParams_;
238 mutable UniquePtr<SimpleVolume> volumeRenderingData_;
239
240 int maxSurfaceVertices_{ 5'000'000 };
241 VdbVolume vdbVolume_;
242 float isoValue_{0.0f};
243 bool dualMarchingCubes_{true};
244 VoxelPointPositioner positioner_ = {};
245 Histogram histogram_;
246 mutable std::optional<Box3i> activeBounds_;
247 mutable std::optional<size_t> activeVoxels_;
248
249 const char * serializeFormat_ = nullptr;
250
252 VolumeIndexer indexer_ = VolumeIndexer( vdbVolume_.dims );
253 Vector3f reverseVoxelSize_;
254
255 void updateHistogram_( float min, float max, ProgressCallback cb = {} );
256
257
259 void setDefaultColors_();
260
262 void setDefaultSceneProperties_();
263
264protected:
265 VoxelBitSet selectedVoxels_;
267
268 ObjectVoxels( const ObjectVoxels& other ) = default;
269 bool volumeRendering_{ false };
270
272 MRVOXELS_API virtual void swapBase_( Object& other ) override;
275 MRVOXELS_API virtual void swapSignals_( Object& other ) override;
276
277 MRVOXELS_API virtual void serializeFields_( Json::Value& root ) const override;
278
279 MRVOXELS_API void deserializeFields_( const Json::Value& root ) override;
280
281 MRVOXELS_API Expected<void> deserializeModel_( const std::filesystem::path& path, ProgressCallback progressCb = {} ) override;
282
283 MRVOXELS_API virtual Expected<std::future<Expected<void>>> serializeModel_( const std::filesystem::path& path ) const override;
284};
285
288[[nodiscard]] MRVOXELS_API const std::string & defaultSerializeVoxelsFormat();
289
292MRVOXELS_API void setDefaultSerializeVoxelsFormat( std::string newFormat );
293
294}
wrapper class that helps mrbind to avoid excess MRVDBFloatGrid.h includes
Definition MRFloatGrid.h:21
Definition MRHistogram.h:13
Definition MRObjectMeshHolder.h:35
Definition MRObjectVoxels.h:20
named object in the data model
Definition MRObject.h:62
Definition MRVolumeIndexer.h:65
virtual MRVOXELS_API Expected< std::future< Expected< void > > > serializeModel_(const std::filesystem::path &path) const override
virtual std::string classNameInPlural() const override
Definition MRObjectVoxels.h:34
virtual MRVOXELS_API void setDualMarchingCubes(bool on, bool updateSurface=true, ProgressCallback cb={})
ShadingType
shading model
Definition MRObjectVoxels.h:163
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:51
VdbVolume & varVdbVolume()
Definition MRObjectVoxels.h:43
std::unique_ptr< SimpleVolume > getVolumeRenderingData() const
move volume rendering data to caller: basically used in RenderVolumeObject
Definition MRObjectVoxels.h:154
const Vector3f & voxelSize() const
Definition MRObjectVoxels.h:60
MRVOXELS_API std::shared_ptr< Mesh > updateIsoSurface(std::shared_ptr< Mesh > mesh)
const VoxelBitSet & getVolumeRenderActiveVoxels() const
get active (visible) voxels
Definition MRObjectVoxels.h:130
MRVOXELS_API Vector3i getCoordinateByVoxelId(VoxelId id) const
const char * serializeFormat() const
returns overriden file extension used to serialize voxels inside this object, nullptr means defaultSe...
Definition MRObjectVoxels.h:219
bool isVolumeRenderingEnabled() const
Definition MRObjectVoxels.h:148
const VolumeRenderingParams & getVolumeRenderingParams() const
Definition MRObjectVoxels.h:194
virtual MRVOXELS_API std::shared_ptr< Object > clone() const override
const VoxelBitSet & getSelectedVoxels() const
Definition MRObjectVoxels.h:126
bool getDualMarchingCubes() const
returns true if the iso-surface is built using Dual Marching Cubes algorithm or false if using Standa...
Definition MRObjectVoxels.h:108
virtual MRVOXELS_API void invalidateActiveBoundsCaches()
Call this function in main thread post processing if you call setActiveBounds from progress bar threa...
static constexpr const char * StaticClassNameInPlural() noexcept
Definition MRObjectVoxels.h:33
float getIsoValue() const
Returns current iso value.
Definition MRObjectVoxels.h:54
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:39
MRVOXELS_API Histogram updateHistogram(Histogram histogram)
IsoSurfaceChangedSignal isoSurfaceChangedSignal
Definition MRObjectVoxels.h:230
virtual MRVOXELS_API void setDirtyFlags(uint32_t mask, bool invalidateCaches=true) override
const VdbVolume & vdbVolume() const
Return VdbVolume.
Definition MRObjectVoxels.h:42
void selectVoxels(const VoxelBitSet &selectedVoxels)
Definition MRObjectVoxels.h:127
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:46
VoxelBitSet volumeRenderActiveVoxels_
Definition MRObjectVoxels.h:266
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,...
const VolumeIndexer & getVolumeIndexer() const
Returns indexer with more options.
Definition MRObjectVoxels.h:142
FilterType
Definition MREnums.h:12
MRVOXELS_API void setVolumeRenderActiveVoxels(const VoxelBitSet &activeVoxels)
set active (visible) voxels (using only in Volume Rendering mode)
tl::expected< T, E > Expected
Definition MRExpected.h:31
MRVOXELS_API void updateHistogramAndSurface(ProgressCallback cb={})
MRVOXELS_API ObjectVoxels()
MRVOXELS_API void enableVolumeRendering(bool on)
static constexpr const char * StaticClassName() noexcept
Definition MRObjectVoxels.h:30
virtual MRVOXELS_API void serializeFields_(Json::Value &root) const override
MRVOXELS_API void resetFrontColor() override
reset basic object colors to their default values from the current theme
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:202
virtual std::string className() const override
Definition MRObjectVoxels.h:31
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
MRVOXELS_API const std::string & defaultSerializeVoxelsFormat()
bool operator==(const VolumeRenderingParams &) const =default
ObjectVoxels(ProtectedStruct, const ObjectVoxels &obj)
Definition MRObjectVoxels.h:213
virtual MRVOXELS_API void swapBase_(Object &other) override
swaps this object with other
LutType
coloring type
Definition MRObjectVoxels.h:170
VoxelBitSet selectedVoxels_
Definition MRObjectVoxels.h:265
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
MRVOXELS_API void setDefaultSerializeVoxelsFormat(std::string newFormat)
virtual const char * typeName() const override
Definition MRObjectVoxels.h:28
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:113
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:57
std::function< Vector3f(const Vector3f &, const Vector3f &, float, float, float)> VoxelPointPositioner
Definition MRMarchingCubes.h:19
MRVOXELS_API Histogram recalculateHistogram(std::optional< Vector2f > minmax, ProgressCallback cb={}) const
Calculates and returns new histogram.
MRVOXELS_API void setSerializeFormat(const char *newFormat)
VoxelsChangedSignal voxelsChangedSignal
Definition MRObjectVoxels.h:234
virtual MRVOXELS_API std::shared_ptr< Object > shallowClone() const override
virtual MRVOXELS_API void applyScale(float scaleFactor) override
scale object size (all point positions)
AlphaType
type of alpha function on texture
Definition MRObjectVoxels.h:186
virtual bool hasModel() const override
Definition MRObjectVoxels.h:48
MRVOXELS_API void construct(const SimpleVolumeMinMax &simpleVolumeMinMax, ProgressCallback cb={}, bool normalPlusGrad=false)
@ None
special value not to limit path in one slice
Definition MRVoxelPath.h:33
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRColor.h:12
struct to control volume rendering texture
Definition MRObjectVoxels.h:158
Definition MRObject.h:284
Definition MRUniquePtr.h:15