MeshLib C++ Docs
Loading...
Searching...
No Matches
MRObjectTransformWidget.h
Go to the documentation of this file.
1#pragma once
2
5#include "MRMesh/MRMeshFwd.h"
6#include "MRMesh/MRVector3.h"
10#include "MRMesh/MRAxis.h"
11#include <MRMesh/MRObject.h>
12#include <MRMesh/MRColor.h>
13#include "MRMesh/MRSignal.h"
14#include <array>
15#include <functional>
16#include <string>
17
18namespace MR
19{
22
23
24enum class ControlBit
25{
26 None = 0,
27 RotX = 0x1,
28 RotY = 0x2,
29 RotZ = 0x4,
31 MoveX = 0x8,
32 MoveY = 0x10,
33 MoveZ = 0x20,
36};
38
39
41using TransformModesValidator = std::function<ControlBit( const Vector3f& center, const AffineXf3f& xf, ViewportId )>;
42
43
45class MRVIEWER_CLASS ITransformControls
46{
47public:
48 virtual ~ITransformControls() = default;
49
51 const Vector3f& getCenter() const { return center_; }
52 MRVIEWER_API void setCenter( const Vector3f& center );
53
55 virtual float getRadius() const { return 1.0f; }
56
58 virtual void updateSizeInPixel() {};
59
62 void setTransformModesValidator( TransformModesValidator validator ) { validator_ = validator; }
63
65 void setPickThrough( bool on ) { pickThrough_ = on; }
66 bool getPickThrough() const { return pickThrough_; }
67
69 ControlBit getHoveredControl() const { return hoveredControl_; }
70
72 virtual void init( std::shared_ptr<Object> parent ) = 0;
75 virtual void update() = 0;
77 void hover() { hoveredControl_ = hover_( pickThrough_ ); }
80 void stopModify( bool rehover = true ) { stopModify_(); if ( rehover ) hover(); }
81
83 MRVIEWER_API void updateVisualTransformMode( ControlBit showMask, ViewportMask viewportMask, const AffineXf3f& xf );
84
86 virtual void updateTranslation( Axis ax, const Vector3f& startMove, const Vector3f& endMove, ViewportId vpId ) = 0;
88 virtual void updateRotation( Axis ax, const AffineXf3f& xf, float startAngle, float endAngle, ViewportId vpId ) = 0;
89
92 {
93 public:
94 ChangeCenterAction( const std::string& name, ITransformControls& controls ) :
95 controls_{ controls },
96 name_{ name }{ center_ = controls.getCenter(); }
97
98 virtual std::string name() const override { return name_; }
99
100 virtual void action( HistoryAction::Type ) override
101 {
102 auto center = controls_.getCenter();
103 controls_.setCenter( center_ );
104 center_ = center;
105 }
106
107 [[nodiscard]] virtual size_t heapBytes() const override { return name_.capacity(); }
108
109 private:
110 ITransformControls& controls_;
111 Vector3f center_;
112 std::string name_;
113 };
114protected:
117 virtual ControlBit hover_( bool pickThrough ) = 0;
121 virtual void stopModify_() = 0;
124 virtual void updateVisualTransformMode_( ControlBit showMask, ViewportMask viewportMask ) = 0;
125private:
126 Vector3f center_;
127
128 ControlBit hoveredControl_{ ControlBit::None };
129 bool pickThrough_{ false };
130 TransformModesValidator validator_;
131};
132
134class MRVIEWER_CLASS TransformControls : public ITransformControls
135{
136public:
137
138 struct MRVIEWER_CLASS VisualParams
139 {
141 enum class SizeType
142 {
147 };
148
149 MRVIEWER_API void update( const Box3f& box );
152 float radius{ -1.0f };
155 float width{ -1.0f };
159 float coneRadiusFactor{ 1.35f };
161 float coneSizeFactor{ 2.2f };
163 float negativeLineExtension{ 1.15f };
171 };
172 MRVIEWER_API void setVisualParams( const VisualParams& params );
173 const VisualParams& getVisualParams() const { return params_; }
174
175 MRVIEWER_API virtual ~TransformControls();
176
177 MRVIEWER_API virtual void init( std::shared_ptr<Object> parent ) override;
178 MRVIEWER_API virtual void update() override;
179
180 virtual float getRadius() const override { return params_.radius; }
183 MRVIEWER_API void setRadius( float radius );
186 float getWidth() const { return params_.width; }
188 MRVIEWER_API void setWidth( float width );
190 MRVIEWER_API void setSizeType( VisualParams::SizeType type );
192 MRVIEWER_API virtual void updateSizeInPixel() override;
193
194 MRVIEWER_API virtual void updateTranslation( Axis ax, const Vector3f& startMove, const Vector3f& endMove, ViewportId vpId ) override;
195 MRVIEWER_API virtual void updateRotation( Axis ax, const AffineXf3f& xf, float startAngle, float endAngle, ViewportId vpId ) override;
196
198 MRVIEWER_API static TransformModesValidator ThresholdDotValidator( float thresholdDot );
199private:
201 void resetSizeInPixel_();
202
203 MRVIEWER_API virtual ControlBit hover_( bool pickThrough ) override;
204 MRVIEWER_API virtual void stopModify_() override;
205 MRVIEWER_API virtual void updateVisualTransformMode_( ControlBit showMask, ViewportMask viewportMask ) override;
206
207 VisualParams params_;
208
210 std::array<std::shared_ptr<ObjectMesh>, size_t( Axis::Count )> translateControls_;
211 std::array<std::shared_ptr<ObjectMesh>, size_t( Axis::Count )> rotateControls_;
212
214 std::shared_ptr<ObjectLines> activeLine_;
215 std::array<std::shared_ptr<ObjectLines>, size_t( Axis::Count )> translateLines_;
216 std::array<std::shared_ptr<ObjectLines>, size_t( Axis::Count )> rotateLines_;
217
218 std::shared_ptr<ObjectMesh> hoveredObject_;
219 int findHoveredIndex_() const;
220 void setActiveLineFromPoints_( const Contour3f& points );
221};
222
225class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListener, MouseMoveListener, MouseUpListener, PreDrawListener, PostDrawListener>
226{
227public:
232 MRVIEWER_API void create( const Box3f& box, const AffineXf3f& xf, std::shared_ptr<ITransformControls> controls = {} );
235 MRVIEWER_API void reset();
236
238 ControlBit getTransformModeMask( ViewportId id = {} ) const { return transformModeMask_.get( id ); }
240 MRVIEWER_API void setTransformMode( ControlBit mask, ViewportId id = {} );
241
253
254 AxisTransformMode getAxisTransformMode() const { return axisTransformMode_; };
256 void setAxisTransformMode( AxisTransformMode mode ) { axisTransformMode_ = mode; };
257
259 std::shared_ptr<Object> getRootObject() const { return controlsRoot_; }
260
262 std::shared_ptr<ITransformControls> getControls() const { return controls_; }
263 template<typename T>
264 std::shared_ptr<T> getControlsAs() const { return std::dynamic_pointer_cast< T >( controls_ ); }
265
269 MRVIEWER_API void setControlsXf( const AffineXf3f& xf, ViewportId id = {} );
270 MRVIEWER_API AffineXf3f getControlsXf( ViewportId id = {} ) const;
271
274 MRVIEWER_API void followObjVisibility( const std::weak_ptr<Object>& obj );
275
277 void setScaleTooltipCallback( std::function<void( float )> callback ) { scaleTooltipCallback_ = callback; }
279 void setTranslateTooltipCallback( std::function<void( float )> callback ) { translateTooltipCallback_ = callback; }
281 void setRotateTooltipCallback( std::function<void( float )> callback ) { rotateTooltipCallback_ = callback; }
282
284 void setStopModifyCallback( std::function<void()> callback ) { stopModifyCallback_ = callback; }
286 void setStartModifyCallback( std::function<void()> callback ) { startModifyCallback_ = callback; }
288 void setAddXfCallback( std::function<void( const AffineXf3f& )> callback ) { addXfCallback_ = callback; }
291 void setApproveXfCallback( std::function<bool( const AffineXf3f& )> callback ) { approveXfCallback_ = callback; }
292
295 {
296 public:
297 ChangeXfAction( const std::string& name, ObjectTransformWidget& widget ) :
298 widget_{ widget },
299 name_{ name }
300 {
301 if ( widget_.controlsRoot_ )
302 {
303 xf_ = widget_.controlsRoot_->xfsForAllViewports();
304 scaledXf_ = widget_.scaledXf_;
305 }
306 }
307
308 virtual std::string name() const override
309 {
310 return name_;
311 }
312
313 virtual void action( HistoryAction::Type ) override
314 {
315 if ( !widget_.controlsRoot_ )
316 return;
317 auto tmpXf = widget_.controlsRoot_->xfsForAllViewports();
318 widget_.controlsRoot_->setXfsForAllViewports( xf_ );
319 xf_ = tmpXf;
320
321 std::swap( scaledXf_, widget_.scaledXf_ );
322 }
323
324 [[nodiscard]] virtual size_t heapBytes() const override
325 {
326 return name_.capacity();
327 }
328
329 private:
330 ObjectTransformWidget& widget_;
333 std::string name_;
334 };
335private:
336 MRVIEWER_API virtual bool onMouseDown_( MouseButton button, int modifier ) override;
337 MRVIEWER_API virtual bool onMouseUp_( MouseButton button, int modifier ) override;
338 MRVIEWER_API virtual bool onMouseMove_( int mouse_x, int mouse_y ) override;
339 MRVIEWER_API virtual void preDraw_() override;
340 MRVIEWER_API virtual void postDraw_() override;
341
342 void activeMove_( bool press = false );
343
344 void processScaling_( Axis ax, bool press );
345 void processTranslation_( Axis ax, bool press );
346 void processRotation_( Axis ax, bool press );
347
348 void setControlsXf_( const AffineXf3f& xf, bool updateScaled, ViewportId id = {} );
349
350 std::weak_ptr<Object> visibilityParent_;
351
353 void addXf_( const AffineXf3f& addXf );
354 void stopModify_();
355
357 std::shared_ptr<Object> controlsRoot_;
358 std::shared_ptr<ITransformControls> controls_;
359
360 AxisTransformMode axisTransformMode_{ AxisTranslation };
361
362 enum ActiveEditMode
363 {
364 TranslationMode,
365 ScalingMode,
366 UniformScalingMode,
367 RotationMode,
368 };
369 ActiveEditMode activeEditMode_{ TranslationMode };
371 ActiveEditMode editModeFor_( ControlBit control ) const;
372
375 Vector3f boxDiagonal_;
377 ViewportProperty<AffineXf3f> scaledXf_;
379 float currentScaling_ = 1.0f;
380
381 Vector3f prevScaling_;
382 Vector3f startTranslation_;
383 Vector3f prevTranslation_;
384 float accumShift_ = 0;
385
386 float startAngle_ = 0;
387 float accumAngle_ = 0;
388
389 ViewportProperty<ControlBit> transformModeMask_{ ControlBit::FullMask };
390 bool picked_{ false };
391
392 std::function<void( float )> scaleTooltipCallback_;
393 std::function<void( float )> translateTooltipCallback_;
394 std::function<void( float )> rotateTooltipCallback_;
395
396 std::function<void()> startModifyCallback_;
397 std::function<void()> stopModifyCallback_;
398 std::function<void( const AffineXf3f& )> addXfCallback_;
399 std::function<bool( const AffineXf3f& )> approveXfCallback_;
400 bool approvedChange_ = true;
401 boost::signals2::connection xfValidatorConnection_;
402};
403
404}
#define MR_MAKE_FLAG_OPERATORS(T)
Generates operators for a enum (at namespace scope).
Definition MRFlagOperators.h:6
Interface class for ObjectTransformWidget custom visualization.
Definition MRObjectTransformWidget.h:46
Definition MRObjectTransformWidget.h:226
Basic implementation of ITransformControls.
Definition MRObjectTransformWidget.h:135
Definition MRViewportId.h:16
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
Definition MRViewportProperty.h:17
auto width(const Box< V > &box)
returns size along x axis
Definition MRBox.h:354
virtual void init(std::shared_ptr< Object > parent) override
Called once on widget created to init internal objects.
virtual void stopModify_()=0
float width
Definition MRObjectTransformWidget.h:155
Axis
Definition MRAxis.h:9
const Vector3f & getCenter() const
get center of the widget in local space
Definition MRObjectTransformWidget.h:51
static constexpr Color green() noexcept
Definition MRColor.h:32
virtual std::string name() const override
Definition MRObjectTransformWidget.h:308
virtual void updateVisualTransformMode_(ControlBit showMask, ViewportMask viewportMask)=0
void setWidth(float width)
set width for this widget
MouseButton
Definition MRMouse.h:13
void hover()
Called for hover checks.
Definition MRObjectTransformWidget.h:77
Contour3< float > Contour3f
Definition MRMeshFwd.h:378
float radius
Definition MRObjectTransformWidget.h:152
float negativeLineExtension
extension of the translation line in the negative direction relative to the radius
Definition MRObjectTransformWidget.h:163
virtual ~TransformControls()
std::array< Color, size_t(Axis::Count)> translationColors
Definition MRObjectTransformWidget.h:168
virtual void updateTranslation(Axis ax, const Vector3f &startMove, const Vector3f &endMove, ViewportId vpId)=0
One have to implement these functions to have visualization of translation and rotation.
void setStartModifyCallback(std::function< void()> callback)
Sets callback that will be called when modification of widget starts.
Definition MRObjectTransformWidget.h:286
AffineXf3f getControlsXf(ViewportId id={}) const
void setAddXfCallback(std::function< void(const AffineXf3f &)> callback)
Sets callback that will be called when widget gets additive transform.
Definition MRObjectTransformWidget.h:288
virtual size_t heapBytes() const override
returns the amount of memory this object occupies on heap
Definition MRObjectTransformWidget.h:107
void setRotateTooltipCallback(std::function< void(float)> callback)
Sets callback that will be called in draw function during rotation with current angle in rad.
Definition MRObjectTransformWidget.h:281
virtual float getRadius() const override
should return current radius of the widget
Definition MRObjectTransformWidget.h:180
void updateVisualTransformMode(ControlBit showMask, ViewportMask viewportMask, const AffineXf3f &xf)
Called each frame for each viewport to update available transformation modes.
std::function< ControlBit(const Vector3f &center, const AffineXf3f &xf, ViewportId)> TransformModesValidator
Definition MRObjectTransformWidget.h:41
Color activeLineColor
Definition MRObjectTransformWidget.h:170
virtual size_t heapBytes() const override
returns the amount of memory this object occupies on heap
Definition MRObjectTransformWidget.h:324
static constexpr Color black() noexcept
Definition MRColor.h:29
virtual void update() override
Color helperLineColor
Definition MRObjectTransformWidget.h:169
virtual void updateRotation(Axis ax, const AffineXf3f &xf, float startAngle, float endAngle, ViewportId vpId)=0
xf - widget current xf
virtual void updateTranslation(Axis ax, const Vector3f &startMove, const Vector3f &endMove, ViewportId vpId) override
One have to implement these functions to have visualization of translation and rotation.
void stopModify(bool rehover=true)
Definition MRObjectTransformWidget.h:80
ChangeXfAction(const std::string &name, ObjectTransformWidget &widget)
Definition MRObjectTransformWidget.h:297
ControlBit getHoveredControl() const
Returns currently hovered control.
Definition MRObjectTransformWidget.h:69
void setPickThrough(bool on)
Enables or disables pick through mode, in this mode controls will be picked even if they are occluded...
Definition MRObjectTransformWidget.h:65
bool getPickThrough() const
Definition MRObjectTransformWidget.h:66
std::array< Color, size_t(Axis::Count)> rotationColors
colors of widget
Definition MRObjectTransformWidget.h:167
virtual void update()=0
void setTransformModesValidator(TransformModesValidator validator)
Definition MRObjectTransformWidget.h:62
void setCenter(const Vector3f &center)
AxisTransformMode getAxisTransformMode() const
Returns current axis transform mode (translate/scale object while dragging an axis)
Definition MRObjectTransformWidget.h:254
ControlBit
Definition MRObjectTransformWidget.h:25
const VisualParams & getVisualParams() const
Definition MRObjectTransformWidget.h:173
virtual ControlBit hover_(bool pickThrough)=0
virtual void updateSizeInPixel() override
calculates and sets the matrix to set the size in pixels
virtual void init(std::shared_ptr< Object > parent)=0
Called once on widget created to init internal objects.
ChangeCenterAction(const std::string &name, ITransformControls &controls)
Definition MRObjectTransformWidget.h:94
void setStopModifyCallback(std::function< void()> callback)
Sets callback that will be called when modification of widget stops.
Definition MRObjectTransformWidget.h:284
virtual void action(HistoryAction::Type) override
This function is called on history action (undo, redo, etc.)
Definition MRObjectTransformWidget.h:313
virtual std::string name() const override
Definition MRObjectTransformWidget.h:98
static constexpr Color red() noexcept
Definition MRColor.h:31
std::shared_ptr< Object > getRootObject() const
Returns root object of widget.
Definition MRObjectTransformWidget.h:259
void setTransformMode(ControlBit mask, ViewportId id={})
Sets transform mode mask (enabling or disabling corresponding widget controls)
SizeType sizeType
sets the type of widget size units (metric length or pixels units)
Definition MRObjectTransformWidget.h:157
void setVisualParams(const VisualParams &params)
ControlBit getTransformModeMask(ViewportId id={}) const
Returns current transform mode mask.
Definition MRObjectTransformWidget.h:238
float positiveLineExtension
extension of the translation line in the positive direction relative to the radius
Definition MRObjectTransformWidget.h:165
void setControlsXf(const AffineXf3f &xf, ViewportId id={})
virtual void updateRotation(Axis ax, const AffineXf3f &xf, float startAngle, float endAngle, ViewportId vpId) override
xf - widget current xf
virtual void action(HistoryAction::Type) override
This function is called on history action (undo, redo, etc.)
Definition MRObjectTransformWidget.h:100
Type
Definition MRHistoryAction.h:27
SizeType
type of length measurement units
Definition MRObjectTransformWidget.h:142
void setTranslateTooltipCallback(std::function< void(float)> callback)
Sets callback that will be called in draw function during translation with current shift arg.
Definition MRObjectTransformWidget.h:279
static constexpr Color blue() noexcept
Definition MRColor.h:33
float coneRadiusFactor
the product of this factor and width gives cone radius of the arrows
Definition MRObjectTransformWidget.h:159
void update(const Box3f &box)
updates radius and width with given box
virtual void updateSizeInPixel()
should calculates and sets the matrix to set the size in pixels
Definition MRObjectTransformWidget.h:58
HistoryAction()=default
explicitly define ctors to avoid warning C5267: definition of implicit copy constructor is deprecated...
void setRadius(float radius)
float getWidth() const
Definition MRObjectTransformWidget.h:186
float coneSizeFactor
the product of this factor and width gives cone size of the arrows
Definition MRObjectTransformWidget.h:161
AxisTransformMode
Definition MRObjectTransformWidget.h:245
std::shared_ptr< T > getControlsAs() const
Definition MRObjectTransformWidget.h:264
std::shared_ptr< ITransformControls > getControls() const
Returns controls object, that visualize widget.
Definition MRObjectTransformWidget.h:262
void setAxisTransformMode(AxisTransformMode mode)
Sets current axis transform mode (translate/scale object while dragging an axis)
Definition MRObjectTransformWidget.h:256
void create(const Box3f &box, const AffineXf3f &xf, std::shared_ptr< ITransformControls > controls={})
static TransformModesValidator ThresholdDotValidator(float thresholdDot)
returns TransformModesValidator by threshold dot value (this value is duty for hiding widget controls...
void setApproveXfCallback(std::function< bool(const AffineXf3f &)> callback)
Definition MRObjectTransformWidget.h:291
void setScaleTooltipCallback(std::function< void(float)> callback)
Sets callback that will be called in draw function during scaling with current scale arg.
Definition MRObjectTransformWidget.h:277
virtual ~ITransformControls()=default
virtual float getRadius() const
should return current radius of the widget
Definition MRObjectTransformWidget.h:55
void followObjVisibility(const std::weak_ptr< Object > &obj)
void setSizeType(VisualParams::SizeType type)
sets the type of widget size units ( recalculates the current values into new units of measurement )
static constexpr Color white() noexcept
Definition MRColor.h:28
@ Count
Definition MRAxis.h:13
@ RotZ
Definition MRObjectTransformWidget.h:29
@ FullMask
Definition MRObjectTransformWidget.h:35
@ RotY
Definition MRObjectTransformWidget.h:28
@ MoveX
Definition MRObjectTransformWidget.h:31
@ RotMask
Definition MRObjectTransformWidget.h:30
@ None
Definition MRObjectTransformWidget.h:26
@ MoveZ
Definition MRObjectTransformWidget.h:33
@ MoveMask
Definition MRObjectTransformWidget.h:34
@ MoveY
Definition MRObjectTransformWidget.h:32
@ RotX
Definition MRObjectTransformWidget.h:27
@ LengthUnit
metric units of measurement
Definition MRObjectTransformWidget.h:144
@ Pixels
pixel units of measurement
Definition MRObjectTransformWidget.h:146
@ AxisScaling
object inflates or deflates along an axis depending on drag direction (away from center or toward cen...
Definition MRObjectTransformWidget.h:249
@ AxisTranslation
object moves along an axis
Definition MRObjectTransformWidget.h:247
@ UniformScaling
object inflates or deflates along all axes depending on drag direction (away from center or toward ce...
Definition MRObjectTransformWidget.h:251
@ None
special value not to limit path in one slice
Definition MRVoxelPath.h:33
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRColor.h:12
Definition MRViewerEventsListener.h:32
Definition MRObjectTransformWidget.h:139