MeshLib C++ Docs
Loading...
Searching...
No Matches
MRMoveObjectByMouseImpl.h
Go to the documentation of this file.
1#pragma once
2#include "MRViewerFwd.h"
3#include "MRMouse.h"
4#include "MRImGui.h"
5#include "MRMesh/MRPlane3.h"
7#include "MRMesh/MRSignal.h"
8
9namespace MR
10{
11
16class MRVIEWER_CLASS MoveObjectByMouseImpl
17{
18public:
20 virtual ~MoveObjectByMouseImpl() = default;
21
25 int minDistance() const { return minDistance_; }
26 void setMinDistance( int minDistance ) { minDistance_ = minDistance; }
27
30 MRVIEWER_API void onDrawDialog() const;
31
38 MRVIEWER_API bool onMouseDown( MouseButton button, int modifiers );
39 MRVIEWER_API bool onMouseMove( int x, int y );
40 MRVIEWER_API bool onMouseUp( MouseButton button, int modifiers );
41
44 MRVIEWER_API bool isMoving() const;
45
49 MRVIEWER_API void cancel();
50
52 void enableHistory( bool history ) { historyEnabled_ = history; }
53
55 bool isHistoryEnabled() const { return historyEnabled_; }
56
57protected:
59 enum class TransformMode
60 {
61 None,
64 UniformScale,
65 NonUniformScale,
66 };
67
70 float deadZonePixelRadius_{ 20.0f };
71
74 MRVIEWER_API virtual ObjAndPick pickObjects_( std::vector<std::shared_ptr<Object>>& objects, int modifiers ) const;
75
77 MRVIEWER_API virtual TransformMode modeFromPickModifiers_( int modifiers ) const;
78
80 MRVIEWER_API virtual TransformMode modeFromPick_( MouseButton button, int modifiers ) const;
81
83 MRVIEWER_API virtual void setStartPoint_( const ObjAndPick& pick, Vector3f& startPoint ) const;
84
86 MRVIEWER_API virtual void setCenterPoint_( const std::vector<std::shared_ptr<Object>>& objects, Vector3f& centerPoint ) const;
87
90 MRVIEWER_API virtual Plane3f calcControlPlane_( const Viewport& vp, const Vector3f& viewportCenterPoint, const Vector3f& xfCenterPoint ) const;
91
94 MRVIEWER_API Box3f getBbox_( const std::vector<std::shared_ptr<Object>>& objects ) const;
95
96 AffineXf3f currentXf_; // Transform currently applied to objects
97private:
98 int minDistance_ = 0;
99
105 TransformMode pick_( MouseButton button, int modifiers );
106
108 MRVIEWER_API virtual void onPick_(
109 TransformMode mode, const std::vector<std::shared_ptr<Object>>& objects,
110 const Vector3f& centerPoint, const Vector3f& startPoint );
111
112 void clear_();
113
114 void applyCurrentXf_();
115
116 void setVisualizeVectors_( std::vector<Vector3f> worldPoints );
117
118 std::vector<std::shared_ptr<Object>> objects_;
119 std::vector<AffineXf3f> initialXfs_;
120
121 TransformMode transformMode_ = TransformMode::None;
122 Vector2i screenStartPoint_; // onMouseDown() writes here the position of mouse when mouse dragging was started
123 bool xfChanged_ = false; // it becomes true when onMouseMove changes transform of objects for the first time and optionally appends history actions
124 MouseButton currentButton_ = MouseButton::NoButton;
125
126 // Data used to calculate transform
127 Vector3f worldStartPoint_; // World point corresponding to cursor, for transform calculation
128 Vector3f xfCenterPoint_;
129 float viewportStartPointZ_;
130 Plane3f referencePlane_;
131 float angle_ = 0.f;
132 float shift_ = 0.f;
133 float scale_ = 1.f;
134
135 // only check on real appending history
136 bool historyEnabled_{ true };
137
138 std::vector<ImVec2> visualizeVectors_;
139
140 // monitors external transform change of objects during mouse moving
141 std::vector<boost::signals2::scoped_connection> connections_;
142 bool changingXfFromMouseMove_{ false }; // true only during setXf called from onMouseMove_
143};
144
145}
Definition MRMoveObjectByMouseImpl.h:17
virtual MRVIEWER_API void setCenterPoint_(const std::vector< std::shared_ptr< Object > > &objects, Vector3f &centerPoint) const
centerPoint - a point that will be used as center of rotation/scaling in world space
virtual MRVIEWER_API TransformMode modeFromPickModifiers_(int modifiers) const
Helper function to determine TransformMode based on modifiers.
virtual ~MoveObjectByMouseImpl()=default
MRVIEWER_API Box3f getBbox_(const std::vector< std::shared_ptr< Object > > &objects) const
MRVIEWER_API bool onMouseMove(int x, int y)
MRVIEWER_API bool onMouseUp(MouseButton button, int modifiers)
virtual MRVIEWER_API ObjAndPick pickObjects_(std::vector< std::shared_ptr< Object > > &objects, int modifiers) const
TransformMode
Transformation mode.
Definition MRMoveObjectByMouseImpl.h:60
MRVIEWER_API bool onMouseDown(MouseButton button, int modifiers)
virtual MRVIEWER_API Plane3f calcControlPlane_(const Viewport &vp, const Vector3f &viewportCenterPoint, const Vector3f &xfCenterPoint) const
MRVIEWER_API void onDrawDialog() const
MRVIEWER_API bool isMoving() const
void enableHistory(bool history)
enables or disables adding history to viewer history store by this tool
Definition MRMoveObjectByMouseImpl.h:52
virtual MRVIEWER_API TransformMode modeFromPick_(MouseButton button, int modifiers) const
this function is called from onMouseDown to verify if pick should proceed, if None is returned - onMo...
int minDistance() const
Definition MRMoveObjectByMouseImpl.h:25
void setMinDistance(int minDistance)
Definition MRMoveObjectByMouseImpl.h:26
MRVIEWER_API void cancel()
virtual MRVIEWER_API void setStartPoint_(const ObjAndPick &pick, Vector3f &startPoint) const
startPoint - a point under cursor for transform calculation, can be the picked point or else (world c...
AffineXf3f currentXf_
Definition MRMoveObjectByMouseImpl.h:96
bool isHistoryEnabled() const
returns true if appending history to viewer history store is enabled in this tool
Definition MRMoveObjectByMouseImpl.h:55
Definition MRViewport.h:46
@ None
special value not to limit path in one slice
Definition MRVoxelPath.h:33
Definition MRCameraOrientationPlugin.h:8
MouseButton
Definition MRMouse.h:9
std::pair< std::shared_ptr< MR::VisualObject >, MR::PointOnObject > ObjAndPick
Definition MRViewerFwd.h:86