MeshLib C++ Docs
Loading...
Searching...
No Matches
MRVisualObject.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRObject.h"
4#include "MRMeshTexture.h"
5#include "MRVector.h"
6#include "MRColor.h"
7#include "MRIRenderObject.h"
8#include "MRUniquePtr.h"
9#include "MREnums.h"
10
11namespace MR
12{
13
17
18// Note! Must use `MRMESH_CLASS` on this enum and all enums that extend this one,
19// otherwise you'll get silent wrong behavior on Mac.
20enum class MRMESH_CLASS VisualizeMaskType
21{
27 _count [[maybe_unused]],
28};
29
30// If a type derived from `VisualObject` wants to extend `VisualizeMaskType`, it must create a separate enum and specialize this to `true` for it.
31// NOTE! All those enums can start from 0, don't worry about collisions.
32template <typename T> struct IsVisualizeMaskEnum : std::false_type {};
33template <> struct IsVisualizeMaskEnum<VisualizeMaskType> : std::true_type {};
34
35// Wraps `IsVisualizeMaskEnum` and adds some sanity checks.
36template <typename T>
38 IsVisualizeMaskEnum<T>::value &&
39 std::is_same_v<std::underlying_type_t<T>, int> &&
40 std::is_same_v<T, std::remove_cvref_t<T>>;
41
42// Stores a `VisualizeMaskType` or any other enum that extends it (i.e. which specializes `IsVisualizeMaskEnum`).
43// To extract the value, do this:
44// if ( auto value = x.tryGet<MyEnum>() )
45// {
46// switch ( *value )
47// {
48// case MyEnum::foo: ...
49// case MyEnum::bar: ...
50// }
51// }
52// else // forward to the parent class
53class AnyVisualizeMaskEnum
54{
55 std::type_index type_;
56 int value_ = 0;
57
58public:
59 template <AnyVisualizeMaskEnumType T>
60 AnyVisualizeMaskEnum( T value ) : type_( typeid(T) ), value_( decltype(value_)( value ) ) {}
61
62 template <AnyVisualizeMaskEnumType T>
63 [[nodiscard]] std::optional<T> tryGet() const
64 {
65 if ( type_ == typeid(T) )
66 return T( value_ );
67 else
68 return {};
69 }
70};
71
72using AllVisualizeProperties = std::vector<ViewportMask>;
73
75{
76 DIRTY_NONE = 0x0000,
77 DIRTY_POSITION = 0x0001,
78 DIRTY_UV = 0x0002,
79 DIRTY_VERTS_RENDER_NORMAL = 0x0004, //< gl normals
80 DIRTY_FACES_RENDER_NORMAL = 0x0008,
81 DIRTY_CORNERS_RENDER_NORMAL = 0x0010,
82 DIRTY_RENDER_NORMALS = DIRTY_VERTS_RENDER_NORMAL | DIRTY_FACES_RENDER_NORMAL | DIRTY_CORNERS_RENDER_NORMAL,
83 DIRTY_SELECTION = 0x0020,
84 DIRTY_TEXTURE = 0x0040,
85 DIRTY_PRIMITIVES = 0x0080,
86 DIRTY_FACE = DIRTY_PRIMITIVES,
87 DIRTY_VERTS_COLORMAP = 0x0100,
88 DIRTY_PRIMITIVE_COLORMAP = 0x0200,
89 DIRTY_FACES_COLORMAP = DIRTY_PRIMITIVE_COLORMAP,
90 DIRTY_TEXTURE_PER_FACE = 0x0400,
91 DIRTY_MESH = 0x07FF,
92 DIRTY_BOUNDING_BOX = 0x0800,
93 DIRTY_BORDER_LINES = 0x1000,
94 DIRTY_EDGES_SELECTION = 0x2000,
95 DIRTY_CACHES = DIRTY_BOUNDING_BOX,
96 DIRTY_VOLUME = 0x4000,
97 DIRTY_ALL = 0x7FFF
98};
99
103struct Dirty
104{
105 uint32_t f{DIRTY_ALL};
106 operator uint32_t&() { return f; }
107 operator uint32_t() const { return f; }
108
109 Dirty() noexcept = default;
110 Dirty( const Dirty& ) noexcept {}
111 Dirty( Dirty&& ) noexcept = default;
112 Dirty& operator =( const Dirty& ) noexcept { return *this; }
113 Dirty& operator =( Dirty&& ) noexcept = default;
114 Dirty& operator =( uint32_t b ) noexcept { f = b; return *this; }
115};
116
118class MRMESH_CLASS VisualObject : public Object
119{
120public:
121 MRMESH_API VisualObject();
122
123 VisualObject( VisualObject&& ) = default;
124 VisualObject& operator = ( VisualObject&& ) = default;
125 virtual ~VisualObject() = default;
126
127 constexpr static const char* StaticTypeName() noexcept { return "VisualObject"; }
128 virtual const char* typeName() const override { return StaticTypeName(); }
129
130 constexpr static const char* StaticClassName() noexcept { return "Visual Object"; }
131 virtual std::string className() const override { return StaticClassName(); }
132
133 constexpr static const char* StaticClassNameInPlural() noexcept { return "Visual Objects"; }
134 virtual std::string classNameInPlural() const override { return StaticClassNameInPlural(); }
135
137 [[nodiscard]] MRMESH_API virtual bool supportsVisualizeProperty( AnyVisualizeMaskEnum type ) const;
139 MRMESH_API void setVisualizeProperty( bool value, AnyVisualizeMaskEnum type, ViewportMask viewportMask );
141 MRMESH_API virtual void setVisualizePropertyMask( AnyVisualizeMaskEnum type, ViewportMask viewportMask );
143 MRMESH_API bool getVisualizeProperty( AnyVisualizeMaskEnum type, ViewportMask viewportMask ) const;
145 MRMESH_API virtual const ViewportMask& getVisualizePropertyMask( AnyVisualizeMaskEnum type ) const;
147 MRMESH_API void toggleVisualizeProperty( AnyVisualizeMaskEnum type, ViewportMask viewportMask );
148
150 MRMESH_API virtual AllVisualizeProperties getAllVisualizeProperties() const;
152 void setAllVisualizeProperties( const AllVisualizeProperties& properties )
153 {
154 std::size_t counter = 0;
155 setAllVisualizeProperties_( properties, counter );
156 }
157
159 MRMESH_API void copyAllSolidColors( const VisualObject& other );
160
162 [[nodiscard]] MRMESH_API ViewportMask globalClippedByPlaneMask() const;
163
165 [[nodiscard]] bool globalClippedByPlane( ViewportMask viewportMask = ViewportMask::any() ) const { return !( globalClippedByPlaneMask() & viewportMask ).empty(); }
166
168 MRMESH_API void setGlobalClippedByPlane( bool on, ViewportMask viewportMask = ViewportMask::all() );
169
171 void showName( bool on ) { return setVisualizeProperty( on, VisualizeMaskType::Name, ViewportMask::all() ); }
173 bool showName() const { return getVisualizeProperty( VisualizeMaskType::Name, ViewportMask::any() ); }
174
176 MRMESH_API const Color& getFrontColor( bool selected = true, ViewportId viewportId = {} ) const;
178 MRMESH_API virtual void setFrontColor( const Color& color, bool selected, ViewportId viewportId = {} );
179
181 MRMESH_API virtual const ViewportProperty<Color>& getFrontColorsForAllViewports( bool selected = true ) const;
183 MRMESH_API virtual void setFrontColorsForAllViewports( ViewportProperty<Color> val, bool selected = true );
184
186 MRMESH_API virtual const ViewportProperty<Color>& getBackColorsForAllViewports() const;
188 MRMESH_API virtual void setBackColorsForAllViewports( ViewportProperty<Color> val );
189
191 MRMESH_API const Color& getBackColor( ViewportId viewportId = {} ) const;
193 MRMESH_API virtual void setBackColor( const Color& color, ViewportId viewportId = {} );
194
196 MRMESH_API const uint8_t& getGlobalAlpha( ViewportId viewportId = {} ) const;
198 MRMESH_API virtual void setGlobalAlpha( uint8_t alpha, ViewportId viewportId = {} );
199
201 MRMESH_API virtual const ViewportProperty<uint8_t>& getGlobalAlphaForAllViewports() const;
203 MRMESH_API virtual void setGlobalAlphaForAllViewports( ViewportProperty<uint8_t> val );
204
208 MRMESH_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true );
210 MRMESH_API uint32_t getDirtyFlags() const { return dirty_; }
212 MRMESH_API void resetDirty() const;
214 MRMESH_API virtual void resetDirtyExceptMask( uint32_t mask ) const;
215
217 MRMESH_API Box3f getBoundingBox() const;
220 MRMESH_API virtual Box3f getWorldBox( ViewportId = {} ) const override;
222 virtual bool getRedrawFlag( ViewportMask viewportMask ) const override
223 {
224 return Object::getRedrawFlag( viewportMask ) ||
225 ( isVisible( viewportMask ) &&
226 ( dirty_ & ( ~( DIRTY_CACHES ) ) ) );
227 }
228
230 bool isPickable( ViewportMask viewportMask = ViewportMask::any() ) const{return !(pickable_ & viewportMask).empty();}
232 MRMESH_API virtual void setPickable( bool on, ViewportMask viewportMask = ViewportMask::all() );
233
235 ColoringType getColoringType() const { return coloringType_; }
236
238 MRMESH_API virtual void setColoringType( ColoringType coloringType );
239
241 float getShininess() const { return shininess_; }
243 virtual void setShininess( float shininess ) { shininess_ = shininess; needRedraw_ = true; }
244
246 float getSpecularStrength() const { return specularStrength_; }
248 virtual void setSpecularStrength( float specularStrength ) { specularStrength_ = specularStrength; needRedraw_ = true; }
249
251 float getAmbientStrength() const { return ambientStrength_; }
253 virtual void setAmbientStrength( float ambientStrength ) { ambientStrength_ = ambientStrength; needRedraw_ = true; }
254
257 MRMESH_API virtual std::shared_ptr<Object> clone() const override;
260 MRMESH_API virtual std::shared_ptr<Object> shallowClone() const override;
261
264 MRMESH_API virtual bool render( const ModelRenderParams& ) const;
266 MRMESH_API virtual void renderForPicker( const ModelBaseRenderParams&, unsigned ) const;
268 MRMESH_API virtual void renderUi( const UiRenderParams& params ) const;
269
271 VisualObject( ProtectedStruct, const VisualObject& obj ) : VisualObject( obj ) {}
272
274 [[nodiscard]] MRMESH_API virtual size_t heapBytes() const override;
276 MRMESH_API virtual std::vector<std::string> getInfoLines() const override;
277
280 [[nodiscard]] MRMESH_API bool useDefaultScenePropertiesOnDeserialization() const { return useDefaultScenePropertiesOnDeserialization_; }
283 MRMESH_API void setUseDefaultScenePropertiesOnDeserialization( bool useDefaultScenePropertiesOnDeserialization )
284 { useDefaultScenePropertiesOnDeserialization_ = useDefaultScenePropertiesOnDeserialization; }
285
287 MRMESH_API virtual void resetFrontColor();
289 MRMESH_API virtual void resetColors();
290
291protected:
292 VisualObject( const VisualObject& obj ) = default;
293
295 MRMESH_API virtual void swapBase_( Object& other ) override;
296
299 virtual void setupRenderObject_() const {}
300
301 mutable UniquePtr<IRenderObject> renderObj_;
302
306 ViewportMask clipByPlane_;
307 ViewportMask showName_;
308 ViewportMask pickable_ = ViewportMask::all();
309 ViewportMask invertNormals_;
310 ViewportMask depthTest_ = ViewportMask::all();
311
312 float shininess_{35.0f};
313 float specularStrength_{ 0.5f }; // reflection intensity
314 float ambientStrength_{ 0.1f }; //non - directional light intensity
315
317 ColoringType coloringType_{ColoringType::SolidColor};
318 ViewportProperty<Color> selectedColor_;
319 ViewportProperty<Color> unselectedColor_;
320 ViewportProperty<Color> backFacesColor_;
321 ViewportProperty<uint8_t> globalAlpha_{ 255 };
322
323 bool useDefaultScenePropertiesOnDeserialization_{ false };
324
325 MRMESH_API ViewportMask& getVisualizePropertyMask_( AnyVisualizeMaskEnum type );
326
327 MRMESH_API virtual void serializeFields_( Json::Value& root ) const override;
328
329 MRMESH_API void deserializeFields_( const Json::Value& root ) override;
330
331 virtual Box3f computeBoundingBox_() const { return Box3f(); }
332
334 MRMESH_API void boundingBoxToInfoLines_( std::vector<std::string> & res ) const;
335
336 MRMESH_API virtual void setAllVisualizeProperties_( const AllVisualizeProperties& properties, std::size_t& pos );
337
338 // Derived classes should use this to implement `setAllVisualizeProperties()`.
339 template <AnyVisualizeMaskEnumType T>
340 void setAllVisualizePropertiesForEnum( const AllVisualizeProperties& properties, std::size_t& pos )
341 {
342 for ( int i = 0; i < int( T::_count ); i++ )
343 setVisualizePropertyMask( T( i ), properties[pos++] );
344 }
345 // Derived classes should use this to implement `getAllVisualizeProperties()`.
346 template <AnyVisualizeMaskEnumType T>
347 void getAllVisualizePropertiesForEnum( AllVisualizeProperties& properties ) const
348 {
349 properties.reserve( properties.size() + std::size_t( T::_count ) );
350 for ( int i = 0; i < int( ( T::_count ) ); i++ )
351 properties.push_back( getVisualizePropertyMask( T( i ) ) );
352 }
353
354private:
355 mutable Dirty dirty_; // private dirty, to force all using setDirtyFlags, instead of direct change
356
357 mutable Box3f boundingBoxCache_;
358
360 void setDefaultColors_();
361
363 void setDefaultSceneProperties_();
364};
365
367
368} // namespace MR
_count
Definition MRFeatureObject.h:87
#define MRMESH_API
Definition MRMeshFwd.h:80
#define MRMESH_CLASS
Definition MRMeshFwd.h:87
InvertedNormals
Definition MRVisualObject.h:23
Visibility
Definition MRVisualObject.h:22
ClippedByPlane
Definition MRVisualObject.h:25
Name
Definition MRVisualObject.h:24
DepthTest
Definition MRVisualObject.h:26
unsafe AnyVisualizeMaskEnum(MR.Const_AnyVisualizeMaskEnum _other)
unsafe Dirty()
DirtyFlags
Definition MRVisualObject.h:37
std::vector< ViewportMask > AllVisualizeProperties
Definition MRVisualObject.h:72
Definition MRCameraOrientationPlugin.h:8
AllVisualizeProperties
int heapBytes(FloatGrid grid)
Definition MRVisualObject.h:32