MeshLib C++ Docs
Loading...
Searching...
No Matches
MRRenderFeatureObjects.h
Go to the documentation of this file.
1#pragma once
2
13
15{
16
17namespace detail
18{
19 // See `WrappedModelSubobject` below. This class holds optional components for it that depend on the template parameter.
20 template <bool IsPrimary, typename BaseObjectType>
21 class WrappedModelSubobjectPart : public BaseObjectType {};
22
23 template <bool IsPrimary>
24 class WrappedModelSubobjectPart<IsPrimary, ObjectPoints> : public ObjectPoints, public virtual RenderWrapObject::BasicWrapperTarget<FeatureObject>
25 {
26 public:
27 float getPointSize() const override
28 {
29 const_cast<WrappedModelSubobjectPart &>( *this ).setPointSize( IsPrimary ? target_->getPointSize() : target_->getSubfeaturePointSize() );
31 }
32
34 {
35 if ( !IsPrimary )
36 const_cast<WrappedModelSubobjectPart &>( *this ).setGlobalAlpha( (std::uint8_t)std::clamp( int( target_->getGlobalAlpha() * target_->getSubfeatureAlphaPoints() ), 0, 255 ) );
38 }
39 };
40
41 template <bool IsPrimary>
42 class WrappedModelSubobjectPart<IsPrimary, ObjectLines> : public ObjectLines, public virtual RenderWrapObject::BasicWrapperTarget<FeatureObject>
43 {
44 public:
45 float getLineWidth() const override
46 {
47 const_cast<WrappedModelSubobjectPart &>( *this ).setLineWidth( IsPrimary ? target_->getLineWidth() : target_->getSubfeatureLineWidth() );
49 }
50
52 {
53 if ( !IsPrimary )
54 const_cast<WrappedModelSubobjectPart &>( *this ).setGlobalAlpha( (std::uint8_t)std::clamp( int( target_->getGlobalAlpha() * target_->getSubfeatureAlphaLines() ), 0, 255 ) );
56 }
57 };
58
59 template <bool IsPrimary>
60 class WrappedModelSubobjectPart<IsPrimary, ObjectMesh> : public ObjectMesh, public virtual RenderWrapObject::BasicWrapperTarget<FeatureObject>
61 {
62 public:
64 {
65 if ( !IsPrimary )
66 const_cast<WrappedModelSubobjectPart &>( *this ).setGlobalAlpha( (std::uint8_t)std::clamp( int( target_->getGlobalAlpha() * target_->getSubfeatureAlphaMesh() ), 0, 255 ) );
68 }
69 };
70
71 template <bool IsPrimary, typename BaseObjectType>
72 class WrappedModelSubobjectBase : public detail::WrappedModelSubobjectPart<IsPrimary, BaseObjectType>, public virtual RenderWrapObject::BasicWrapperTarget<FeatureObject>
73 {
74 public:
75 bool isSelected() const override
76 {
77 return target_->isSelected();
78 }
79
81 {
82 if ( auto value = type.tryGet<VisualizeMaskType>(); value && *value == VisualizeMaskType::ClippedByPlane )
83 return const_cast<ViewportMask&>( clipByPlane_ ) = target_->globalClippedByPlaneMask();
85 }
86
87 protected:
88 using detail::WrappedModelSubobjectPart<IsPrimary, BaseObjectType>::clipByPlane_;
89 };
90
91}
92
93// Wraps a datamodel object to override some of its visual properties.
94// This is used for stub datamodel objects that we store inside of renderobjects to provide them with models (aka visualization data: meshes, etc).
95// The base template handles `IsPrimary == true`. We have a specialization below for `false`.
96template <bool IsPrimary, typename BaseObjectType>
97class WrappedModelSubobject : public detail::WrappedModelSubobjectBase<IsPrimary, BaseObjectType>
98{
99public:
100 using detail::WrappedModelSubobjectBase<IsPrimary, BaseObjectType>::target_;
101
102 const ViewportProperty<Color>& getFrontColorsForAllViewports( bool selected = true ) const override
103 {
104 return target_->getFrontColorsForAllViewports( selected );
105 }
106
108 {
109 return target_->getBackColorsForAllViewports();
110 }
111
113 {
114 if ( IsPrimary )
115 const_cast<WrappedModelSubobject &>( *this ).setGlobalAlpha( (std::uint8_t)std::clamp( int( target_->getGlobalAlpha() * target_->getMainFeatureAlpha() ), 0, 255 ) );
117 }
118};
119
120template <typename BaseObjectType>
121class WrappedModelSubobject<false, BaseObjectType> : public detail::WrappedModelSubobjectBase<false, BaseObjectType>
122{
123public:
124 using detail::WrappedModelSubobjectBase<false, BaseObjectType>::target_;
125
127 {
128 if ( auto p = this->parent() )
129 {
130 if ( auto f = dynamic_cast<const FeatureObject*>( p ) )
131 const_cast<WrappedModelSubobject &>( *this ).setVisibilityMask( f->getVisualizePropertyMask( FeatureVisualizePropertyType::Subfeatures ) );
132 }
133
134 return this->visibilityMask_;
135 }
136
137 const ViewportProperty<Color>& getFrontColorsForAllViewports( bool selected = true ) const override
138 {
139 return dynamic_cast<const FeatureObject&>( *target_ ).getDecorationsColorForAllViewports( selected );
140 }
141};
142
143// A common base class for sub-renderobjects that are combined into the proper features.
144// `ObjectType` is the underlying datamodel object that stores the mesh, e.g. `ObjectMesh`.
145// `RenderObjectType` is the underlying render object, e.g. `RenderMeshObject`.
146// If `IsPrimary` is true, the visual properties are copied from the target datamodel object.
147template <bool IsPrimary, typename ObjectType, typename RenderObjectType>
148class RenderFeatureComponent : public RenderWrapObject::Wrapper<WrappedModelSubobject<IsPrimary, ObjectType>, RenderObjectType>
149{
151public:
152 using Base::Base;
153
154 bool shouldRender( ViewportId viewportId ) const
155 {
156 // Skip rendering the secondary components (aka subfeatures) if they are disabled.
157 if constexpr ( !IsPrimary )
158 {
159 if ( !this->subobject.target_->getVisualizeProperty( FeatureVisualizePropertyType::Subfeatures, viewportId ) )
160 return false;
161 }
162 return true;
163 }
164
165 bool render( const ModelRenderParams& params ) override
166 {
167 if ( !shouldRender( params.viewportId ) )
168 return false;
169 return Base::render( params );
170 }
171
172 void renderPicker( const ModelBaseRenderParams& params, unsigned geomId ) override
173 {
174 if ( !shouldRender( params.viewportId ) )
175 return;
176 return Base::renderPicker( params, geomId );
177 }
178};
179
180// This renderobject draws custom points.
181// If `IsPrimary` is true, the visual properties are copied from the target datamodel object.
182template <bool IsPrimary>
183class RenderFeaturePointsComponent : public RenderFeatureComponent<IsPrimary, ObjectPoints, RenderPointsObject>
184{
186public:
187 using Base::Base;
188 auto& getPoints() { return Base::subobject; }
189};
190
191// This renderobject draws custom lines.
192// If `IsPrimary` is true, the visual properties are copied from the target datamodel object.
193template <bool IsPrimary>
194class RenderFeatureLinesComponent : public RenderFeatureComponent<IsPrimary, ObjectLines, RenderLinesObject>
195{
197public:
198 using Base::Base;
199 auto& getLines() { return Base::subobject; }
200};
201
202// This renderobject draws a custom mesh.
203// If `IsPrimary` is true, the visual properties are copied from the target datamodel object.
204template <bool IsPrimary>
205class RenderFeatureMeshComponent : public RenderFeatureComponent<IsPrimary, ObjectMesh, RenderMeshObject>
206{
208public:
209 using Base::Base;
210 auto& getMesh() { return Base::subobject; }
211};
212
213
214// This renderobject draws a plane normal for the target object.
216{
217public:
218 MRVIEWER_API RenderPlaneNormalComponent( const VisualObject& object );
219
220 MRVIEWER_API bool render( const ModelRenderParams& params ) override;
221 MRVIEWER_API void renderPicker( const ModelBaseRenderParams& params, unsigned geomId ) override;
222};
223
224class RenderPointFeatureObject : public RenderObjectCombinator<RenderDefaultUiObject, RenderFeaturePointsComponent<true>, RenderResetDirtyComponent>
225{
226public:
227 MRVIEWER_API RenderPointFeatureObject( const VisualObject& object );
228
229 MRVIEWER_API ImGuiMeasurementIndicators::Text getObjectNameText( const VisualObject& object, ViewportId viewportId ) const override;
230};
231
232class RenderLineFeatureObject : public RenderObjectCombinator<RenderDefaultUiObject, RenderFeatureLinesComponent<true>, RenderResetDirtyComponent>
233{
234public:
235 MRVIEWER_API RenderLineFeatureObject( const VisualObject& object );
236
237 MRVIEWER_API ImGuiMeasurementIndicators::Text getObjectNameText( const VisualObject& object, ViewportId viewportId ) const override;
238};
239
240class RenderCircleFeatureObject : public RenderObjectCombinator<RenderDefaultUiObject, RenderFeatureLinesComponent<true>, RenderFeaturePointsComponent<false>, RenderResetDirtyComponent>
241{
242 const VisualObject* object_ = nullptr;
244public:
245 MRVIEWER_API RenderCircleFeatureObject( const VisualObject& object );
246 MRVIEWER_API void renderUi( const UiRenderParams& params ) override;
247};
248
250 : public RenderObjectCombinator<
251 RenderDefaultUiObject,
252 // Main mesh.
253 RenderFeatureMeshComponent<true>,
254 // Subfeatures.
255 RenderFeatureLinesComponent<false>, RenderFeaturePointsComponent<false>,
256 // Normal mesh.
257 RenderPlaneNormalComponent,
258 RenderResetDirtyComponent
259 >
260{
261public:
262 MRVIEWER_API RenderPlaneFeatureObject( const VisualObject& object );
263
264 MRVIEWER_API ImGuiMeasurementIndicators::Text getObjectNameText( const VisualObject& object, ViewportId viewportId ) const override;
265};
266
267class RenderSphereFeatureObject : public RenderObjectCombinator<RenderDefaultUiObject, RenderFeatureMeshComponent<true>, RenderFeaturePointsComponent<false>, RenderResetDirtyComponent>
268{
269 const VisualObject* object_ = nullptr;
271public:
272 MRVIEWER_API RenderSphereFeatureObject( const VisualObject& object );
273 MRVIEWER_API void renderUi( const UiRenderParams& params ) override;
274};
275
276class RenderCylinderFeatureObject : public RenderObjectCombinator<RenderDefaultUiObject, RenderFeatureMeshComponent<true>, RenderFeatureLinesComponent<false>, RenderFeaturePointsComponent<false>, RenderResetDirtyComponent>
277{
278 const VisualObject* object_ = nullptr;
281public:
282 MRVIEWER_API RenderCylinderFeatureObject( const VisualObject& object );
283 MRVIEWER_API void renderUi( const UiRenderParams& params ) override;
284};
285
286class RenderConeFeatureObject : public RenderObjectCombinator<RenderDefaultUiObject, RenderFeatureMeshComponent<true>, RenderFeatureLinesComponent<false>, RenderFeaturePointsComponent<false>, RenderResetDirtyComponent>
287{
288 const VisualObject* object_ = nullptr;
292public:
293 MRVIEWER_API RenderConeFeatureObject( const VisualObject& object );
294 MRVIEWER_API void renderUi( const UiRenderParams& params ) override;
295};
296
297}
Definition MRVisualObject.h:54
std::optional< T > tryGet() const
Definition MRVisualObject.h:63
An interface class which allows feature objects to share setters and getters on their main properties...
Definition MRFeatureObject.h:93
virtual MRMESH_API const ViewportProperty< Color > & getDecorationsColorForAllViewports(bool selected) const
virtual float getLineWidth() const
Definition MRObjectLinesHolder.h:59
Definition MRObjectLines.h:11
Definition MRObjectMesh.h:11
virtual float getPointSize() const
returns size of points on screen in pixels
Definition MRObjectPointsHolder.h:96
Definition MRObjectPoints.h:11
Definition MRRenderDimensions.h:136
Definition MRRenderDimensions.h:172
Definition MRRenderDimensions.h:102
Definition MRRenderFeatureObjects.h:241
MRVIEWER_API void renderUi(const UiRenderParams &params) override
MRVIEWER_API RenderCircleFeatureObject(const VisualObject &object)
Definition MRRenderFeatureObjects.h:287
MRVIEWER_API void renderUi(const UiRenderParams &params) override
MRVIEWER_API RenderConeFeatureObject(const VisualObject &object)
Definition MRRenderFeatureObjects.h:277
MRVIEWER_API void renderUi(const UiRenderParams &params) override
MRVIEWER_API RenderCylinderFeatureObject(const VisualObject &object)
Definition MRRenderFeatureObjects.h:149
void renderPicker(const ModelBaseRenderParams &params, unsigned geomId) override
Definition MRRenderFeatureObjects.h:172
bool render(const ModelRenderParams &params) override
Definition MRRenderFeatureObjects.h:165
bool shouldRender(ViewportId viewportId) const
Definition MRRenderFeatureObjects.h:154
Definition MRRenderFeatureObjects.h:195
auto & getLines()
Definition MRRenderFeatureObjects.h:199
Definition MRRenderFeatureObjects.h:206
auto & getMesh()
Definition MRRenderFeatureObjects.h:210
Definition MRRenderFeatureObjects.h:184
auto & getPoints()
Definition MRRenderFeatureObjects.h:188
Definition MRRenderFeatureObjects.h:233
MRVIEWER_API RenderLineFeatureObject(const VisualObject &object)
MRVIEWER_API ImGuiMeasurementIndicators::Text getObjectNameText(const VisualObject &object, ViewportId viewportId) const override
Definition MRRenderFeatureObjects.h:260
MRVIEWER_API ImGuiMeasurementIndicators::Text getObjectNameText(const VisualObject &object, ViewportId viewportId) const override
MRVIEWER_API RenderPlaneFeatureObject(const VisualObject &object)
Definition MRRenderFeatureObjects.h:216
MRVIEWER_API RenderPlaneNormalComponent(const VisualObject &object)
MRVIEWER_API bool render(const ModelRenderParams &params) override
MRVIEWER_API void renderPicker(const ModelBaseRenderParams &params, unsigned geomId) override
Definition MRRenderFeatureObjects.h:225
MRVIEWER_API RenderPointFeatureObject(const VisualObject &object)
MRVIEWER_API ImGuiMeasurementIndicators::Text getObjectNameText(const VisualObject &object, ViewportId viewportId) const override
Definition MRRenderFeatureObjects.h:268
MRVIEWER_API void renderUi(const UiRenderParams &params) override
MRVIEWER_API RenderSphereFeatureObject(const VisualObject &object)
const ViewportProperty< Color > & getFrontColorsForAllViewports(bool selected=true) const override
Definition MRRenderFeatureObjects.h:137
ViewportMask visibilityMask() const override
Definition MRRenderFeatureObjects.h:126
Definition MRRenderFeatureObjects.h:98
const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const override
Definition MRRenderFeatureObjects.h:112
const ViewportProperty< Color > & getBackColorsForAllViewports() const override
Definition MRRenderFeatureObjects.h:107
const ViewportProperty< Color > & getFrontColorsForAllViewports(bool selected=true) const override
Definition MRRenderFeatureObjects.h:102
Definition MRRenderFeatureObjects.h:73
bool isSelected() const override
Definition MRRenderFeatureObjects.h:75
const ViewportMask & getVisualizePropertyMask(AnyVisualizeMaskEnum type) const override
Definition MRRenderFeatureObjects.h:80
const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const override
returns global transparency alpha of object in all viewports
Definition MRRenderFeatureObjects.h:51
float getLineWidth() const override
Definition MRRenderFeatureObjects.h:45
const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const override
returns global transparency alpha of object in all viewports
Definition MRRenderFeatureObjects.h:63
const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const override
returns global transparency alpha of object in all viewports
Definition MRRenderFeatureObjects.h:33
float getPointSize() const override
returns size of points on screen in pixels
Definition MRRenderFeatureObjects.h:27
Definition MRRenderFeatureObjects.h:21
Definition MRIRenderObject.h:167
Definition MRRenderWrapObject.h:28
const ObjectType * target_
Definition MRRenderWrapObject.h:32
Definition MRRenderWrapObject.h:39
Definition MRViewportId.h:16
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
Definition MRViewportProperty.h:17
Visual Object.
Definition MRVisualObject.h:119
virtual MRMESH_API const ViewportProperty< uint8_t > & getGlobalAlphaForAllViewports() const
returns global transparency alpha of object in all viewports
Definition MRRenderFeatureObjects.h:15
ViewportId viewportId
Definition MRIRenderObject.h:36
Definition MRImGuiMeasurementIndicators.h:133
Definition MRIRenderObject.h:43
Mesh rendering parameters for primary rendering (as opposed to the picker).
Definition MRIRenderObject.h:51
ObjectType subobject
Definition MRRenderWrapObject.h:15
Definition MRIRenderObject.h:107