2#include "MRVoxelsFwd.h"
4#include "MRMesh/MRObjectMeshHolder.h"
5#include "MRMesh/MRProgressCallback.h"
6#include "MRMesh/MRHistogram.h"
7#include "MRMesh/MRVolumeIndexer.h"
8#include "MRVoxelsVolume.h"
9#include "MRMarchingCubes.h"
16class MRVOXELS_CLASS ObjectVoxels :
public ObjectMeshHolder
19 MRVOXELS_API ObjectVoxels();
20 ObjectVoxels& operator = ( ObjectVoxels&& ) noexcept = default;
21 ObjectVoxels( ObjectVoxels&& ) noexcept = default;
22 virtual ~ObjectVoxels() = default;
24 constexpr static const
char* StaticTypeName() noexcept {
return "ObjectVoxels"; }
25 virtual const char* typeName()
const override {
return StaticTypeName(); }
27 constexpr static const char* StaticClassName() noexcept {
return "Voxel Volume"; }
28 virtual std::string className()
const override {
return StaticClassName(); }
30 constexpr static const char* StaticClassNameInPlural() noexcept {
return "Voxel Volumes"; }
31 virtual std::string classNameInPlural()
const override {
return StaticClassNameInPlural(); }
33 MRVOXELS_API
virtual void applyScale(
float scaleFactor )
override;
36 const std::shared_ptr<Mesh>& surface()
const {
return data_.mesh; }
39 const VdbVolume& vdbVolume()
const {
return vdbVolume_; };
40 VdbVolume& varVdbVolume() {
return vdbVolume_; }
43 const FloatGrid& grid()
const {
return vdbVolume_.data; }
45 [[nodiscard]]
virtual bool hasModel()
const override {
return bool( vdbVolume_.data ); }
48 const Vector3i& dimensions()
const
49 {
return vdbVolume_.dims; }
51 float getIsoValue()
const
54 const Histogram& histogram()
const
55 {
return histogram_; }
57 const Vector3f& voxelSize()
const
58 {
return vdbVolume_.voxelSize; }
60 MRVOXELS_API
virtual std::vector<std::string> getInfoLines()
const override;
66 MRVOXELS_API
void construct(
const SimpleVolume& simpleVolume,
const std::optional<Vector2f> & minmax = {}, ProgressCallback cb = {},
bool normalPlusGrad = false );
71 MRVOXELS_API
void construct(
const SimpleVolumeMinMax& simpleVolumeMinMax, ProgressCallback cb = {},
bool normalPlusGrad = false );
75 MRVOXELS_API
void construct(
const FloatGrid& grid,
const Vector3f& voxelSize,
const std::optional<Vector2f> & minmax = {} );
78 MRVOXELS_API
void construct(
const VdbVolume& vdbVolume );
82 MRVOXELS_API
void updateHistogramAndSurface( ProgressCallback cb = {} );
86 MRVOXELS_API
virtual Expected<bool> setIsoValue(
float iso, ProgressCallback cb = {},
bool updateSurface = true );
90 MRVOXELS_API std::shared_ptr<Mesh> updateIsoSurface( std::shared_ptr<Mesh> mesh );
93 MRVOXELS_API VdbVolume updateVdbVolume( VdbVolume vdbVolume );
96 MRVOXELS_API Histogram updateHistogram( Histogram histogram );
99 MRVOXELS_API Expected<std::shared_ptr<Mesh>> recalculateIsoSurface(
float iso, ProgressCallback cb = {} )
const;
101 MRVOXELS_API Expected<std::shared_ptr<Mesh>> recalculateIsoSurface(
const VdbVolume& volume,
float iso, ProgressCallback cb = {} )
const;
103 MRVOXELS_API Histogram recalculateHistogram( std::optional<Vector2f> minmax, ProgressCallback cb = {} )
const;
105 bool getDualMarchingCubes()
const {
return dualMarchingCubes_; }
108 MRVOXELS_API
virtual void setDualMarchingCubes(
bool on,
bool updateSurface =
true, ProgressCallback cb = {} );
110 virtual void setVoxelPointPositioner( VoxelPointPositioner positioner ) { positioner_ = positioner; }
116 MRVOXELS_API
virtual void setActiveBounds(
const Box3i& activeBox, ProgressCallback cb = {},
bool updateSurface = true );
119 MRVOXELS_API
const Box3i& getActiveBounds()
const;
121 MRVOXELS_API
virtual void invalidateActiveBoundsCaches();
123 const VoxelBitSet& getSelectedVoxels()
const {
return selectedVoxels_; }
124 void selectVoxels(
const VoxelBitSet& selectedVoxels ) { selectedVoxels_ = selectedVoxels; }
127 const VoxelBitSet& getVolumeRenderActiveVoxels()
const {
return volumeRenderActiveVoxels_; }
129 MRVOXELS_API
void setVolumeRenderActiveVoxels(
const VoxelBitSet& activeVoxels );
134 MRVOXELS_API VoxelId getVoxelIdByCoordinate(
const Vector3i& coord )
const;
135 MRVOXELS_API VoxelId getVoxelIdByPoint(
const Vector3f& point )
const;
136 MRVOXELS_API Vector3i getCoordinateByVoxelId( VoxelId
id )
const;
139 const VolumeIndexer& getVolumeIndexer()
const {
return indexer_; }
143 MRVOXELS_API
bool prepareDataForVolumeRendering( ProgressCallback cb = {} )
const;
145 bool isVolumeRenderingEnabled()
const {
return volumeRendering_; }
149 MRVOXELS_API
void enableVolumeRendering(
bool on );
151 [[nodiscard]] std::unique_ptr<SimpleVolume> getVolumeRenderingData()
const {
return std::move( volumeRenderingData_ ); }
157 FilterType volumeFilterType{ FilterType::Linear };
159 enum class ShadingType
164 } shadingType{ ShadingType::None };
171 } lutType{ LutType::Rainbow };
173 Color oneColor{ Color::white() };
180 float samplingStep{ -1.0f };
187 } alphaType{ AlphaType::Constant };
188 uint8_t alphaLimit{ 10 };
192 MRVOXELS_API
void setVolumeRenderingParams(
const VolumeRenderingParams& params );
194 MRVOXELS_API
virtual bool hasVisualRepresentation()
const override;
197 MRVOXELS_API
void setMaxSurfaceVertices(
int maxVerts );
199 int getMaxSurfaceVertices()
const {
return maxSurfaceVertices_; }
201 MRVOXELS_API
virtual std::shared_ptr<Object> clone()
const override;
202 MRVOXELS_API
virtual std::shared_ptr<Object> shallowClone()
const override;
204 MRVOXELS_API
virtual void setDirtyFlags( uint32_t mask,
bool invalidateCaches =
true )
override;
207 [[nodiscard]] MRVOXELS_API
size_t activeVoxels()
const;
210 ObjectVoxels( ProtectedStruct,
const ObjectVoxels& obj ) : ObjectVoxels( obj ) {}
213 [[nodiscard]] MRVOXELS_API
virtual size_t heapBytes()
const override;
216 [[nodiscard]]
const char * serializeFormat()
const {
return serializeFormat_; }
220 MRVOXELS_API
void setSerializeFormat(
const char * newFormat );
223 MRVOXELS_API
void resetFrontColor()
override;
226 using IsoSurfaceChangedSignal = Signal<void()>;
227 IsoSurfaceChangedSignal isoSurfaceChangedSignal;
230 using VoxelsChangedSignal = Signal<void()>;
231 VoxelsChangedSignal voxelsChangedSignal;
234 VolumeRenderingParams volumeRenderingParams_;
235 mutable UniquePtr<SimpleVolume> volumeRenderingData_;
237 int maxSurfaceVertices_{ 5'000'000 };
238 VdbVolume vdbVolume_;
239 float isoValue_{0.0f};
240 bool dualMarchingCubes_{
true};
241 VoxelPointPositioner positioner_ = {};
242 Histogram histogram_;
243 mutable std::optional<Box3i> activeBounds_;
244 mutable std::optional<size_t> activeVoxels_;
246 const char * serializeFormat_ =
nullptr;
249 VolumeIndexer indexer_ = VolumeIndexer( vdbVolume_.dims );
250 Vector3f reverseVoxelSize_;
252 void updateHistogram_(
float min,
float max, ProgressCallback cb = {} );
256 void setDefaultColors_();
259 void setDefaultSceneProperties_();
262 VoxelBitSet selectedVoxels_;
263 VoxelBitSet volumeRenderActiveVoxels_;
265 ObjectVoxels(
const ObjectVoxels& other ) =
default;
266 bool volumeRendering_{
false };
269 MRVOXELS_API
virtual void swapBase_( Object& other )
override;
272 MRVOXELS_API
virtual void swapSignals_( Object& other )
override;
274 MRVOXELS_API
virtual void serializeFields_( Json::Value& root )
const override;
276 MRVOXELS_API
void deserializeFields_(
const Json::Value& root )
override;
278 MRVOXELS_API Expected<void> deserializeModel_(
const std::filesystem::path& path, ProgressCallback progressCb = {} )
override;
280 MRVOXELS_API
virtual Expected<std::future<Expected<void>>> serializeModel_(
const std::filesystem::path& path )
const override;
static unsafe MR.Std.Const_String defaultSerializeVoxelsFormat()
static unsafe void setDefaultSerializeVoxelsFormat(string newFormat)
MRMESH_API bool operator==(const BitSet &a, const BitSet &b)
compare that two bit sets have the same set bits (they can be equal even if sizes are distinct but la...
size_t heapBytes(const BitSet &bs)
returns the amount of memory given BitSet occupies on heap
Definition MRMesh/MRBitSet.h:298
Definition MRMesh/MRColor.h:9
Definition MRObjectVoxels.h:155