DART 6.12.2
Loading...
Searching...
No Matches
DragAndDrop.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_DRAGANDDROP_HPP_
34#define DART_GUI_OSG_DRAGANDDROP_HPP_
35
36#include <functional>
37
38#include <Eigen/Geometry>
39
43
45
46namespace dart {
47
48namespace dynamics {
49class SimpleFrame;
50} // namespace dynamics
51
52namespace gui {
53namespace osg {
54
55class Viewer;
56class InteractiveFrame;
57
61{
62public:
63 enum class RotationOption : int
64 {
65
66 HOLD_MODKEY = 0, // Default setting, hold ctrl key to rotate
69
70 };
71
74
76 virtual ~DragAndDrop();
77
80
82 virtual void update();
83
86 void setObstructable(bool _obstructable);
87
91 bool isObstructable() const;
92
94 virtual void move() = 0;
95
98 virtual void saveState() = 0;
99
102 virtual void release();
103
105 virtual Eigen::Vector3d getConstrainedDx() const;
106
108 virtual Eigen::AngleAxisd getConstrainedRotation() const;
109
111 void unconstrain();
112
116 void constrainToLine(const Eigen::Vector3d& slope);
117
121 void constrainToPlane(const Eigen::Vector3d& normal);
122
124 bool isMoving() const;
125
128
131
133 void setRotationModKey(::osgGA::GUIEventAdapter::ModKeyMask rotationModKey);
134
136 ::osgGA::GUIEventAdapter::ModKeyMask getRotationModKey() const;
137
138protected:
141 const dart::common::Subject* subscription) override;
142
145
148
150 Eigen::Vector3d mPickedPosition;
151
154 Eigen::Vector3d mVector;
155
157 Eigen::Vector3d mPivot;
158
161
164
167
170
172 ::osgGA::GUIEventAdapter::ModKeyMask mRotationModKey;
173};
174
175//==============================================================================
178{
179public:
182
184 virtual ~SimpleFrameDnD() = default;
185
188
189 // Documentation inherited
190 void move() override;
191
192 // Documentation inherited
193 void saveState() override;
194
195protected:
198
200 Eigen::AngleAxisd mSavedRotation;
201};
202
203//==============================================================================
208{
209public:
212 Viewer* viewer,
214 dart::dynamics::Shape* shape);
215
217 virtual ~SimpleFrameShapeDnD() = default;
218
221
222 // Documentation inherited
223 void update() override;
224
225protected:
226 // Documentation inherited
228 const dart::common::Subject* subscription) override;
229
232};
233
234//==============================================================================
236{
237public:
240
242 virtual ~InteractiveFrameDnD() = default;
243
245 InteractiveFrame* getFrame() const;
246
247 // Documentation inherited
248 void update() override;
249
250 // Documentation inherited
251 void move() override;
252
253 // Documentation inherited
254 void saveState() override;
255
256protected:
258 std::vector<DragAndDrop*> mDnDs;
259
262};
263
264//==============================================================================
266{
267public:
270 Viewer* viewer,
272 bool useExternalIK = true,
273 bool useWholeBody = false);
274
276 virtual ~BodyNodeDnD() = default;
277
280
281 // Documentation inherited
282 void update() override;
283
284 // Documentation inherited
285 void move() override;
286
287 // Documentation inherited
288 void saveState() override;
289
290 // Documentation inherited
291 void release() override;
292
297 void useExternalIK(bool external);
298
300 bool isUsingExternalIK() const;
301
303 void useWholeBody(bool wholeBody);
304
306 bool isUsingWholeBody() const;
307
310 ::osgGA::GUIEventAdapter::ModKeyMask modkey);
311
313 ::osgGA::GUIEventAdapter::ModKeyMask getPreserveOrientationModKey() const;
314
316 void setJointRestrictionModKey(::osgGA::GUIEventAdapter::ModKeyMask modkey);
317
319 ::osgGA::GUIEventAdapter::ModKeyMask getJointRestrictionModKey() const;
320
321protected:
324
327
330 Eigen::Vector3d mSavedGlobalOffset;
331
334 Eigen::Vector3d mSavedLocalOffset;
335
337 Eigen::AngleAxisd mSavedRotation;
338
341
344
346 ::osgGA::GUIEventAdapter::ModKeyMask mPreserveOrientationModKey;
347
349 ::osgGA::GUIEventAdapter::ModKeyMask mJointRestrictionModKey;
350
353};
354
355} // namespace osg
356} // namespace gui
357} // namespace dart
358
359#endif // DART_GUI_OSG_DRAGANDDROP_HPP_
const CollisionOption & option
Collision option of DART.
Definition FCLCollisionDetector.cpp:157
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
BodyNode class represents a single node of the skeleton.
Definition BodyNode.hpp:79
Entity class is a base class for any objects that exist in the kinematic tree structure of DART.
Definition Entity.hpp:62
Definition Shape.hpp:54
The SimpleFrame class offers a user-friendly way of creating arbitrary Frames within the kinematic tr...
Definition SimpleFrame.hpp:52
TemplateInverseKinematicsPtr is a templated class that enables users to create a reference-counting I...
Definition InverseKinematicsPtr.hpp:50
Definition DragAndDrop.hpp:266
bool isUsingWholeBody() const
Returns true if this DnD is using the whole body.
Definition DragAndDrop.cpp:860
void update() override
Called when mouse events are being handled.
Definition DragAndDrop.cpp:679
dart::dynamics::BodyNode * getBodyNode() const
Get the BodyNode associated with this DnD.
Definition DragAndDrop.cpp:673
Eigen::AngleAxisd mSavedRotation
The rotation of the BodyNode.
Definition DragAndDrop.hpp:337
::osgGA::GUIEventAdapter::ModKeyMask getPreserveOrientationModKey() const
Get the key that will preserve the orientation of the body.
Definition DragAndDrop.cpp:873
::osgGA::GUIEventAdapter::ModKeyMask mPreserveOrientationModKey
Key for preserving orientation.
Definition DragAndDrop.hpp:346
void setJointRestrictionModKey(::osgGA::GUIEventAdapter::ModKeyMask modkey)
Set the key that will restrict which joints are used by the DnD.
Definition DragAndDrop.cpp:880
std::size_t mAdditionalBodyNodes
Currently unused, but this will change in the future.
Definition DragAndDrop.hpp:352
void setPreserveOrientationModKey(::osgGA::GUIEventAdapter::ModKeyMask modkey)
Set the key that will preserve the orientation of the body.
Definition DragAndDrop.cpp:866
void useWholeBody(bool wholeBody)
Tell this DnD to use the whole body.
Definition DragAndDrop.cpp:854
bool isUsingExternalIK() const
Returns true if it is using an external IK.
Definition DragAndDrop.cpp:848
::osgGA::GUIEventAdapter::ModKeyMask mJointRestrictionModKey
Key for restricting joint usage.
Definition DragAndDrop.hpp:349
dart::dynamics::WeakBodyNodePtr mBodyNode
The BodyNode associated with this DnD.
Definition DragAndDrop.hpp:323
bool mUseWholeBody
Whether to use the whole body.
Definition DragAndDrop.hpp:343
void saveState() override
Called when a point gets picked, and is used to save the current state of the Entity.
Definition DragAndDrop.cpp:801
Eigen::Vector3d mSavedLocalOffset
The offset of the pick from the BodyNode origin, expressed in local coordinates.
Definition DragAndDrop.hpp:334
bool mUseExternalIK
Whether to use an external IK.
Definition DragAndDrop.hpp:340
Eigen::Vector3d mSavedGlobalOffset
The offset of the pick from the BodyNode origin, expressed in global coordinates.
Definition DragAndDrop.hpp:330
void move() override
Called to specify how the Entity should be moved.
Definition DragAndDrop.cpp:726
virtual ~BodyNodeDnD()=default
Virtual destructor.
void release() override
Called when the user lets go of the object that they are dragging and dropping.
Definition DragAndDrop.cpp:828
dart::dynamics::InverseKinematicsPtr mIK
The IK module being used by this DnD.
Definition DragAndDrop.hpp:326
::osgGA::GUIEventAdapter::ModKeyMask getJointRestrictionModKey() const
Get the key that will restrict which joints are used by the DnD.
Definition DragAndDrop.cpp:887
void useExternalIK(bool external)
Tell this DnD to use an external IK instead of the one embedded in the BodyNode.
Definition DragAndDrop.cpp:842
DragAndDrop is a class that facilitates enabling various kinds of dart Entities to be dragged and dro...
Definition DragAndDrop.hpp:61
Eigen::Vector3d mPivot
Point in space about which rotations should happen.
Definition DragAndDrop.hpp:157
virtual void update()
Called when mouse events are being handled.
Definition DragAndDrop.cpp:77
void setRotationOption(RotationOption option)
Set the option for triggering rotations instead of translations.
Definition DragAndDrop.cpp:213
::osgGA::GUIEventAdapter::ModKeyMask mRotationModKey
Modkey for rotation.
Definition DragAndDrop.hpp:172
dart::dynamics::Entity * getEntity() const
Get the Entity that this DragAndDrop is associated with.
Definition DragAndDrop.cpp:71
void constrainToPlane(const Eigen::Vector3d &normal)
Constrain translation to only occur within the plane defined by the given normal, or constrain rotati...
Definition DragAndDrop.cpp:200
Eigen::Vector3d mPickedPosition
The location in the world that was picked by the user.
Definition DragAndDrop.hpp:150
virtual void saveState()=0
Called when a point gets picked, and is used to save the current state of the Entity.
RotationOption getRotationOption() const
Get the current rotation option for this DnD.
Definition DragAndDrop.cpp:219
bool mAmMoving
Whether this DnD is currently moving.
Definition DragAndDrop.hpp:166
virtual Eigen::AngleAxisd getConstrainedRotation() const
Default method for getting the rotation requested by the user.
Definition DragAndDrop.cpp:149
virtual void move()=0
Called to specify how the Entity should be moved.
void handleDestructionNotification(const dart::common::Subject *subscription) override
Perform cleanup when the subject is destroyed.
Definition DragAndDrop.cpp:238
::osgGA::GUIEventAdapter::ModKeyMask getRotationModKey() const
Get the modkey that will be used to toggle rotation for this DnD.
Definition DragAndDrop.cpp:232
void setObstructable(bool _obstructable)
If true is passed in, this object will only be drag and droppable if there are no other objects betwe...
Definition DragAndDrop.cpp:124
bool isObstructable() const
If this is true, then this object will only be drag and droppable if there are no other objects betwe...
Definition DragAndDrop.cpp:130
bool isMoving() const
Returns the mAmMoving flag.
Definition DragAndDrop.cpp:207
void constrainToLine(const Eigen::Vector3d &slope)
Constrain translation to only occur along the given slope, or constrain rotation to only occur about ...
Definition DragAndDrop.cpp:193
virtual ~DragAndDrop()
Virtual destructor.
Definition DragAndDrop.cpp:65
ConstraintType mConstraintType
Constraint type for this DnD.
Definition DragAndDrop.hpp:160
RotationOption
Definition DragAndDrop.hpp:64
RotationOption mRotationOption
Option for rotation settings.
Definition DragAndDrop.hpp:169
virtual Eigen::Vector3d getConstrainedDx() const
Default method for getting the translation requested by the user.
Definition DragAndDrop.cpp:142
Viewer * mViewer
Pointer to the DnD's Viewer.
Definition DragAndDrop.hpp:144
virtual void release()
Called when the user lets go of the object that they are dragging and dropping.
Definition DragAndDrop.cpp:136
void unconstrain()
Remove all constraints from the dragging and dropping.
Definition DragAndDrop.cpp:187
Eigen::Vector3d mVector
Reference vector for constraint (slope for line constraint, or normal for plane constraint)
Definition DragAndDrop.hpp:154
void setRotationModKey(::osgGA::GUIEventAdapter::ModKeyMask rotationModKey)
Set the modkey that will be used to toggle rotation for this DnD.
Definition DragAndDrop.cpp:225
dart::dynamics::Entity * mEntity
Pointer to the DnD's Entity.
Definition DragAndDrop.hpp:147
bool mAmObstructable
Whether other objects can block this one from being picked.
Definition DragAndDrop.hpp:163
Definition DragAndDrop.hpp:236
void saveState() override
Called when a point gets picked, and is used to save the current state of the Entity.
Definition DragAndDrop.cpp:651
virtual ~InteractiveFrameDnD()=default
Virtual destructor.
InteractiveFrame * getFrame() const
Get the frame associated with this DnD.
Definition DragAndDrop.cpp:575
InteractiveFrame * mInteractiveFrame
Pointer to the interactive frame.
Definition DragAndDrop.hpp:261
void move() override
Called to specify how the Entity should be moved.
Definition DragAndDrop.cpp:645
std::vector< DragAndDrop * > mDnDs
Vector of DnD components that are united under this DnD.
Definition DragAndDrop.hpp:258
void update() override
Called when mouse events are being handled.
Definition DragAndDrop.cpp:581
Definition InteractiveFrame.hpp:110
SimpleFrameDnD is a DragAndDrop implementation for SimpleFrame objects.
Definition DragAndDrop.hpp:178
void move() override
Called to specify how the Entity should be moved.
Definition DragAndDrop.cpp:263
dart::dynamics::SimpleFrame * getSimpleFrame() const
Get the SimpleFrame associated with this DnD.
Definition DragAndDrop.cpp:257
Eigen::AngleAxisd mSavedRotation
The saved rotation of the frame.
Definition DragAndDrop.hpp:200
void saveState() override
Called when a point gets picked, and is used to save the current state of the Entity.
Definition DragAndDrop.cpp:298
dart::dynamics::SimpleFrame * mFrame
SimpleFrame pointer.
Definition DragAndDrop.hpp:197
virtual ~SimpleFrameDnD()=default
Virtual destructor.
SimpleFrameShapeDnD is a version of SimpleFrameDnD that allows a specific Shape within the SimpleFram...
Definition DragAndDrop.hpp:208
void handleDestructionNotification(const dart::common::Subject *subscription) override
Perform cleanup when the subject is destroyed.
Definition DragAndDrop.cpp:365
dart::dynamics::Shape * mShape
Shape associated with this DnD.
Definition DragAndDrop.hpp:231
void update() override
Called when mouse events are being handled.
Definition DragAndDrop.cpp:321
virtual ~SimpleFrameShapeDnD()=default
Virtual destructor.
dart::dynamics::Shape * getShape() const
Get the Shape associated with this DnD.
Definition DragAndDrop.cpp:315
Definition Viewer.hpp:111
ConstraintType
Definition DefaultEventHandler.hpp:89
Definition BulletCollisionDetector.cpp:60