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"
9#include "MRMesh/MRAxis.h"
10#include <MRMesh/MRObject.h>
11#include <MRMesh/MRColor.h>
12#include "MRMesh/MRSignal.h"
13#include <array>
14#include <functional>
15#include <string>
16
17namespace MR
18{
21
22
23enum class ControlBit
24{
25 None = 0,
26 RotX = 0x1,
27 RotY = 0x2,
28 RotZ = 0x4,
29 RotMask = RotX | RotY | RotZ,
30 MoveX = 0x8,
31 MoveY = 0x10,
32 MoveZ = 0x20,
35};
37
38
40using TransformModesValidator = std::function<ControlBit( const Vector3f& center, const AffineXf3f& xf, ViewportId )>;
41
42
44class MRVIEWER_CLASS ITransformControls
45{
46public:
47 virtual ~ITransformControls() = default;
48
50 const Vector3f& getCenter() const { return center_; }
51 MRVIEWER_API void setCenter( const Vector3f& center );
52
54 virtual float getRadius() const { return 1.0f; }
55
57 virtual void updateSizeInPixel() {};
58
61 void setTransformModesValidator( TransformModesValidator validator ) { validator_ = validator; }
62
64 void setPickThrough( bool on ) { pickThrough_ = on; }
65 bool getPickThrough() const { return pickThrough_; }
66
68 ControlBit getHoveredControl() const { return hoveredControl_; }
69
71 virtual void init( std::shared_ptr<Object> parent ) = 0;
74 virtual void update() = 0;
76 void hover() { hoveredControl_ = hover_( pickThrough_ ); }
78 void stopModify() { stopModify_(); hover(); }
79
81 MRVIEWER_API void updateVisualTransformMode( ControlBit showMask, ViewportMask viewportMask, const AffineXf3f& xf );
82
84 virtual void updateTranslation( Axis ax, const Vector3f& startMove, const Vector3f& endMove, ViewportId vpId ) = 0;
86 virtual void updateRotation( Axis ax, const AffineXf3f& xf, float startAngle, float endAngle, ViewportId vpId ) = 0;
87
90 {
91 public:
92 ChangeCenterAction( const std::string& name, ITransformControls& controls ) :
93 controls_{ controls },
94 name_{ name }{ center_ = controls.getCenter(); }
95
96 virtual std::string name() const override { return name_; }
97
98 virtual void action( HistoryAction::Type ) override
99 {
100 auto center = controls_.getCenter();
101 controls_.setCenter( center_ );
102 center_ = center;
103 }
104
105 [[nodiscard]] virtual size_t heapBytes() const override { return name_.capacity(); }
106
107 private:
108 ITransformControls& controls_;
109 Vector3f center_;
110 std::string name_;
111 };
112protected:
115 virtual ControlBit hover_( bool pickThrough ) = 0;
119 virtual void stopModify_() = 0;
122 virtual void updateVisualTransformMode_( ControlBit showMask, ViewportMask viewportMask ) = 0;
123private:
124 Vector3f center_;
125
126 ControlBit hoveredControl_{ ControlBit::None };
127 bool pickThrough_{ false };
128 TransformModesValidator validator_;
129};
130
132class MRVIEWER_CLASS TransformControls : public ITransformControls
133{
134public:
135
136 struct MRVIEWER_CLASS VisualParams
137 {
139 enum class SizeType
140 {
142 LengthUnit = 0,
144 Pixels
145 };
147 MRVIEWER_API void update( const Box3f& box );
150 float radius{ -1.0f };
153 float width{ -1.0f };
155 SizeType sizeType = SizeType::LengthUnit;
157 float coneRadiusFactor{ 1.35f };
159 float coneSizeFactor{ 2.2f };
161 float negativeLineExtension{ 1.15f };
163 float positiveLineExtension{ 1.3f };
165 std::array<Color, size_t( Axis::Count )> rotationColors{ Color::red(),Color::green(),Color::blue() };
166 std::array<Color, size_t( Axis::Count )> translationColors{ Color::red(),Color::green(),Color::blue() };
167 Color helperLineColor{ Color::black() };
168 Color activeLineColor{ Color::white() };
169 };
170 MRVIEWER_API void setVisualParams( const VisualParams& params );
171 const VisualParams& getVisualParams() const { return params_; }
172
173 MRVIEWER_API virtual ~TransformControls();
174
175 MRVIEWER_API virtual void init( std::shared_ptr<Object> parent ) override;
176 MRVIEWER_API virtual void update() override;
177
178 virtual float getRadius() const override { return params_.radius; }
181 MRVIEWER_API void setRadius( float radius );
184 float getWidth() const { return params_.width; }
186 MRVIEWER_API void setWidth( float width );
188 MRVIEWER_API void setSizeType( VisualParams::SizeType type );
190 MRVIEWER_API virtual void updateSizeInPixel() override;
191
192 MRVIEWER_API virtual void updateTranslation( Axis ax, const Vector3f& startMove, const Vector3f& endMove, ViewportId vpId ) override;
193 MRVIEWER_API virtual void updateRotation( Axis ax, const AffineXf3f& xf, float startAngle, float endAngle, ViewportId vpId ) override;
194
196 MRVIEWER_API static TransformModesValidator ThresholdDotValidator( float thresholdDot );
197private:
199 void resetSizeInPixel_();
200
201 MRVIEWER_API virtual ControlBit hover_( bool pickThrough ) override;
202 MRVIEWER_API virtual void stopModify_() override;
203 MRVIEWER_API virtual void updateVisualTransformMode_( ControlBit showMask, ViewportMask viewportMask ) override;
204
205 VisualParams params_;
206
208 std::array<std::shared_ptr<ObjectMesh>, size_t( Axis::Count )> translateControls_;
209 std::array<std::shared_ptr<ObjectMesh>, size_t( Axis::Count )> rotateControls_;
210
212 std::shared_ptr<ObjectLines> activeLine_;
213 std::array<std::shared_ptr<ObjectLines>, size_t( Axis::Count )> translateLines_;
214 std::array<std::shared_ptr<ObjectLines>, size_t( Axis::Count )> rotateLines_;
215
216 std::shared_ptr<ObjectMesh> hoveredObject_;
217 int findHoveredIndex_() const;
218 void setActiveLineFromPoints_( const Contour3f& points );
219};
220
223class MRVIEWER_CLASS ObjectTransformWidget : public MultiListener<MouseDownListener, MouseMoveListener, MouseUpListener, PreDrawListener, PostDrawListener>
224{
225public:
230 MRVIEWER_API void create( const Box3f& box, const AffineXf3f& xf, std::shared_ptr<ITransformControls> controls = {} );
233 MRVIEWER_API void reset();
234
236 ControlBit getTransformModeMask( ViewportId id = {} ) const { return transformModeMask_.get( id ); }
238 MRVIEWER_API void setTransformMode( ControlBit mask, ViewportId id = {} );
239
251 AxisTransformMode getAxisTransformMode() const { return axisTransformMode_; };
253 void setAxisTransformMode( AxisTransformMode mode ) { axisTransformMode_ = mode; };
254
256 std::shared_ptr<Object> getRootObject() const { return controlsRoot_; }
257
259 std::shared_ptr<ITransformControls> getControls() const { return controls_; }
260 template<typename T>
261 std::shared_ptr<T> getControlsAs() const { return std::dynamic_pointer_cast< T >( controls_ ); }
262
266 MRVIEWER_API void setControlsXf( const AffineXf3f& xf, ViewportId id = {} );
267 MRVIEWER_API AffineXf3f getControlsXf( ViewportId id = {} ) const;
268
271 MRVIEWER_API void followObjVisibility( const std::weak_ptr<Object>& obj );
272
274 void setScaleTooltipCallback( std::function<void( float )> callback ) { scaleTooltipCallback_ = callback; }
276 void setTranslateTooltipCallback( std::function<void( float )> callback ) { translateTooltipCallback_ = callback; }
278 void setRotateTooltipCallback( std::function<void( float )> callback ) { rotateTooltipCallback_ = callback; }
279
281 void setStopModifyCallback( std::function<void()> callback ) { stopModifyCallback_ = callback; }
283 void setStartModifyCallback( std::function<void()> callback ) { startModifyCallback_ = callback; }
285 void setAddXfCallback( std::function<void( const AffineXf3f& )> callback ) { addXfCallback_ = callback; }
288 void setApproveXfCallback( std::function<bool( const AffineXf3f& )> callback ) { approveXfCallback_ = callback; }
289
292 {
293 public:
294 ChangeXfAction( const std::string& name, ObjectTransformWidget& widget ) :
295 widget_{ widget },
296 name_{ name }
297 {
298 if ( widget_.controlsRoot_ )
299 {
300 xf_ = widget_.controlsRoot_->xfsForAllViewports();
301 scaledXf_ = widget_.scaledXf_;
302 }
303 }
304
305 virtual std::string name() const override
306 {
307 return name_;
308 }
309
310 virtual void action( HistoryAction::Type ) override
311 {
312 if ( !widget_.controlsRoot_ )
313 return;
314 auto tmpXf = widget_.controlsRoot_->xfsForAllViewports();
315 widget_.controlsRoot_->setXfsForAllViewports( xf_ );
316 xf_ = tmpXf;
317
318 std::swap( scaledXf_, widget_.scaledXf_ );
319 }
320
321 [[nodiscard]] virtual size_t heapBytes() const override
322 {
323 return name_.capacity();
324 }
325
326 private:
327 ObjectTransformWidget& widget_;
330 std::string name_;
331 };
332private:
333 MRVIEWER_API virtual bool onMouseDown_( MouseButton button, int modifier ) override;
334 MRVIEWER_API virtual bool onMouseUp_( MouseButton button, int modifier ) override;
335 MRVIEWER_API virtual bool onMouseMove_( int mouse_x, int mouse_y ) override;
336 MRVIEWER_API virtual void preDraw_() override;
337 MRVIEWER_API virtual void postDraw_() override;
338
339 void activeMove_( bool press = false );
340
341 void processScaling_( Axis ax, bool press );
342 void processTranslation_( Axis ax, bool press );
343 void processRotation_( Axis ax, bool press );
344
345 void setControlsXf_( const AffineXf3f& xf, bool updateScaled, ViewportId id = {} );
346
347 std::weak_ptr<Object> visibilityParent_;
348
350 void addXf_( const AffineXf3f& addXf );
351 void stopModify_();
352
354 std::shared_ptr<Object> controlsRoot_;
355 std::shared_ptr<ITransformControls> controls_;
356
357 AxisTransformMode axisTransformMode_{ AxisTranslation };
358
359 enum ActiveEditMode
360 {
361 TranslationMode,
362 ScalingMode,
363 UniformScalingMode,
364 RotationMode,
365 };
366 ActiveEditMode activeEditMode_{ TranslationMode };
367
370 Vector3f boxDiagonal_;
372 ViewportProperty<AffineXf3f> scaledXf_;
374 float currentScaling_ = 1.0f;
375
376 Vector3f prevScaling_;
377 Vector3f startTranslation_;
378 Vector3f prevTranslation_;
379 float accumShift_ = 0;
380
381 float startAngle_ = 0;
382 float accumAngle_ = 0;
383
384 ViewportProperty<ControlBit> transformModeMask_{ ControlBit::FullMask };
385 bool picked_{ false };
386
387 std::function<void( float )> scaleTooltipCallback_;
388 std::function<void( float )> translateTooltipCallback_;
389 std::function<void( float )> rotateTooltipCallback_;
390
391 std::function<void()> startModifyCallback_;
392 std::function<void()> stopModifyCallback_;
393 std::function<void( const AffineXf3f& )> addXfCallback_;
394 std::function<bool( const AffineXf3f& )> approveXfCallback_;
395 bool approvedChange_ = true;
396 boost::signals2::connection xfValidatorConnection_;
397};
398
399}
#define MR_MAKE_FLAG_OPERATORS(T)
Generates operators for a enum (at namespace scope).
Definition MRFlagOperators.h:6
Definition MRHistoryAction.h:15
build-in history action class for change center
Definition MRObjectTransformWidget.h:90
Interface class for ObjectTransformWidget custom visualization.
Definition MRObjectTransformWidget.h:45
History action for TransformWidget.
Definition MRObjectTransformWidget.h:292
Definition MRObjectTransformWidget.h:224
Basic implementation of ITransformControls.
Definition MRObjectTransformWidget.h:133
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 stopModify_()=0
Axis
Definition MRAxis.h:9
const Vector3f & getCenter() const
get center of the widget in local space
Definition MRObjectTransformWidget.h:50
virtual MRVIEWER_API void init(std::shared_ptr< Object > parent) override
Called once on widget created to init internal objects.
virtual std::string name() const override
Definition MRObjectTransformWidget.h:305
virtual void updateVisualTransformMode_(ControlBit showMask, ViewportMask viewportMask)=0
MRVIEWER_API AffineXf3f getControlsXf(ViewportId id={}) const
MouseButton
Definition MRMouse.h:12
MRVIEWER_API void setRadius(float radius)
void hover()
Called for hover checks.
Definition MRObjectTransformWidget.h:76
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:283
void setAddXfCallback(std::function< void(const AffineXf3f &)> callback)
Sets callback that will be called when widget gets additive transform.
Definition MRObjectTransformWidget.h:285
virtual size_t heapBytes() const override
returns the amount of memory this object occupies on heap
Definition MRObjectTransformWidget.h:105
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:278
MRVIEWER_API void setVisualParams(const VisualParams &params)
virtual float getRadius() const override
should return current radius of the widget
Definition MRObjectTransformWidget.h:178
std::function< ControlBit(const Vector3f &center, const AffineXf3f &xf, ViewportId)> TransformModesValidator
Definition MRObjectTransformWidget.h:40
MRVIEWER_API void update(const Box3f &box)
updates radius and width with given box
virtual size_t heapBytes() const override
returns the amount of memory this object occupies on heap
Definition MRObjectTransformWidget.h:321
void stopModify()
This is called to stop drawing active visualization when modification is stopped.
Definition MRObjectTransformWidget.h:78
virtual void updateRotation(Axis ax, const AffineXf3f &xf, float startAngle, float endAngle, ViewportId vpId)=0
xf - widget current xf
MRVIEWER_API void updateVisualTransformMode(ControlBit showMask, ViewportMask viewportMask, const AffineXf3f &xf)
Called each frame for each viewport to update available transformation modes.
ChangeXfAction(const std::string &name, ObjectTransformWidget &widget)
Definition MRObjectTransformWidget.h:294
ControlBit getHoveredControl() const
Returns currently hovered control.
Definition MRObjectTransformWidget.h:68
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:64
bool getPickThrough() const
Definition MRObjectTransformWidget.h:65
virtual MRVIEWER_API ~TransformControls()
LengthUnit
Measurement units of length.
Definition MRUnitInfo.h:23
virtual void update()=0
void setTransformModesValidator(TransformModesValidator validator)
Definition MRObjectTransformWidget.h:61
static MRVIEWER_API TransformModesValidator ThresholdDotValidator(float thresholdDot)
returns TransformModesValidator by threshold dot value (this value is duty for hiding widget controls...
AxisTransformMode getAxisTransformMode() const
Returns current axis transform mode (translate/scale object while dragging an axis)
Definition MRObjectTransformWidget.h:251
ControlBit
Definition MRObjectTransformWidget.h:24
const VisualParams & getVisualParams() const
Definition MRObjectTransformWidget.h:171
virtual ControlBit hover_(bool pickThrough)=0
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:92
void setStopModifyCallback(std::function< void()> callback)
Sets callback that will be called when modification of widget stops.
Definition MRObjectTransformWidget.h:281
MRVIEWER_API void setCenter(const Vector3f &center)
virtual void action(HistoryAction::Type) override
This function is called on history action (undo, redo, etc.)
Definition MRObjectTransformWidget.h:310
virtual MRVIEWER_API void updateSizeInPixel() override
calculates and sets the matrix to set the size in pixels
virtual std::string name() const override
Definition MRObjectTransformWidget.h:96
virtual MRVIEWER_API void update() override
std::shared_ptr< Object > getRootObject() const
Returns root object of widget.
Definition MRObjectTransformWidget.h:256
MRVIEWER_API void setWidth(float width)
set width for this widget
virtual MRVIEWER_API 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.
ControlBit getTransformModeMask(ViewportId id={}) const
Returns current transform mode mask.
Definition MRObjectTransformWidget.h:236
MRVIEWER_API void setControlsXf(const AffineXf3f &xf, ViewportId id={})
MRVIEWER_API void setSizeType(VisualParams::SizeType type)
sets the type of widget size units ( recalculates the current values into new units of measurement )
virtual void action(HistoryAction::Type) override
This function is called on history action (undo, redo, etc.)
Definition MRObjectTransformWidget.h:98
Type
Definition MRHistoryAction.h:22
SizeType
type of length measurement units
Definition MRObjectTransformWidget.h:140
MRVIEWER_API void reset()
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:276
virtual void updateSizeInPixel()
should calculates and sets the matrix to set the size in pixels
Definition MRObjectTransformWidget.h:57
float getWidth() const
Definition MRObjectTransformWidget.h:184
MRVIEWER_API void followObjVisibility(const std::weak_ptr< Object > &obj)
AxisTransformMode
Transform operation applying to object while dragging an axis. This parameter does not apply to activ...
Definition MRObjectTransformWidget.h:242
virtual MRVIEWER_API void updateRotation(Axis ax, const AffineXf3f &xf, float startAngle, float endAngle, ViewportId vpId) override
xf - widget current xf
std::shared_ptr< T > getControlsAs() const
Definition MRObjectTransformWidget.h:261
std::shared_ptr< ITransformControls > getControls() const
Returns controls object, that visualize widget.
Definition MRObjectTransformWidget.h:259
void setAxisTransformMode(AxisTransformMode mode)
Sets current axis transform mode (translate/scale object while dragging an axis)
Definition MRObjectTransformWidget.h:253
void setApproveXfCallback(std::function< bool(const AffineXf3f &)> callback)
Definition MRObjectTransformWidget.h:288
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:274
virtual ~ITransformControls()=default
MRVIEWER_API void create(const Box3f &box, const AffineXf3f &xf, std::shared_ptr< ITransformControls > controls={})
virtual float getRadius() const
should return current radius of the widget
Definition MRObjectTransformWidget.h:54
MRVIEWER_API void setTransformMode(ControlBit mask, ViewportId id={})
Sets transform mode mask (enabling or disabling corresponding widget controls)
@ AxisScaling
object inflates or deflates along an axis depending on drag direction (away from center or toward cen...
Definition MRObjectTransformWidget.h:246
@ AxisTranslation
object moves along an axis
Definition MRObjectTransformWidget.h:244
@ UniformScaling
object inflates or deflates along all axes depending on drag direction (away from center or toward ce...
Definition MRObjectTransformWidget.h:248
@ 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:137