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
20enum class MRMESH_CLASS VisualizeMaskType
21{
27 _count [[maybe_unused]],
28};
29
32template <typename T> struct IsVisualizeMaskEnum : std::false_type {};
33template <> struct IsVisualizeMaskEnum<VisualizeMaskType> : std::true_type {};
34
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
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
96
100struct Dirty
101{
102 uint32_t f{DIRTY_ALL};
103 operator uint32_t&() { return f; }
104 operator uint32_t() const { return f; }
105
106 Dirty() noexcept = default;
107 Dirty( const Dirty& ) noexcept {}
108 Dirty( Dirty&& ) noexcept = default;
109 Dirty& operator =( const Dirty& ) noexcept { return *this; }
110 Dirty& operator =( Dirty&& ) noexcept = default;
111 Dirty& operator =( uint32_t b ) noexcept { f = b; return *this; }
112};
113
115class MRMESH_CLASS VisualObject : public Object
116{
117public:
118 MRMESH_API VisualObject();
119
121 VisualObject& operator = ( VisualObject&& ) = default;
122 virtual ~VisualObject() = default;
123
124 constexpr static const char* StaticTypeName() noexcept { return "VisualObject"; }
125 virtual const char* typeName() const override { return StaticTypeName(); }
126
127 constexpr static const char* StaticClassName() noexcept { return "Visual Object"; }
128 virtual std::string className() const override { return StaticClassName(); }
129
130 constexpr static const char* StaticClassNameInPlural() noexcept { return "Visual Objects"; }
131 virtual std::string classNameInPlural() const override { return StaticClassNameInPlural(); }
132
134 [[nodiscard]] MRMESH_API virtual bool supportsVisualizeProperty( AnyVisualizeMaskEnum type ) const;
136 MRMESH_API void setVisualizeProperty( bool value, AnyVisualizeMaskEnum type, ViewportMask viewportMask );
138 MRMESH_API virtual void setVisualizePropertyMask( AnyVisualizeMaskEnum type, ViewportMask viewportMask );
140 MRMESH_API bool getVisualizeProperty( AnyVisualizeMaskEnum type, ViewportMask viewportMask ) const;
142 MRMESH_API virtual const ViewportMask& getVisualizePropertyMask( AnyVisualizeMaskEnum type ) const;
144 MRMESH_API void toggleVisualizeProperty( AnyVisualizeMaskEnum type, ViewportMask viewportMask );
145
150 {
151 std::size_t counter = 0;
152 setAllVisualizeProperties_( properties, counter );
153 }
154
156 MRMESH_API void copyAllSolidColors( const VisualObject& other );
157
159 [[nodiscard]] MRMESH_API ViewportMask globalClippedByPlaneMask() const;
160
162 [[nodiscard]] bool globalClippedByPlane( ViewportMask viewportMask = ViewportMask::any() ) const { return !( globalClippedByPlaneMask() & viewportMask ).empty(); }
163
165 MRMESH_API void setGlobalClippedByPlane( bool on, ViewportMask viewportMask = ViewportMask::all() );
166
168 void showName( bool on ) { return setVisualizeProperty( on, VisualizeMaskType::Name, ViewportMask::all() ); }
170 bool showName() const { return getVisualizeProperty( VisualizeMaskType::Name, ViewportMask::any() ); }
171
173 MRMESH_API const Color& getFrontColor( bool selected = true, ViewportId viewportId = {} ) const;
175 MRMESH_API virtual void setFrontColor( const Color& color, bool selected, ViewportId viewportId = {} );
176
178 MRMESH_API virtual const ViewportProperty<Color>& getFrontColorsForAllViewports( bool selected = true ) const;
180 MRMESH_API virtual void setFrontColorsForAllViewports( ViewportProperty<Color> val, bool selected = true );
181
183 MRMESH_API virtual const ViewportProperty<Color>& getBackColorsForAllViewports() const;
186
188 MRMESH_API const Color& getBackColor( ViewportId viewportId = {} ) const;
190 MRMESH_API virtual void setBackColor( const Color& color, ViewportId viewportId = {} );
191
193 MRMESH_API const uint8_t& getGlobalAlpha( ViewportId viewportId = {} ) const;
195 MRMESH_API virtual void setGlobalAlpha( uint8_t alpha, ViewportId viewportId = {} );
196
201
205 MRMESH_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true );
207 MRMESH_API uint32_t getDirtyFlags() const { return dirty_; }
209 MRMESH_API void resetDirty() const;
211 MRMESH_API virtual void resetDirtyExceptMask( uint32_t mask ) const;
212
214 MRMESH_API Box3f getBoundingBox() const;
217 MRMESH_API virtual Box3f getWorldBox( ViewportId = {} ) const override;
219 virtual bool getRedrawFlag( ViewportMask viewportMask ) const override
220 {
221 return Object::getRedrawFlag( viewportMask ) ||
222 ( isVisible( viewportMask ) && dirty_ );
223 }
224
226 bool isPickable( ViewportMask viewportMask = ViewportMask::any() ) const{return !(pickable_ & viewportMask).empty();}
228 MRMESH_API virtual void setPickable( bool on, ViewportMask viewportMask = ViewportMask::all() );
229
231 ColoringType getColoringType() const { return coloringType_; }
232
234 MRMESH_API virtual void setColoringType( ColoringType coloringType );
235
237 float getShininess() const { return shininess_; }
239 virtual void setShininess( float shininess ) { shininess_ = shininess; needRedraw_ = true; }
240
242 float getSpecularStrength() const { return specularStrength_; }
244 virtual void setSpecularStrength( float specularStrength ) { specularStrength_ = specularStrength; needRedraw_ = true; }
245
247 float getAmbientStrength() const { return ambientStrength_; }
249 virtual void setAmbientStrength( float ambientStrength ) { ambientStrength_ = ambientStrength; needRedraw_ = true; }
250
253 MRMESH_API virtual std::shared_ptr<Object> clone() const override;
256 MRMESH_API virtual std::shared_ptr<Object> shallowClone() const override;
257
260 MRMESH_API virtual bool render( const ModelRenderParams& ) const;
262 MRMESH_API virtual void renderForPicker( const ModelBaseRenderParams&, unsigned ) const;
264 MRMESH_API virtual void renderUi( const UiRenderParams& params ) const;
265
268
270 [[nodiscard]] MRMESH_API virtual size_t heapBytes() const override;
272 MRMESH_API virtual std::vector<std::string> getInfoLines() const override;
273
276 [[nodiscard]] MRMESH_API bool useDefaultScenePropertiesOnDeserialization() const { return useDefaultScenePropertiesOnDeserialization_; }
279 MRMESH_API void setUseDefaultScenePropertiesOnDeserialization( bool useDefaultScenePropertiesOnDeserialization )
280 { useDefaultScenePropertiesOnDeserialization_ = useDefaultScenePropertiesOnDeserialization; }
281
283 MRMESH_API virtual void resetFrontColor();
285 MRMESH_API virtual void resetColors();
286
287protected:
288 VisualObject( const VisualObject& obj ) = default;
289
291 MRMESH_API virtual void swapBase_( Object& other ) override;
292
295 virtual void setupRenderObject_() const {}
296
298 MRMESH_API void setDirtyFlagsFast_( uint32_t mask );
299 MRMESH_API void invalidateMetricsCache_( uint32_t mask );
300
302
308 ViewportMask pickable_ = ViewportMask::all();
310 ViewportMask depthTest_ = ViewportMask::all();
311
312 float shininess_{35.0f};
313 float specularStrength_{ 0.5f };
314 float ambientStrength_{ 0.1f };
315
317 ColoringType coloringType_{ColoringType::SolidColor};
321 ViewportProperty<uint8_t> globalAlpha_{ 255 };
322
323 bool useDefaultScenePropertiesOnDeserialization_{ false };
324
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
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 }
346 template <AnyVisualizeMaskEnumType T>
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_;
356
357 mutable std::optional<Box3f> boundingBoxCache_;
358
360 void setDefaultColors_();
361
363 void setDefaultSceneProperties_();
364};
365
367
368}
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
Definition MRVisualObject.h:54
AnyVisualizeMaskEnum(T value)
Definition MRVisualObject.h:60
std::optional< T > tryGet() const
Definition MRVisualObject.h:63
named object in the data model
Definition MRObject.h:62
Definition MRViewportId.h:16
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
Definition MRViewportProperty.h:17
Visual Object.
Definition MRVisualObject.h:116
MRMESH_API bool useDefaultScenePropertiesOnDeserialization() const
Definition MRVisualObject.h:276
virtual MRMESH_API const ViewportProperty< Color > & getFrontColorsForAllViewports(bool selected=true) const
returns color of object when it is selected/not-selected (depending on argument) in all viewports
virtual bool getRedrawFlag(ViewportMask viewportMask) const override
returns true if the object must be redrawn (due to dirty flags) in one of specified viewports
Definition MRVisualObject.h:219
virtual MRMESH_API void resetColors()
reset all object colors to their default values from the current theme
virtual MRMESH_API void setFrontColor(const Color &color, bool selected, ViewportId viewportId={})
sets color of object when it is selected/not-selected (depending on argument) in given viewport
MRMESH_API ViewportMask & getVisualizePropertyMask_(AnyVisualizeMaskEnum type)
MRMESH_API void setUseDefaultScenePropertiesOnDeserialization(bool useDefaultScenePropertiesOnDeserialization)
Definition MRVisualObject.h:279
VisualObject(ProtectedStruct, const VisualObject &obj)
this ctor is public only for std::make_shared used inside clone()
Definition MRVisualObject.h:267
virtual MRMESH_API bool supportsVisualizeProperty(AnyVisualizeMaskEnum type) const
Returns true if this class supports the property type. Otherwise passing it to the functions below is...
virtual MRMESH_API void renderForPicker(const ModelBaseRenderParams &, unsigned) const
draws this object for picking
float getShininess() const
returns the current shininess visual value
Definition MRVisualObject.h:237
virtual MRMESH_API size_t heapBytes() const override
returns the amount of memory this object occupies on heap
MRMESH_API void setDirtyFlagsFast_(uint32_t mask)
todo: make virtual and public when all children support separate fast dirty and cache invalidation
MRMESH_API VisualObject()
virtual MRMESH_API std::shared_ptr< Object > clone() const override
MRMESH_API void setVisualizeProperty(bool value, AnyVisualizeMaskEnum type, ViewportMask viewportMask)
set visual property in all viewports specified by the mask
MRMESH_API void resetDirty() const
resets all dirty flags (except for cache flags that will be reset automatically on cache update)
virtual MRMESH_API Box3f getWorldBox(ViewportId={}) const override
virtual ~VisualObject()=default
MRMESH_API bool getVisualizeProperty(AnyVisualizeMaskEnum type, ViewportMask viewportMask) const
returns true if the property is set at least in one viewport specified by the mask
virtual MRMESH_API void setDirtyFlags(uint32_t mask, bool invalidateCaches=true)
virtual MRMESH_API const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const
returns global transparency alpha of object in all viewports
void getAllVisualizePropertiesForEnum(AllVisualizeProperties &properties) const
Derived classes should use this to implement getAllVisualizeProperties().
Definition MRVisualObject.h:347
virtual void setSpecularStrength(float specularStrength)
sets intensity of reflections
Definition MRVisualObject.h:244
virtual MRMESH_API void setBackColor(const Color &color, ViewportId viewportId={})
sets backward color of object in given viewport
virtual std::string classNameInPlural() const override
Definition MRVisualObject.h:131
virtual std::string className() const override
Definition MRVisualObject.h:128
virtual Box3f computeBoundingBox_() const
Definition MRVisualObject.h:331
virtual MRMESH_API bool render(const ModelRenderParams &) const
ViewportProperty< Color > unselectedColor_
Definition MRVisualObject.h:319
bool globalClippedByPlane(ViewportMask viewportMask=ViewportMask::any()) const
returns true if this object or any of its parents is clipped by plane in any of given viewports
Definition MRVisualObject.h:162
virtual MRMESH_API void setAllVisualizeProperties_(const AllVisualizeProperties &properties, std::size_t &pos)
ViewportMask showName_
Definition MRVisualObject.h:307
MRMESH_API void setGlobalClippedByPlane(bool on, ViewportMask viewportMask=ViewportMask::all())
if false deactivates clipped-by-plane for this object and all of its parents, otherwise sets clipped-...
MRMESH_API uint32_t getDirtyFlags() const
returns current dirty flags for the object
Definition MRVisualObject.h:207
MRMESH_API void deserializeFields_(const Json::Value &root) override
virtual MRMESH_API void setBackColorsForAllViewports(ViewportProperty< Color > val)
sets backward color of object in all viewports
virtual const char * typeName() const override
Definition MRVisualObject.h:125
bool showName() const
returns whether object name is shown in any viewport
Definition MRVisualObject.h:170
MRMESH_API const Color & getFrontColor(bool selected=true, ViewportId viewportId={}) const
returns color of object when it is selected/not-selected (depending on argument) in given viewport
virtual MRMESH_API const ViewportProperty< Color > & getBackColorsForAllViewports() const
returns backward color of object in all viewports
float getSpecularStrength() const
returns intensity of reflections
Definition MRVisualObject.h:242
virtual MRMESH_API std::vector< std::string > getInfoLines() const override
return several info lines that can better describe the object in the UI
virtual MRMESH_API void swapBase_(Object &other) override
swaps this object with other
MRMESH_API void copyAllSolidColors(const VisualObject &other)
set all object solid colors (front/back/etc.) from other object for all viewports
virtual MRMESH_API void renderUi(const UiRenderParams &params) const
draws this object for 2d UI
VisualObject(const VisualObject &obj)=default
virtual MRMESH_API void resetDirtyExceptMask(uint32_t mask) const
reset dirty flags without some specific bits (useful for lazy normals update)
virtual MRMESH_API void setGlobalAlphaForAllViewports(ViewportProperty< uint8_t > val)
sets global transparency alpha of object in all viewports
virtual void setupRenderObject_() const
Definition MRVisualObject.h:295
virtual MRMESH_API void setColoringType(ColoringType coloringType)
sets coloring mode of the object with given argument
MRMESH_API Box3f getBoundingBox() const
returns cached bounding box of this object in local coordinates
virtual void setAmbientStrength(float ambientStrength)
sets intensity of non-directional light
Definition MRVisualObject.h:249
bool isPickable(ViewportMask viewportMask=ViewportMask::any()) const
whether the object can be picked (by mouse) in any of given viewports
Definition MRVisualObject.h:226
virtual MRMESH_API const ViewportMask & getVisualizePropertyMask(AnyVisualizeMaskEnum type) const
returns mask of viewports where given property is set
VisualObject(VisualObject &&)=default
virtual MRMESH_API void setGlobalAlpha(uint8_t alpha, ViewportId viewportId={})
sets global transparency alpha of object in given viewport
static constexpr const char * StaticClassNameInPlural() noexcept
Definition MRVisualObject.h:130
void setAllVisualizeProperties(const AllVisualizeProperties &properties)
set all visualize properties masks
Definition MRVisualObject.h:149
void showName(bool on)
shows/hides object name in all viewports
Definition MRVisualObject.h:168
void setAllVisualizePropertiesForEnum(const AllVisualizeProperties &properties, std::size_t &pos)
Derived classes should use this to implement setAllVisualizeProperties().
Definition MRVisualObject.h:340
virtual MRMESH_API void serializeFields_(Json::Value &root) const override
static constexpr const char * StaticClassName() noexcept
Definition MRVisualObject.h:127
UniquePtr< IRenderObject > renderObj_
Definition MRVisualObject.h:301
virtual MRMESH_API AllVisualizeProperties getAllVisualizeProperties() const
get all visualize properties masks
ViewportMask clipByPlane_
Definition MRVisualObject.h:306
MRMESH_API void invalidateMetricsCache_(uint32_t mask)
ViewportProperty< Color > selectedColor_
Definition MRVisualObject.h:318
virtual MRMESH_API void setFrontColorsForAllViewports(ViewportProperty< Color > val, bool selected=true)
sets color of object when it is selected/not-selected (depending on argument) in all viewports
virtual MRMESH_API void setVisualizePropertyMask(AnyVisualizeMaskEnum type, ViewportMask viewportMask)
set visual property mask
ColoringType getColoringType() const
returns the current coloring mode of the object
Definition MRVisualObject.h:231
virtual MRMESH_API void setPickable(bool on, ViewportMask viewportMask=ViewportMask::all())
sets the object as can/cannot be picked (by mouse) in all of given viewports
virtual void setShininess(float shininess)
sets shininess visual value of the object with given argument
Definition MRVisualObject.h:239
virtual MRMESH_API std::shared_ptr< Object > shallowClone() const override
ViewportProperty< Color > backFacesColor_
Definition MRVisualObject.h:320
static constexpr const char * StaticTypeName() noexcept
Definition MRVisualObject.h:124
MRMESH_API const Color & getBackColor(ViewportId viewportId={}) const
returns backward color of object in given viewport
MRMESH_API void toggleVisualizeProperty(AnyVisualizeMaskEnum type, ViewportMask viewportMask)
toggle visual property in all viewports specified by the mask
ViewportMask invertNormals_
invert mesh normals
Definition MRVisualObject.h:309
MRMESH_API void boundingBoxToInfoLines_(std::vector< std::string > &res) const
adds information about bounding box in res
MRMESH_API ViewportMask globalClippedByPlaneMask() const
returns all viewports where this object or any of its parents is clipped by plane
virtual MRMESH_API void resetFrontColor()
reset basic object colors to their default values from the current theme
float getAmbientStrength() const
returns intensity of non-directional light
Definition MRVisualObject.h:247
MRMESH_API const uint8_t & getGlobalAlpha(ViewportId viewportId={}) const
returns global transparency alpha of object in given viewport
Wraps IsVisualizeMaskEnum and adds some sanity checks.
Definition MRVisualObject.h:37
ColoringType
Definition MREnums.h:80
DirtyFlags
Definition MRVisualObject.h:75
std::vector< ViewportMask > AllVisualizeProperties
Definition MRVisualObject.h:72
@ DIRTY_PRIMITIVE_COLORMAP
Definition MRVisualObject.h:87
@ DIRTY_POSITION
Definition MRVisualObject.h:77
@ DIRTY_TEXTURE
Definition MRVisualObject.h:83
@ DIRTY_NONE
Definition MRVisualObject.h:76
@ DIRTY_SELECTION
Definition MRVisualObject.h:82
@ DIRTY_FACES_RENDER_NORMAL
< gl normals
Definition MRVisualObject.h:80
@ DIRTY_MESH
Definition MRVisualObject.h:90
@ DIRTY_FACES_COLORMAP
Definition MRVisualObject.h:88
@ DIRTY_TEXTURE_PER_FACE
Definition MRVisualObject.h:89
@ DIRTY_FACE
Definition MRVisualObject.h:85
@ DIRTY_EDGES_SELECTION
Definition MRVisualObject.h:92
@ DIRTY_VERTS_COLORMAP
Definition MRVisualObject.h:86
@ DIRTY_RENDER_NORMALS
Definition MRVisualObject.h:81
@ DIRTY_BORDER_LINES
Definition MRVisualObject.h:91
@ DIRTY_ALL
Definition MRVisualObject.h:94
@ DIRTY_VOLUME
Definition MRVisualObject.h:93
@ DIRTY_VERTS_RENDER_NORMAL
Definition MRVisualObject.h:79
@ DIRTY_UV
Definition MRVisualObject.h:78
@ DIRTY_PRIMITIVES
Definition MRVisualObject.h:84
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRColor.h:12
Definition MRVisualObject.h:101
Dirty() noexcept=default
uint32_t f
Definition MRVisualObject.h:102
Dirty & operator=(const Dirty &) noexcept
Definition MRVisualObject.h:109
Dirty(Dirty &&) noexcept=default
Definition MRVisualObject.h:32
Definition MRIRenderObject.h:46
Mesh rendering parameters for primary rendering (as opposed to the picker).
Definition MRIRenderObject.h:54
Definition MRObject.h:284
Definition MRIRenderObject.h:110
Definition MRUniquePtr.h:15