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{
26 _count [[maybe_unused]],
27};
28
31template <typename T> struct IsVisualizeMaskEnum : std::false_type {};
32template <> struct IsVisualizeMaskEnum<VisualizeMaskType> : std::true_type {};
33
35template <typename T>
38 std::is_same_v<std::underlying_type_t<T>, int> &&
39 std::is_same_v<T, std::remove_cvref_t<T>>;
40
53{
54 std::type_index type_;
55 int value_ = 0;
56
57public:
58 template <AnyVisualizeMaskEnumType T>
59 AnyVisualizeMaskEnum( T value ) : type_( typeid(T) ), value_( decltype(value_)( value ) ) {}
60
61 template <AnyVisualizeMaskEnumType T>
62 [[nodiscard]] std::optional<T> tryGet() const
63 {
64 if ( type_ == typeid(T) )
65 return T( value_ );
66 else
67 return {};
68 }
69};
70
71using AllVisualizeProperties = std::vector<ViewportMask>;
72
95
99struct Dirty
100{
101 uint32_t f{DIRTY_ALL};
102 operator uint32_t&() { return f; }
103 operator uint32_t() const { return f; }
104
105 Dirty() noexcept = default;
106 Dirty( const Dirty& ) noexcept {}
107 Dirty( Dirty&& ) noexcept = default;
108 Dirty& operator =( const Dirty& ) noexcept { return *this; }
109 Dirty& operator =( Dirty&& ) noexcept = default;
110 Dirty& operator =( uint32_t b ) noexcept { f = b; return *this; }
111};
112
115{
116public:
118
120 VisualObject& operator = ( VisualObject&& ) = default;
121 virtual ~VisualObject() = default;
122
123 constexpr static const char* StaticTypeName() noexcept { return "VisualObject"; }
124 virtual const char* typeName() const override { return StaticTypeName(); }
125
126 constexpr static const char* StaticClassName() noexcept { return "Visual Object"; }
127 virtual std::string className() const override { return StaticClassName(); }
128
129 constexpr static const char* StaticClassNameInPlural() noexcept { return "Visual Objects"; }
130 virtual std::string classNameInPlural() const override { return StaticClassNameInPlural(); }
131
133 [[nodiscard]] MRMESH_API virtual bool supportsVisualizeProperty( AnyVisualizeMaskEnum type ) const;
135 MRMESH_API void setVisualizeProperty( bool value, AnyVisualizeMaskEnum type, ViewportMask viewportMask );
144
149 {
150 std::size_t counter = 0;
151 setAllVisualizeProperties_( properties, counter );
152 }
153
156
159
161 [[nodiscard]] bool globalClippedByPlane( ViewportMask viewportMask = ViewportMask::any() ) const { return !( globalClippedByPlaneMask() & viewportMask ).empty(); }
162
165
167 void showName( bool on ) { return setVisualizeProperty( on, VisualizeMaskType::Name, ViewportMask::all() ); }
169 bool showName() const { return getVisualizeProperty( VisualizeMaskType::Name, ViewportMask::any() ); }
170
172 MRMESH_API const Color& getFrontColor( bool selected = true, ViewportId viewportId = {} ) const;
174 MRMESH_API virtual void setFrontColor( const Color& color, bool selected, ViewportId viewportId = {} );
175
177 MRMESH_API virtual const ViewportProperty<Color>& getFrontColorsForAllViewports( bool selected = true ) const;
179 MRMESH_API virtual void setFrontColorsForAllViewports( ViewportProperty<Color> val, bool selected = true );
180
185
187 MRMESH_API const Color& getBackColor( ViewportId viewportId = {} ) const;
189 MRMESH_API virtual void setBackColor( const Color& color, ViewportId viewportId = {} );
190
192 MRMESH_API const uint8_t& getGlobalAlpha( ViewportId viewportId = {} ) const;
194 MRMESH_API virtual void setGlobalAlpha( uint8_t alpha, ViewportId viewportId = {} );
195
200
204 MRMESH_API virtual void setDirtyFlags( uint32_t mask, bool invalidateCaches = true );
206 MRMESH_API uint32_t getDirtyFlags() const { return dirty_; }
208 MRMESH_API void resetDirty() const;
210 MRMESH_API virtual void resetDirtyExceptMask( uint32_t mask ) const;
211
216 MRMESH_API virtual Box3f getWorldBox( ViewportId = {} ) const override;
218 virtual bool getRedrawFlag( ViewportMask viewportMask ) const override
219 {
220 return Object::getRedrawFlag( viewportMask ) ||
221 ( isVisible( viewportMask ) && dirty_ );
222 }
223
225 bool isPickable( ViewportMask viewportMask = ViewportMask::any() ) const{return !(pickable_ & viewportMask).empty();}
227 MRMESH_API virtual void setPickable( bool on, ViewportMask viewportMask = ViewportMask::all() );
228
231
233 MRMESH_API virtual void setColoringType( ColoringType coloringType );
234
236 float getShininess() const { return shininess_; }
238 virtual void setShininess( float shininess ) { shininess_ = shininess; needRedraw_ = true; }
239
241 float getSpecularStrength() const { return specularStrength_; }
243 virtual void setSpecularStrength( float specularStrength ) { specularStrength_ = specularStrength; needRedraw_ = true; }
244
246 float getAmbientStrength() const { return ambientStrength_; }
248 virtual void setAmbientStrength( float ambientStrength ) { ambientStrength_ = ambientStrength; needRedraw_ = true; }
249
252 MRMESH_API virtual std::shared_ptr<Object> clone() const override;
255 MRMESH_API virtual std::shared_ptr<Object> shallowClone() const override;
256
259 MRMESH_API virtual bool render( const ModelRenderParams& ) const;
261 MRMESH_API virtual void renderForPicker( const ModelBaseRenderParams&, unsigned ) const;
263 MRMESH_API virtual void renderUi( const UiRenderParams& params ) const;
264
267
269 [[nodiscard]] MRMESH_API virtual size_t heapBytes() const override;
271 MRMESH_API virtual std::vector<std::string> getInfoLines() const override;
272
280
284 MRMESH_API virtual void resetColors();
285
286protected:
287 VisualObject( const VisualObject& obj ) = default;
288
290 MRMESH_API virtual void swapBase_( Object& other ) override;
291
294 virtual void setupRenderObject_() const {}
295
297 MRMESH_API void setDirtyFlagsFast_( uint32_t mask );
298 MRMESH_API void invalidateMetricsCache_( uint32_t mask );
299
301
309
310 float shininess_{35.0f};
311 float specularStrength_{ 0.5f };
312 float ambientStrength_{ 0.1f };
313
320
322
324
325 MRMESH_API virtual void serializeFields_( Json::Value& root ) const override;
326
327 MRMESH_API void deserializeFields_( const Json::Value& root ) override;
328
329 virtual Box3f computeBoundingBox_() const { return Box3f(); }
330
332 MRMESH_API void boundingBoxToInfoLines_( std::vector<std::string> & res ) const;
333
334 MRMESH_API virtual void setAllVisualizeProperties_( const AllVisualizeProperties& properties, std::size_t& pos );
335
337 template <AnyVisualizeMaskEnumType T>
338 void setAllVisualizePropertiesForEnum( const AllVisualizeProperties& properties, std::size_t& pos )
339 {
340 for ( int i = 0; i < int( T::_count ); i++ )
341 setVisualizePropertyMask( T( i ), properties[pos++] );
342 }
343
344 template <AnyVisualizeMaskEnumType T>
346 {
347 properties.reserve( properties.size() + std::size_t( T::_count ) );
348 for ( int i = 0; i < int( ( T::_count ) ); i++ )
349 properties.push_back( getVisualizePropertyMask( T( i ) ) );
350 }
351
352private:
353 mutable Dirty dirty_;
354
355 mutable std::optional<Box3f> boundingBoxCache_;
356
358 void setDefaultColors_();
359
361 void setDefaultSceneProperties_();
362};
363
365
366}
#define MRMESH_API
Definition MRMeshFwd.h:80
#define MRMESH_CLASS
Definition MRMeshFwd.h:87
Visibility
Definition MRVisualObject.h:22
ClippedByPlane
Definition MRVisualObject.h:24
Name
Definition MRVisualObject.h:23
DepthTest
Definition MRVisualObject.h:25
Definition MRVisualObject.h:53
AnyVisualizeMaskEnum(T value)
Definition MRVisualObject.h:59
std::optional< T > tryGet() const
Definition MRVisualObject.h:62
virtual bool getRedrawFlag(ViewportMask) const
this method virtual because others data model types could have dirty flags or something
Definition MRObject.h:210
bool needRedraw_
Definition MRObject.h:323
bool isVisible(ViewportMask viewportMask=ViewportMask::any()) const
checks whether the object is visible in any of the viewports specified by the mask (by default in any...
Definition MRObject.h:203
Object()=default
Definition MRViewportId.h:16
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
static ViewportMask any()
Definition MRViewportId.h:50
static ViewportMask all()
mask meaning all or any viewports
Definition MRViewportId.h:49
Definition MRViewportProperty.h:17
virtual void resetFrontColor()
reset basic object colors to their default values from the current theme
virtual void setColoringType(ColoringType coloringType)
sets coloring mode of the object with given argument
virtual 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 void setBackColorsForAllViewports(ViewportProperty< Color > val)
sets backward color of object in all viewports
void resetDirty() const
resets all dirty flags (except for cache flags that will be reset automatically on cache update)
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:218
void invalidateMetricsCache_(uint32_t mask)
VisualObject(ProtectedStruct, const VisualObject &obj)
this ctor is public only for std::make_shared used inside clone()
Definition MRVisualObject.h:266
float getShininess() const
returns the current shininess visual value
Definition MRVisualObject.h:236
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 void setBackColor(const Color &color, ViewportId viewportId={})
sets backward color of object in given viewport
ColoringType coloringType_
non - directional light intensity
Definition MRVisualObject.h:315
virtual ~VisualObject()=default
virtual 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
ViewportMask depthTest_
Definition MRVisualObject.h:308
ViewportMask & getVisualizePropertyMask_(AnyVisualizeMaskEnum type)
ViewportMask pickable_
enable picking by gl
Definition MRVisualObject.h:307
void getAllVisualizePropertiesForEnum(AllVisualizeProperties &properties) const
Derived classes should use this to implement getAllVisualizeProperties().
Definition MRVisualObject.h:345
virtual void setSpecularStrength(float specularStrength)
sets intensity of reflections
Definition MRVisualObject.h:243
virtual size_t heapBytes() const override
returns the amount of memory this object occupies on heap
virtual std::string classNameInPlural() const override
Definition MRVisualObject.h:130
virtual std::string className() const override
Definition MRVisualObject.h:127
const uint8_t & getGlobalAlpha(ViewportId viewportId={}) const
returns global transparency alpha of object in given viewport
virtual void setGlobalAlphaForAllViewports(ViewportProperty< uint8_t > val)
sets global transparency alpha of object in all viewports
virtual Box3f computeBoundingBox_() const
Definition MRVisualObject.h:329
virtual std::vector< std::string > getInfoLines() const override
return several info lines that can better describe the object in the UI
void boundingBoxToInfoLines_(std::vector< std::string > &res) const
adds information about bounding box in res
float ambientStrength_
reflection intensity
Definition MRVisualObject.h:312
ViewportProperty< Color > unselectedColor_
Definition MRVisualObject.h:317
virtual AllVisualizeProperties getAllVisualizeProperties() const
get all visualize properties masks
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:161
virtual void renderUi(const UiRenderParams &params) const
draws this object for 2d UI
ViewportMask globalClippedByPlaneMask() const
returns all viewports where this object or any of its parents is clipped by plane
ViewportMask showName_
Definition MRVisualObject.h:306
virtual bool render(const ModelRenderParams &) const
void setUseDefaultScenePropertiesOnDeserialization(bool useDefaultScenePropertiesOnDeserialization)
Definition MRVisualObject.h:278
void copyAllSolidColors(const VisualObject &other)
set all object solid colors (front/back/etc.) from other object for all viewports
virtual void setVisualizePropertyMask(AnyVisualizeMaskEnum type, ViewportMask viewportMask)
set visual property mask
virtual 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 const char * typeName() const override
Definition MRVisualObject.h:124
bool showName() const
returns whether object name is shown in any viewport
Definition MRVisualObject.h:169
virtual void resetColors()
reset all object colors to their default values from the current theme
float getSpecularStrength() const
returns intensity of reflections
Definition MRVisualObject.h:241
VisualObject(const VisualObject &obj)=default
void toggleVisualizeProperty(AnyVisualizeMaskEnum type, ViewportMask viewportMask)
toggle visual property in all viewports specified by the mask
Box3f getBoundingBox() const
returns cached bounding box of this object in local coordinates
virtual void setDirtyFlags(uint32_t mask, bool invalidateCaches=true)
virtual const ViewportMask & getVisualizePropertyMask(AnyVisualizeMaskEnum type) const
returns mask of viewports where given property is set
float shininess_
specular exponent
Definition MRVisualObject.h:310
bool getVisualizeProperty(AnyVisualizeMaskEnum type, ViewportMask viewportMask) const
returns true if the property is set at least in one viewport specified by the mask
virtual void setupRenderObject_() const
Definition MRVisualObject.h:294
uint32_t getDirtyFlags() const
returns current dirty flags for the object
Definition MRVisualObject.h:206
virtual void setGlobalAlpha(uint8_t alpha, ViewportId viewportId={})
sets global transparency alpha of object in given viewport
virtual const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const
returns global transparency alpha of object in all viewports
virtual void setAmbientStrength(float ambientStrength)
sets intensity of non-directional light
Definition MRVisualObject.h:248
bool isPickable(ViewportMask viewportMask=ViewportMask::any()) const
whether the object can be picked (by mouse) in any of given viewports
Definition MRVisualObject.h:225
VisualObject(VisualObject &&)=default
ViewportProperty< uint8_t > globalAlpha_
Definition MRVisualObject.h:319
static constexpr const char * StaticClassNameInPlural() noexcept
Definition MRVisualObject.h:129
void setVisualizeProperty(bool value, AnyVisualizeMaskEnum type, ViewportMask viewportMask)
set visual property in all viewports specified by the mask
virtual void swapBase_(Object &other) override
swaps this object with other
virtual void serializeFields_(Json::Value &root) const override
void setAllVisualizeProperties(const AllVisualizeProperties &properties)
set all visualize properties masks
Definition MRVisualObject.h:148
void showName(bool on)
shows/hides object name in all viewports
Definition MRVisualObject.h:167
virtual void setPickable(bool on, ViewportMask viewportMask=ViewportMask::all())
sets the object as can/cannot be picked (by mouse) in all of given viewports
void setAllVisualizePropertiesForEnum(const AllVisualizeProperties &properties, std::size_t &pos)
Derived classes should use this to implement setAllVisualizeProperties().
Definition MRVisualObject.h:338
const Color & getBackColor(ViewportId viewportId={}) const
returns backward color of object in given viewport
virtual void renderForPicker(const ModelBaseRenderParams &, unsigned) const
draws this object for picking
static constexpr const char * StaticClassName() noexcept
Definition MRVisualObject.h:126
UniquePtr< IRenderObject > renderObj_
Definition MRVisualObject.h:300
virtual void resetDirtyExceptMask(uint32_t mask) const
reset dirty flags without some specific bits (useful for lazy normals update)
float specularStrength_
Definition MRVisualObject.h:311
ViewportMask clipByPlane_
Definition MRVisualObject.h:305
bool useDefaultScenePropertiesOnDeserialization() const
Definition MRVisualObject.h:275
virtual const ViewportProperty< Color > & getBackColorsForAllViewports() const
returns backward color of object in all viewports
ViewportProperty< Color > selectedColor_
Definition MRVisualObject.h:316
virtual void setAllVisualizeProperties_(const AllVisualizeProperties &properties, std::size_t &pos)
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-...
ColoringType getColoringType() const
returns the current coloring mode of the object
Definition MRVisualObject.h:230
void setDirtyFlagsFast_(uint32_t mask)
todo: make virtual and public when all children support separate fast dirty and cache invalidation
virtual void setShininess(float shininess)
sets shininess visual value of the object with given argument
Definition MRVisualObject.h:238
virtual std::shared_ptr< Object > shallowClone() const override
ViewportProperty< Color > backFacesColor_
Definition MRVisualObject.h:318
void deserializeFields_(const Json::Value &root) override
static constexpr const char * StaticTypeName() noexcept
Definition MRVisualObject.h:123
bool useDefaultScenePropertiesOnDeserialization_
Definition MRVisualObject.h:321
virtual bool supportsVisualizeProperty(AnyVisualizeMaskEnum type) const
Returns true if this class supports the property type. Otherwise passing it to the functions below is...
virtual Box3f getWorldBox(ViewportId={}) const override
virtual std::shared_ptr< Object > clone() const override
float getAmbientStrength() const
returns intensity of non-directional light
Definition MRVisualObject.h:246
Wraps IsVisualizeMaskEnum and adds some sanity checks.
Definition MRVisualObject.h:36
ColoringType
Definition MREnums.h:86
_count
If true, show additional details on the name tag, such as point coordinates. Not all features use thi...
Definition MRFeatureObject.h:90
@ other
Angle, normally float. Measure in radians.
Definition MRFeatureObject.h:27
@ SolidColor
Use one color for whole object.
Definition MREnums.h:87
DirtyFlags
Definition MRVisualObject.h:74
std::vector< ViewportMask > AllVisualizeProperties
Definition MRVisualObject.h:71
@ DIRTY_PRIMITIVE_COLORMAP
Definition MRVisualObject.h:86
@ DIRTY_POSITION
Definition MRVisualObject.h:76
@ DIRTY_TEXTURE
Definition MRVisualObject.h:82
@ DIRTY_NONE
Definition MRVisualObject.h:75
@ DIRTY_SELECTION
Definition MRVisualObject.h:81
@ DIRTY_FACES_RENDER_NORMAL
< gl normals
Definition MRVisualObject.h:79
@ DIRTY_MESH
Definition MRVisualObject.h:89
@ DIRTY_FACES_COLORMAP
Definition MRVisualObject.h:87
@ DIRTY_TEXTURE_PER_FACE
Definition MRVisualObject.h:88
@ DIRTY_FACE
Definition MRVisualObject.h:84
@ DIRTY_EDGES_SELECTION
Definition MRVisualObject.h:91
@ DIRTY_VERTS_COLORMAP
Definition MRVisualObject.h:85
@ DIRTY_RENDER_NORMALS
Definition MRVisualObject.h:80
@ DIRTY_BORDER_LINES
Definition MRVisualObject.h:90
@ DIRTY_ALL
Definition MRVisualObject.h:93
@ DIRTY_VOLUME
Definition MRVisualObject.h:92
@ DIRTY_VERTS_RENDER_NORMAL
Definition MRVisualObject.h:78
@ DIRTY_UV
Definition MRVisualObject.h:77
@ DIRTY_PRIMITIVES
Definition MRVisualObject.h:83
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRColor.h:12
Definition MRVisualObject.h:100
Dirty() noexcept=default
uint32_t f
Definition MRVisualObject.h:101
Dirty & operator=(const Dirty &) noexcept
Definition MRVisualObject.h:108
Dirty(Dirty &&) noexcept=default
Definition MRVisualObject.h:31
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