MeshLib C++ Docs
Loading...
Searching...
No Matches
MRObjectMeshHolder.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRPch/MRBindingMacros.h"
4#include "MRVisualObject.h"
5#include "MRXfBasedCache.h"
6#include "MRMeshPart.h"
7#include "MRObjectMeshData.h"
8
9namespace MR
10{
11
12enum class MRMESH_CLASS MeshVisualizePropertyType
13{
24 PolygonOffsetFromCamera, // recommended for drawing edges on top of mesh
25 _count [[maybe_unused]],
26};
27template <> struct IsVisualizeMaskEnum<MeshVisualizePropertyType> : std::true_type {};
28
32{
33public:
35
36 ObjectMeshHolder( ObjectMeshHolder&& ) noexcept = default;
37 ObjectMeshHolder& operator = ( ObjectMeshHolder&& ) noexcept = default;
38
39 constexpr static const char* StaticTypeName() noexcept { return "MeshHolder"; }
40 virtual const char* typeName() const override { return StaticTypeName(); }
41
42 MRMESH_API virtual void applyScale( float scaleFactor ) override;
43
45 MRMESH_API virtual bool hasVisualRepresentation() const override;
46
47 [[nodiscard]] virtual bool hasModel() const override { return bool( data_.mesh ); }
48
49 #ifdef __GNUC__
50 #pragma GCC diagnostic push
51 #pragma GCC diagnostic ignored "-Wstrict-aliasing" // Fingers crossed.
52 #endif
53 const std::shared_ptr< const Mesh >& mesh() const
54 { return reinterpret_cast< const std::shared_ptr<const Mesh>& >( data_.mesh ); } // reinterpret_cast to avoid making a copy of shared_ptr
55 #ifdef __GNUC__
56 #pragma GCC diagnostic pop
57 #endif
58
60 MeshPart meshPart() const { return data_.selectedFaces.any() ? MeshPart{ *data_.mesh, &data_.selectedFaces } : *data_.mesh; }
61
62 MRMESH_API virtual std::shared_ptr<Object> clone() const override;
63 MRMESH_API virtual std::shared_ptr<Object> shallowClone() const override;
64
65 MRMESH_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true ) override;
66
67 const FaceBitSet& getSelectedFaces() const { return data_.selectedFaces; }
68 MRMESH_API virtual void selectFaces( FaceBitSet newSelection );
70 MRMESH_API const Color& getSelectedFacesColor( ViewportId id = {} ) const;
72 MRMESH_API virtual void setSelectedFacesColor( const Color& color, ViewportId id = {} );
73
74 const UndirectedEdgeBitSet& getSelectedEdges() const { return data_.selectedEdges; }
75 MRMESH_API virtual void selectEdges( UndirectedEdgeBitSet newSelection );
77 MRMESH_API const Color& getSelectedEdgesColor( ViewportId id = {} ) const;
79 MRMESH_API virtual void setSelectedEdgesColor( const Color& color, ViewportId id = {} );
80
81 MRMESH_API const ViewportProperty<Color>& getSelectedEdgesColorsForAllViewports() const;
82 MRMESH_API virtual void setSelectedEdgesColorsForAllViewports( ViewportProperty<Color> val );
83
84 MRMESH_API const ViewportProperty<Color>& getSelectedFacesColorsForAllViewports() const;
85 MRMESH_API virtual void setSelectedFacesColorsForAllViewports( ViewportProperty<Color> val );
86
87 MRMESH_API const ViewportProperty<Color>& getEdgesColorsForAllViewports() const;
88 MRMESH_API virtual void setEdgesColorsForAllViewports( ViewportProperty<Color> val );
89
90 MRMESH_API const ViewportProperty<Color>& getPointsColorsForAllViewports() const;
91 MRMESH_API virtual void setPointsColorsForAllViewports( ViewportProperty<Color> val );
92
93 MRMESH_API const ViewportProperty<Color>& getBordersColorsForAllViewports() const;
94 MRMESH_API virtual void setBordersColorsForAllViewports( ViewportProperty<Color> val );
95
97 MRMESH_API void copyAllSolidColors( const ObjectMeshHolder& other );
98
100 const UndirectedEdgeBitSet& creases() const { return data_.creases; }
101 MRMESH_API virtual void setCreases( UndirectedEdgeBitSet creases );
102
104 void setFlatShading( bool on )
105 { return setVisualizeProperty( on, MeshVisualizePropertyType::FlatShading, ViewportMask::all() ); }
106 bool flatShading() const
107 { return getVisualizeProperty( MeshVisualizePropertyType::FlatShading, ViewportMask::any() ); }
108
109 [[nodiscard]] MRMESH_API bool supportsVisualizeProperty( AnyVisualizeMaskEnum type ) const override;
110
112 MRMESH_API AllVisualizeProperties getAllVisualizeProperties() const override;
114 MRMESH_API const ViewportMask& getVisualizePropertyMask( AnyVisualizeMaskEnum type ) const override;
115
117 const ObjectMeshData& data() const { return data_; }
118
120 virtual void setData( ObjectMeshData && data ) { data_ = std::move( data ); setDirtyFlags( DIRTY_ALL ); }
121
123 virtual void updateData( ObjectMeshData& data ) { std::swap( data_, data ); setDirtyFlags( DIRTY_ALL ); }
124
126 const VertColors& getVertsColorMap() const { return data_.vertColors; }
127
129 virtual void setVertsColorMap( VertColors vertsColorMap ) { data_.vertColors = std::move( vertsColorMap ); setDirtyFlags( DIRTY_VERTS_COLORMAP ); }
130
132 virtual void updateVertsColorMap( VertColors& vertsColorMap ) { std::swap( data_.vertColors, vertsColorMap ); setDirtyFlags( DIRTY_VERTS_COLORMAP ); }
133
134 const FaceColors& getFacesColorMap() const { return data_.faceColors; }
135 virtual void setFacesColorMap( FaceColors facesColorMap ) { data_.faceColors = std::move( facesColorMap ); setDirtyFlags( DIRTY_PRIMITIVE_COLORMAP ); }
136 virtual void updateFacesColorMap( FaceColors& updated ) { std::swap( data_.faceColors, updated ); setDirtyFlags( DIRTY_PRIMITIVE_COLORMAP ); }
137
138 MRMESH_API virtual void setEdgeWidth( float edgeWidth );
139 float getEdgeWidth() const { return edgeWidth_; }
140 MRMESH_API virtual void setPointSize( float size );
141 virtual float getPointSize() const { return pointSize_; }
142
143 const Color& getEdgesColor( ViewportId id = {} ) const { return edgesColor_.get(id); }
144 virtual void setEdgesColor( const Color& color, ViewportId id = {} )
145 { edgesColor_.set( color, id ); needRedraw_ = true; }
146
147 const Color& getPointsColor( ViewportId id = {} ) const { return pointsColor_.get(id); }
148 virtual void setPointsColor( const Color& color, ViewportId id = {} )
149 { pointsColor_.set( color, id ); needRedraw_ = true; }
150
151 const Color& getBordersColor( ViewportId id = {} ) const { return bordersColor_.get( id ); }
152 virtual void setBordersColor( const Color& color, ViewportId id = {} )
153 { bordersColor_.set( color, id ); needRedraw_ = true; }
154
156 ObjectMeshHolder( ProtectedStruct, const ObjectMeshHolder& obj ) : ObjectMeshHolder( obj )
157 {}
158
160 MRMESH_API const MeshTexture& getTexture() const;
161 // for backward compatibility
162 [[deprecated]] MRMESH_API MR_BIND_IGNORE virtual void setTexture( MeshTexture texture );
163 [[deprecated]] MRMESH_API MR_BIND_IGNORE virtual void updateTexture( MeshTexture& updated );
164 const Vector<MeshTexture, TextureId>& getTextures() const { return textures_; }
165 virtual void setTextures( Vector<MeshTexture, TextureId> texture ) { textures_ = std::move( texture ); setDirtyFlags( DIRTY_TEXTURE ); }
166 virtual void updateTextures( Vector<MeshTexture, TextureId>& updated ) { std::swap( textures_, updated ); setDirtyFlags( DIRTY_TEXTURE ); }
167
170 virtual void setTexturePerFace( Vector<TextureId, FaceId> texturePerFace ) { data_.texturePerFace = std::move( texturePerFace ); setDirtyFlags( DIRTY_TEXTURE_PER_FACE ); }
171 virtual void updateTexturePerFace( Vector<TextureId, FaceId>& texturePerFace ) { std::swap( data_.texturePerFace, texturePerFace ); setDirtyFlags( DIRTY_TEXTURE_PER_FACE ); }
172 virtual void addTexture( MeshTexture texture ) { textures_.emplace_back( std::move( texture ) ); setDirtyFlags( DIRTY_TEXTURE_PER_FACE ); }
173 const TexturePerFace& getTexturePerFace() const { return data_.texturePerFace; }
174
175 const VertUVCoords& getUVCoords() const { return data_.uvCoordinates; }
176 virtual void setUVCoords( VertUVCoords uvCoordinates ) { data_.uvCoordinates = std::move( uvCoordinates ); setDirtyFlags( DIRTY_UV ); }
177 virtual void updateUVCoords( VertUVCoords& updated ) { std::swap( data_.uvCoordinates, updated ); setDirtyFlags( DIRTY_UV ); }
178
180 MRMESH_API virtual void copyTextureAndColors( const ObjectMeshHolder& src, const VertMap& thisToSrc, const FaceMap& thisToSrcFaces = {} );
181
183 MRMESH_API virtual void copyColors( const ObjectMeshHolder& src, const VertMap& thisToSrc, const FaceMap& thisToSrcFaces = {} );
184
185 // ancillary texture can be used to have custom features visualization without affecting real one
186 const MeshTexture& getAncillaryTexture() const { return ancillaryTexture_; }
187 virtual void setAncillaryTexture( MeshTexture texture ) { ancillaryTexture_ = std::move( texture ); setDirtyFlags( DIRTY_TEXTURE ); }
188
189 const VertUVCoords& getAncillaryUVCoords() const { return ancillaryUVCoordinates_; }
190 virtual void setAncillaryUVCoords( VertUVCoords uvCoordinates ) { ancillaryUVCoordinates_ = std::move( uvCoordinates ); setDirtyFlags( DIRTY_UV ); }
191 void updateAncillaryUVCoords( VertUVCoords& updated ) { std::swap( ancillaryUVCoordinates_, updated ); setDirtyFlags( DIRTY_UV ); }
192
193 bool hasAncillaryTexture() const { return !ancillaryUVCoordinates_.empty() && !ancillaryTexture_.pixels.empty(); }
194 MRMESH_API void clearAncillaryTexture();
195
197 MRMESH_API uint32_t getNeededNormalsRenderDirtyValue( ViewportMask viewportMask ) const;
198
199 MRMESH_API virtual bool getRedrawFlag( ViewportMask viewportMask ) const override;
200
202 [[nodiscard]] MRMESH_API bool isMeshClosed() const;
203
206 [[nodiscard]] MRMESH_API virtual Box3f getWorldBox( ViewportId = {} ) const override;
207
209 [[nodiscard]] MRMESH_API size_t numSelectedFaces() const;
210
212 [[nodiscard]] MRMESH_API size_t numSelectedEdges() const;
213
215 [[nodiscard]] MRMESH_API size_t numCreaseEdges() const;
216
218 [[nodiscard]] MRMESH_API double totalArea() const;
219
221 [[nodiscard]] MRMESH_API double selectedArea() const;
222
224 [[nodiscard]] MRMESH_API double volume() const;
225
227 [[nodiscard]] MRMESH_API float avgEdgeLen() const;
228
230 [[nodiscard]] MRMESH_API size_t numUndirectedEdges() const;
231
233 [[nodiscard]] MRMESH_API size_t numHoles() const;
234
236 [[nodiscard]] MRMESH_API size_t numComponents() const;
237
239 [[nodiscard]] MRMESH_API size_t numHandles() const;
240
242 [[nodiscard]] MRMESH_API virtual size_t heapBytes() const override;
243
245 [[nodiscard]] const char * serializeFormat() const { return serializeFormat_; }
246
248 [[nodiscard]] MRMESH_API const char * actualSerializeFormat() const;
249
252 MRMESH_API void setSerializeFormat( const char * newFormat );
253
255 MRMESH_API void resetFrontColor() override;
257 MRMESH_API void resetColors() override;
258
259 MRMESH_API virtual size_t getModelHash() const override;
260 MRMESH_API virtual bool sameModels( const Object& other ) const override;
261
263 using SelectionChangedSignal = Signal<void()>;
264 SelectionChangedSignal faceSelectionChangedSignal;
265 SelectionChangedSignal edgeSelectionChangedSignal;
266 SelectionChangedSignal creasesChangedSignal;
267
268protected:
269 ObjectMeshData data_;
270
272 Vector<MeshTexture, TextureId> textures_;
273
274 MeshTexture ancillaryTexture_;
275 VertUVCoords ancillaryUVCoordinates_;
276
277 mutable std::optional<size_t> numHoles_;
278 mutable std::optional<size_t> numComponents_;
279 mutable std::optional<size_t> numUndirectedEdges_;
280 mutable std::optional<size_t> numHandles_;
281 mutable std::optional<bool> meshIsClosed_;
282 mutable std::optional<size_t> numSelectedFaces_, numSelectedEdges_, numCreaseEdges_;
283 mutable std::optional<double> totalArea_, selectedArea_;
284 mutable std::optional<double> volume_;
285 mutable std::optional<float> avgEdgeLen_;
286 mutable ViewportProperty<XfBasedCache<Box3f>> worldBox_;
287
288 ObjectMeshHolder( const ObjectMeshHolder& other ) = default;
289
291 MRMESH_API virtual void swapBase_( Object& other ) override;
294 MRMESH_API virtual void swapSignals_( Object& other ) override;
295
296 MRMESH_API virtual Expected<std::future<Expected<void>>> serializeModel_( const std::filesystem::path& path ) const override;
297
298 MRMESH_API virtual void serializeFields_( Json::Value& root ) const override;
299
300 MRMESH_API void deserializeFields_( const Json::Value& root ) override;
301
302 MRMESH_API Expected<void> deserializeModel_( const std::filesystem::path& path, ProgressCallback progressCb = {} ) override;
303 MRMESH_API virtual Expected<void> setSharedModel_( const Object& other ) override;
304
306 MRMESH_API void setAllVisualizeProperties_( const AllVisualizeProperties& properties, std::size_t& pos ) override;
307
308 MRMESH_API virtual Box3f computeBoundingBox_() const override;
309
310 MRMESH_API virtual void setupRenderObject_() const override;
311
312 ViewportMask showTexture_;
313 ViewportMask showFaces_ = ViewportMask::all();
314 ViewportMask showEdges_;
315 ViewportMask showPoints_;
316 ViewportMask showSelectedEdges_ = ViewportMask::all();
317 ViewportMask showSelectedFaces_ = ViewportMask::all();
318 ViewportMask showBordersHighlight_;
319 ViewportMask polygonOffset_;
320 ViewportMask flatShading_;
321
322 // really it shoud be one enum Shading {None, Flat, Smooth, Crease}
323 // but for back capability it is easier to add global flag
324 ViewportMask shadingEnabled_ = ViewportMask::all();
325
326 ViewportMask onlyOddFragments_;
327
328 ViewportProperty<Color> edgesColor_;
329 ViewportProperty<Color> pointsColor_;
330 ViewportProperty<Color> bordersColor_;
331 ViewportProperty<Color> edgeSelectionColor_;
332 ViewportProperty<Color> faceSelectionColor_;
333
334 float edgeWidth_{ 0.5f };
335 float pointSize_{ 5.f };
336
337private:
339 void setDefaultColors_();
340
342 void setDefaultSceneProperties_();
343
344 const char * serializeFormat_ = nullptr; // means use defaultSerializeMeshFormat()
345};
346
349[[nodiscard]] MRMESH_API const std::string & defaultSerializeMeshFormat();
350
353// serialization falls back to the PLY format if given format support is available
354// NOTE: CTM format support is available in the MRIOExtras library; make sure to load it if you prefer CTM
355MRMESH_API void setDefaultSerializeMeshFormat( std::string newFormat );
356
357} // namespace MR
_count
Definition MRFeatureObject.h:87
#define MRMESH_API
Definition MRMeshFwd.h:80
#define MRMESH_CLASS
Definition MRMeshFwd.h:87
Points
Definition MRObjectLinesHolder.h:10
OnlyOddFragments
Definition MRObjectMeshHolder.h:22
Faces
Definition MRObjectMeshHolder.h:14
SelectedFaces
Definition MRObjectMeshHolder.h:18
Edges
Definition MRObjectMeshHolder.h:16
EnableShading
Definition MRObjectMeshHolder.h:20
PolygonOffsetFromCamera
Definition MRObjectMeshHolder.h:24
FlatShading
Definition MRObjectMeshHolder.h:21
SelectedEdges
Definition MRObjectMeshHolder.h:19
Texture
Definition MRObjectMeshHolder.h:15
BordersHighlight
Definition MRObjectMeshHolder.h:23
Definition MRObjectMeshHolder.h:32
Definition MRVisualObject.h:119
MRVIEWER_API std::unique_ptr< ImGuiImage > & getTexture(TextureType type)
Definition MRCameraOrientationPlugin.h:8
MRMESH_API void setDefaultSerializeMeshFormat(std::string newFormat)
MRMESH_API const std::string & defaultSerializeMeshFormat()
AllVisualizeProperties
int heapBytes(FloatGrid grid)
float volume(MeshTopology topology, VertCoords points, FaceBitSet region=None)
Definition MRVisualObject.h:32