DART  6.10.1
DefaultEventHandler.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2021, The DART development contributors
3  * All rights reserved.
4  *
5  * The list of contributors can be found at:
6  * https://github.com/dartsim/dart/blob/master/LICENSE
7  *
8  * This file is provided under the following "BSD-style" License:
9  * Redistribution and use in source and binary forms, with or
10  * without modification, are permitted provided that the following
11  * conditions are met:
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef DART_GUI_OSG_DEFAULTEVENTHANDLER_HPP_
34 #define DART_GUI_OSG_DEFAULTEVENTHANDLER_HPP_
35 
36 #include <array>
37 #include <memory>
38 #include <vector>
39 
40 #include <Eigen/Core>
41 
42 #include <osgGA/GUIEventHandler>
43 
45 #include "dart/common/Observer.hpp"
46 #include "dart/common/Subject.hpp"
47 
48 namespace dart {
49 
50 namespace dynamics {
51 class Shape;
52 class ShapeFrame;
53 class Entity;
54 } // namespace dynamics
55 
56 namespace gui {
57 namespace osg {
58 
59 struct PickInfo
60 {
62  std::shared_ptr<dart::dynamics::Shape> shape;
63  Eigen::Vector3d position;
64  Eigen::Vector3d normal;
65 };
66 
67 class Viewer;
68 
70 {
71 
75 
77 };
78 
80 {
81 
86 
87 };
88 
90 {
91 
96 
98 };
99 
100 class MouseEventHandler;
101 
103 class DefaultEventHandler : public ::osgGA::GUIEventHandler,
104  public virtual dart::common::Subject,
105  public virtual dart::common::Observer
106 {
107 public:
109  explicit DefaultEventHandler(Viewer* _viewer);
110 
112  virtual ~DefaultEventHandler();
113 
116 
118  int getModKeyMask() const;
119 
121  double getWindowCursorX() const;
122 
124  double getWindowCursorY() const;
125 
137  Eigen::Vector3d getDeltaCursor(
138  const Eigen::Vector3d& _fromPosition,
139  ConstraintType _constraint = UNCONSTRAINED,
140  const Eigen::Vector3d& _constraintVector
141  = Eigen::Vector3d::UnitZ()) const;
142 
147  Eigen::Vector3d& near, Eigen::Vector3d& far, double distance = 1.0) const;
148 
150  const std::vector<PickInfo>& getButtonPicks(
151  MouseButton button, MouseButtonEvent event) const;
152 
155  const std::vector<PickInfo>& getMovePicks() const;
156 
159 
161  void suppressMovePicks();
162 
165 
167  void activateMovePicks();
168 
171  void pick(
172  std::vector<PickInfo>& infoVector, const ::osgGA::GUIEventAdapter& ea);
173 
179 
182  const std::set<MouseEventHandler*>& getMouseEventHandlers() const;
183 
185  bool handle(
186  const ::osgGA::GUIEventAdapter& ea, ::osgGA::GUIActionAdapter&) override;
187 
188 protected:
191 
193  void eventPick(const ::osgGA::GUIEventAdapter& ea);
194 
196  void clearButtonEvents();
197 
199  const dart::common::Subject* _subject) override;
200 
203 
205  std::set<MouseEventHandler*> mMouseEventHandlers;
206 
209 
212 
214  std::vector<PickInfo> mMovePicks;
215 
218 
220  std::vector<PickInfo> mTempPicks;
221 
224 
227  Eigen::Vector2d mLastCursorPosition;
228 
231 };
233 
234 } // namespace osg
235 } // namespace gui
236 } // namespace dart
237 
238 #endif // DART_GUI_OSG_DEFAULTEVENTHANDLER_HPP_
#define DART_DECLARE_CLASS_WITH_VIRTUAL_BASE_END
Definition: ClassWithVirtualBase.hpp:44
#define DART_DECLARE_CLASS_WITH_VIRTUAL_BASE_BEGIN
Definition: ClassWithVirtualBase.hpp:43
The Observer class should be inherited by any class that wants to respond in a customized way to the ...
Definition: Observer.hpp:52
The Subject class is a base class for any object that wants to report when it gets destroyed.
Definition: Subject.hpp:58
Definition: ShapeFrame.hpp:192
Definition: DefaultEventHandler.hpp:106
std::vector< PickInfo > mMovePicks
The objects that were under the cursor during the last move.
Definition: DefaultEventHandler.hpp:214
int getModKeyMask() const
Returns the last modkey mask.
Definition: DefaultEventHandler.cpp:80
void clearButtonEvents()
Clear out the current button events.
Definition: DefaultEventHandler.cpp:429
double getWindowCursorX() const
Get the last x value of the cursor in Window coordinates.
Definition: DefaultEventHandler.cpp:86
void activateMovePicks()
Activate pick detection for mouse movements (on by default)
Definition: DefaultEventHandler.cpp:208
void pick(std::vector< PickInfo > &infoVector, const ::osgGA::GUIEventAdapter &ea)
Detect picks TODO(MXG): Consider putting this functionality in a more accessible place.
Definition: DefaultEventHandler.cpp:214
std::set< MouseEventHandler * > mMouseEventHandlers
Set of MouseEventHandlers that are tied to this DefaultEventHandler.
Definition: DefaultEventHandler.hpp:205
void triggerMouseEventHandlers()
Calls update on all MouseEventHandlers.
Definition: DefaultEventHandler.cpp:381
bool mSuppressMovePicks
Suppress pick detection for moves.
Definition: DefaultEventHandler.hpp:217
void suppressButtonPicks(MouseButton button, MouseButtonEvent event)
Suppress pick detection for the specified button event.
Definition: DefaultEventHandler.cpp:182
const std::vector< PickInfo > & getButtonPicks(MouseButton button, MouseButtonEvent event) const
Get the most recent picks for the specified button and event type.
Definition: DefaultEventHandler.cpp:166
bool handle(const ::osgGA::GUIEventAdapter &ea, ::osgGA::GUIActionAdapter &) override
Handle incoming user input.
Definition: DefaultEventHandler.cpp:307
DefaultEventHandler(Viewer *_viewer)
Constructor takes in a pointer to a viewer.
Definition: DefaultEventHandler.cpp:51
void suppressMovePicks()
Suppress pick detection for mouse movements.
Definition: DefaultEventHandler.cpp:192
std::vector< PickInfo > mTempPicks
Cache for pick data.
Definition: DefaultEventHandler.hpp:220
void activateButtonPicks(MouseButton button, MouseButtonEvent event)
Activate pick detection for the specified button event (on by default)
Definition: DefaultEventHandler.cpp:198
Eigen::Vector3d getDeltaCursor(const Eigen::Vector3d &_fromPosition, ConstraintType _constraint=UNCONSTRAINED, const Eigen::Vector3d &_constraintVector=Eigen::Vector3d::UnitZ()) const
Get the change change in the cursor position with respect to some previous location in the world (_fr...
Definition: DefaultEventHandler.cpp:98
MouseButtonEvent getButtonEvent(MouseButton button) const
Returns the last event performed by a mouse button.
Definition: DefaultEventHandler.cpp:74
Eigen::Vector2d mLastCursorPosition
X/Y values of the cursor (in the window coordinates) during the last mouse event.
Definition: DefaultEventHandler.hpp:227
void getNearAndFarPointUnderCursor(Eigen::Vector3d &near, Eigen::Vector3d &far, double distance=1.0) const
Get two points that are under the current cursor position.
Definition: DefaultEventHandler.cpp:148
void eventPick(const ::osgGA::GUIEventAdapter &ea)
Gather current picks and assign them to the latest event.
Definition: DefaultEventHandler.cpp:390
void handleDestructionNotification(const dart::common::Subject *_subject) override
Called by receiveDestructionNotification().
Definition: DefaultEventHandler.cpp:436
void addMouseEventHandler(MouseEventHandler *handler)
Add a MouseEventHandler that will get invoked whenever a mouse event occurs.
Definition: DefaultEventHandler.cpp:245
virtual ~DefaultEventHandler()
Destructor.
Definition: DefaultEventHandler.cpp:68
const std::vector< PickInfo > & getMovePicks() const
Get the most recent picks for a mouse movement (click-and-drag actions do not qualify as movements)
Definition: DefaultEventHandler.cpp:176
std::vector< PickInfo > mButtonPicks[NUM_MOUSE_BUTTONS][BUTTON_NOTHING]
The objects that were under the cursor during the last button event.
Definition: DefaultEventHandler.hpp:208
bool mSuppressButtonPicks[NUM_MOUSE_BUTTONS][BUTTON_NOTHING]
Suppress pick detection.
Definition: DefaultEventHandler.hpp:211
double getWindowCursorY() const
Get the last y value of the cursor in Window coordinates.
Definition: DefaultEventHandler.cpp:92
MouseButtonEvent mLastButtonEvent[NUM_MOUSE_BUTTONS]
The last mouse event that was registered by the event handler.
Definition: DefaultEventHandler.hpp:223
Viewer * mViewer
dart::gui::osg::Viewer that this event handler is tied to
Definition: DefaultEventHandler.hpp:202
const std::set< MouseEventHandler * > & getMouseEventHandlers() const
Get the list of MouseEventHandlers that are currently held by this DefaultEventHandler.
Definition: DefaultEventHandler.cpp:253
int mLastModKeyMask
Storage for the last modkey mask.
Definition: DefaultEventHandler.hpp:230
Definition: MouseEventHandler.hpp:51
Definition: Viewer.hpp:112
MouseButton
Definition: DefaultEventHandler.hpp:70
@ MIDDLE_MOUSE
Definition: DefaultEventHandler.hpp:74
@ RIGHT_MOUSE
Definition: DefaultEventHandler.hpp:73
@ NUM_MOUSE_BUTTONS
Definition: DefaultEventHandler.hpp:76
@ LEFT_MOUSE
Definition: DefaultEventHandler.hpp:72
ConstraintType
Definition: DefaultEventHandler.hpp:90
@ PLANE_CONSTRAINT
Definition: DefaultEventHandler.hpp:94
@ CUSTOM_CONSTRAINT
Definition: DefaultEventHandler.hpp:95
@ UNCONSTRAINED
Definition: DefaultEventHandler.hpp:92
@ LINE_CONSTRAINT
Definition: DefaultEventHandler.hpp:93
@ NUM_CONSTRAINT_TYPES
Definition: DefaultEventHandler.hpp:97
MouseButtonEvent
Definition: DefaultEventHandler.hpp:80
@ BUTTON_DRAG
Definition: DefaultEventHandler.hpp:83
@ BUTTON_RELEASE
Definition: DefaultEventHandler.hpp:84
@ BUTTON_PUSH
Definition: DefaultEventHandler.hpp:82
@ BUTTON_NOTHING
Definition: DefaultEventHandler.hpp:85
Definition: BulletCollisionDetector.cpp:65
Definition: DefaultEventHandler.hpp:60
dart::dynamics::ShapeFrame * frame
Definition: DefaultEventHandler.hpp:61
Eigen::Vector3d normal
Definition: DefaultEventHandler.hpp:64
std::shared_ptr< dart::dynamics::Shape > shape
Definition: DefaultEventHandler.hpp:62
Eigen::Vector3d position
Definition: DefaultEventHandler.hpp:63