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