MeshLib C++ Docs
Loading...
Searching...
No Matches
MRFeatureObject.h
Go to the documentation of this file.
1#pragma once
3#include "MRMeshFwd.h"
4
5#include "MRVector3.h"
6
7#include <cassert>
8#include <variant>
9
10namespace MR
11{
14
15
16using FeaturesPropertyTypesVariant = std::variant<float, Vector3f>;
17
18class FeatureObject;
19
29
39{
40 std::string propertyName;
43 std::function<FeaturesPropertyTypesVariant( const FeatureObject* objectToInvoke, ViewportId id )> getter;
46 std::function<void( const FeaturesPropertyTypesVariant&, FeatureObject* objectToInvoke, ViewportId id )> setter;
47
48 template <typename T, typename C, typename SetterFunc>
50 std::string name,
52 T( C::* m_getter )( ViewportId ) const,
53 SetterFunc m_setter
54 )
55 : propertyName( std::move( name ) ),
56 kind( kind ),
57 getter( [m_getter] ( const FeatureObject* objectToInvoke, ViewportId id ) -> FeaturesPropertyTypesVariant
58 {
59 return std::invoke( m_getter, dynamic_cast< const C* >( objectToInvoke ), id );
60 } )
61 {
62 if constexpr ( ( std::is_same_v<SetterFunc, void ( C::* )( const T&, ViewportId )> )
63 || ( std::is_same_v<SetterFunc, void ( C::* )( T, ViewportId )> ) )
64 {
65 setter = [m_setter] ( const FeaturesPropertyTypesVariant& v, FeatureObject* objectToInvoke, ViewportId id )
66 {
67 assert( std::holds_alternative<T>( v ) );
68 if ( std::holds_alternative<T>( v ) )
69 {
70 std::invoke( m_setter, dynamic_cast< C* > ( objectToInvoke ), std::get<T>( v ), id );
71 }
72 };
73 }
74 else
75 {
76 static_assert( dependent_false<T>, "Setter function signature unsupported" );
77 }
78 }
79};
80
82 Vector3f point;
83 std::optional<Vector3f> normal;
84};
85
86enum class MRMESH_CLASS FeatureVisualizePropertyType
87{
90 _count [[maybe_unused]],
91};
92template <> struct IsVisualizeMaskEnum<FeatureVisualizePropertyType> : std::true_type {};
93
96{
97public:
98 constexpr static const char* StaticTypeName() noexcept { return "FeatureObject"; }
99 virtual const char* typeName() const override { return StaticTypeName(); }
100
101 constexpr static const char* StaticClassName() noexcept { return "Feature"; }
102 virtual std::string className() const override { return StaticClassName(); }
103
104 constexpr static const char* StaticClassNameInPlural() noexcept { return "Features"; }
105 virtual std::string classNameInPlural() const override { return StaticClassNameInPlural(); }
106
108 virtual const std::vector<FeatureObjectSharedProperty>& getAllSharedProperties() const = 0;
109
110 [[nodiscard]] MRMESH_API bool supportsVisualizeProperty( AnyVisualizeMaskEnum type ) const override;
113
114 MRMESH_API void serializeFields_( Json::Value& root ) const override;
115 MRMESH_API void deserializeFields_( const Json::Value& root ) override;
116
117
120 [[nodiscard]] virtual FeatureObjectProjectPointResult projectPoint( const Vector3f& point, ViewportId id = {} ) const = 0;
121 [[nodiscard]] MRMESH_API std::optional<Vector3f> getNormal( const Vector3f& point ) const;
122
123 MRMESH_API void setXf( const AffineXf3f& xf, ViewportId id = {} ) override;
124 MRMESH_API void resetXf( ViewportId id = {} ) override;
125
127 [[nodiscard]] MRMESH_API virtual Vector3f getBasePoint( ViewportId id = {} ) const;
128
131 [[nodiscard]] Matrix3f getRotationMatrix( ViewportId id = {}, bool* isDef = nullptr ) const { return r_.get( id, isDef ); }
134 [[nodiscard]] Matrix3f getScaleShearMatrix( ViewportId id = {}, bool* isDef = nullptr ) const { return s_.get( id, isDef ); }
135
138 MRMESH_API const Color& getDecorationsColor( bool selected, ViewportId viewportId = {}, bool* isDef = nullptr ) const;
139 MRMESH_API virtual void setDecorationsColor( const Color& color, bool selected, ViewportId viewportId = {} );
142
144 [[nodiscard]] MRMESH_API virtual float getPointSize() const;
145 [[nodiscard]] MRMESH_API virtual float getLineWidth() const;
146 MRMESH_API virtual void setPointSize( float pointSize );
147 MRMESH_API virtual void setLineWidth( float lineWidth );
148
150 [[nodiscard]] MRMESH_API virtual float getSubfeaturePointSize() const;
151 [[nodiscard]] MRMESH_API virtual float getSubfeatureLineWidth() const;
152 MRMESH_API virtual void setSubfeaturePointSize( float pointSize );
153 MRMESH_API virtual void setSubfeatureLineWidth( float lineWidth );
154
156 [[nodiscard]] MRMESH_API virtual float getMainFeatureAlpha() const;
157 [[nodiscard]] MRMESH_API virtual float getSubfeatureAlphaPoints() const;
158 [[nodiscard]] MRMESH_API virtual float getSubfeatureAlphaLines() const;
159 [[nodiscard]] MRMESH_API virtual float getSubfeatureAlphaMesh() const;
160 MRMESH_API virtual void setMainFeatureAlpha( float alpha );
161 MRMESH_API virtual void setSubfeatureAlphaPoints( float alpha );
162 MRMESH_API virtual void setSubfeatureAlphaLines( float alpha );
163 MRMESH_API virtual void setSubfeatureAlphaMesh( float alpha );
164
165protected:
167 MRMESH_API FeatureObject( int numDimensions );
168
169 MRMESH_API void setAllVisualizeProperties_( const AllVisualizeProperties& properties, std::size_t& pos ) override;
170
173
178
180 std::array<ViewportProperty<Color>, 2> decorationsColor_;
181
183
185 float pointSize_ = 10;
186 float lineWidth_ = 2;
187
189 float subPointSize_ = 6;
190 float subLineWidth_ = 1;
191
195 float subAlphaLines_ = 1;
196 float subAlphaMesh_ = 0.5f;
197};
198
199}
#define MRMESH_API
Definition MRMeshFwd.h:80
#define MRMESH_CLASS
Definition MRMeshFwd.h:87
Definition MRVisualObject.h:53
An interface class which allows feature objects to share setters and getters on their main properties...
Definition MRFeatureObject.h:96
const AffineXf3f & xf(ViewportId id={}, bool *isDef=nullptr) const
Definition MRObject.h:107
Definition MRViewportId.h:16
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
static ViewportMask all()
mask meaning all or any viewports
Definition MRViewportId.h:49
Definition MRViewportProperty.h:17
static constexpr const char * StaticClassNameInPlural() noexcept
Definition MRFeatureObject.h:104
ImVec2 position(const ViewportRectangle &rect)
Definition MRViewport.h:27
virtual void setSubfeatureAlphaMesh(float alpha)
std::optional< Vector3f > getNormal(const Vector3f &point) const
virtual float getSubfeatureAlphaMesh() const
std::array< ViewportProperty< Color >, 2 > decorationsColor_
scale
Definition MRFeatureObject.h:180
virtual void setPointSize(float pointSize)
bool supportsVisualizeProperty(AnyVisualizeMaskEnum type) const override
Returns true if this class supports the property type. Otherwise passing it to the functions below is...
virtual float getLineWidth() const
virtual float getSubfeatureAlphaPoints() const
virtual const ViewportProperty< Color > & getDecorationsColorForAllViewports(bool selected) const
const Color & getDecorationsColor(bool selected, ViewportId viewportId={}, bool *isDef=nullptr) const
FeaturePropertyKind
Classifies FeatureObjectSharedProperty, mostly for informational purposes.
Definition MRFeatureObject.h:22
float subPointSize_
Point size and line width, for subfeatures rather than primary rendering.
Definition MRFeatureObject.h:189
float lineWidth_
Definition MRFeatureObject.h:186
std::optional< Vector3f > normal
Definition MRFeatureObject.h:83
virtual void setLineWidth(float lineWidth)
void setXf(const AffineXf3f &xf, ViewportId id={}) override
virtual const char * typeName() const override
Definition MRFeatureObject.h:99
std::variant< float, Vector3f > FeaturesPropertyTypesVariant
Definition MRFeatureObject.h:16
Matrix3f getScaleShearMatrix(ViewportId id={}, bool *isDef=nullptr) const
Definition MRFeatureObject.h:134
virtual void setSubfeaturePointSize(float pointSize)
float mainFeatureAlpha_
Per-component alpha multipliers. The global alpha is multiplied by thise.
Definition MRFeatureObject.h:193
virtual void setSubfeatureLineWidth(float lineWidth)
std::function< FeaturesPropertyTypesVariant(const FeatureObject *objectToInvoke, ViewportId id)> getter
due to getAllSharedProperties in FeatureObject returns static vector, we need externaly setup object ...
Definition MRFeatureObject.h:43
static constexpr const char * StaticTypeName() noexcept
Definition MRFeatureObject.h:98
virtual const std::vector< FeatureObjectSharedProperty > & getAllSharedProperties() const =0
Create and generate list of bounded getters and setters for the main properties of feature object,...
_count
If true, show additional details on the name tag, such as point coordinates. Not all features use thi...
Definition MRFeatureObject.h:90
const ViewportMask & getVisualizePropertyMask(AnyVisualizeMaskEnum type) const override
returns mask of viewports where given property is set
virtual void setMainFeatureAlpha(float alpha)
void setAllVisualizeProperties_(const AllVisualizeProperties &properties, std::size_t &pos) override
AllVisualizeProperties getAllVisualizeProperties() const override
get all visualize properties masks
virtual void setDecorationsColorForAllViewports(ViewportProperty< Color > val, bool selected)
std::function< void(const FeaturesPropertyTypesVariant &, FeatureObject *objectToInvoke, ViewportId id)> setter
Definition MRFeatureObject.h:46
virtual std::string classNameInPlural() const override
Definition MRFeatureObject.h:105
DetailsOnNameTag
Definition MRFeatureObject.h:89
virtual void setSubfeatureAlphaPoints(float alpha)
Subfeatures
Definition MRFeatureObject.h:88
void deserializeFields_(const Json::Value &root) override
std::string propertyName
Definition MRFeatureObject.h:40
virtual float getSubfeatureLineWidth() const
virtual void setDecorationsColor(const Color &color, bool selected, ViewportId viewportId={})
Matrix3f getRotationMatrix(ViewportId id={}, bool *isDef=nullptr) const
Definition MRFeatureObject.h:131
virtual std::string className() const override
Definition MRFeatureObject.h:102
void serializeFields_(Json::Value &root) const override
virtual float getPointSize() const
Point size and line width, for primary rendering rather than subfeatures.
void resetXf(ViewportId id={}) override
forgets specific transform in given viewport (or forgets all specific transforms for {}...
Vector3f point
Definition MRFeatureObject.h:82
virtual float getSubfeaturePointSize() const
Point size and line width, for subfeatures rather than primary rendering.
ViewportProperty< Matrix3f > s_
rotation
Definition MRFeatureObject.h:177
virtual void setSubfeatureAlphaLines(float alpha)
FeatureObjectSharedProperty(std::string name, FeaturePropertyKind kind, T(C::*m_getter)(ViewportId) const, SetterFunc m_setter)
Definition MRFeatureObject.h:49
ViewportMask subfeatureVisibility_
Definition MRFeatureObject.h:171
virtual float getMainFeatureAlpha() const
Per-component alpha multipliers. The global alpha is multiplied by thise.
FeatureObject(int numDimensions)
numDimensions is 0 for points, 1 for lines, 2 for surface meshes. We don't use 3 at the moment.
constexpr bool dependent_false
Definition MRMeshFwd.h:782
ViewportMask detailsOnNameTag_
Definition MRFeatureObject.h:172
static constexpr const char * StaticClassName() noexcept
Definition MRFeatureObject.h:101
float subLineWidth_
Definition MRFeatureObject.h:190
ViewportProperty< Matrix3f > r_
Definition MRFeatureObject.h:176
virtual float getSubfeatureAlphaLines() const
virtual FeatureObjectProjectPointResult projectPoint(const Vector3f &point, ViewportId id={}) const =0
float subAlphaPoints_
Definition MRFeatureObject.h:194
float pointSize_
Those apply only to some features:
Definition MRFeatureObject.h:185
FeaturePropertyKind kind
Definition MRFeatureObject.h:41
float subAlphaLines_
Definition MRFeatureObject.h:195
virtual Vector3f getBasePoint(ViewportId id={}) const
Returns point considered as base for the feature.
float subAlphaMesh_
Definition MRFeatureObject.h:196
@ linearDimension
Position, normally Vector3f.
Definition MRFeatureObject.h:24
@ other
Angle, normally float. Measure in radians.
Definition MRFeatureObject.h:27
@ angle
Direction, normally Vector3f.
Definition MRFeatureObject.h:26
@ direction
Length or size.
Definition MRFeatureObject.h:25
std::vector< ViewportMask > AllVisualizeProperties
Definition MRVisualObject.h:71
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRColor.h:12
Definition MRFeatureObject.h:81
Definition MRVisualObject.h:31