DART 6.10.1
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
44
45namespace dart {
46
47namespace dynamics {
48class SimpleFrame;
49} // namespace dynamics
50
51namespace gui {
52namespace osg {
53
54class Viewer;
55class InteractiveFrame;
56
60{
61public:
62 enum class RotationOption : int
63 {
64
65 HOLD_MODKEY = 0, // Default setting, hold ctrl key to rotate
68
69 };
70
73
75 virtual ~DragAndDrop();
76
79
81 virtual void update();
82
85 void setObstructable(bool _obstructable);
86
90 bool isObstructable() const;
91
93 virtual void move() = 0;
94
97 virtual void saveState() = 0;
98
101 virtual void release();
102
104 virtual Eigen::Vector3d getConstrainedDx() const;
105
107 virtual Eigen::AngleAxisd getConstrainedRotation() const;
108
110 void unconstrain();
111
115 void constrainToLine(const Eigen::Vector3d& slope);
116
120 void constrainToPlane(const Eigen::Vector3d& normal);
121
123 bool isMoving() const;
124
127
130
132 void setRotationModKey(::osgGA::GUIEventAdapter::ModKeyMask rotationModKey);
133
135 ::osgGA::GUIEventAdapter::ModKeyMask getRotationModKey() const;
136
137protected:
140 const dart::common::Subject* subscription) override;
141
144
147
149 Eigen::Vector3d mPickedPosition;
150
153 Eigen::Vector3d mVector;
154
156 Eigen::Vector3d mPivot;
157
160
163
166
169
171 ::osgGA::GUIEventAdapter::ModKeyMask mRotationModKey;
172};
173
174//==============================================================================
177{
178public:
181
183 virtual ~SimpleFrameDnD() = default;
184
187
188 // Documentation inherited
189 void move() override;
190
191 // Documentation inherited
192 void saveState() override;
193
194protected:
197
199 Eigen::AngleAxisd mSavedRotation;
200};
201
202//==============================================================================
207{
208public:
211 Viewer* viewer,
213 dart::dynamics::Shape* shape);
214
216 virtual ~SimpleFrameShapeDnD() = default;
217
220
221 // Documentation inherited
222 void update() override;
223
224protected:
225 // Documentation inherited
227 const dart::common::Subject* subscription) override;
228
231};
232
233//==============================================================================
235{
236public:
239
241 virtual ~InteractiveFrameDnD() = default;
242
244 InteractiveFrame* getFrame() const;
245
246 // Documentation inherited
247 void update() override;
248
249 // Documentation inherited
250 void move() override;
251
252 // Documentation inherited
253 void saveState() override;
254
255protected:
257 std::vector<DragAndDrop*> mDnDs;
258
261};
262
263//==============================================================================
265{
266public:
269 Viewer* viewer,
271 bool useExternalIK = true,
272 bool useWholeBody = false);
273
275 virtual ~BodyNodeDnD() = default;
276
279
280 // Documentation inherited
281 void update() override;
282
283 // Documentation inherited
284 void move() override;
285
286 // Documentation inherited
287 void saveState() override;
288
289 // Documentation inherited
290 void release() override;
291
296 void useExternalIK(bool external);
297
299 bool isUsingExternalIK() const;
300
302 void useWholeBody(bool wholeBody);
303
305 bool isUsingWholeBody() const;
306
309 ::osgGA::GUIEventAdapter::ModKeyMask modkey);
310
312 ::osgGA::GUIEventAdapter::ModKeyMask getPreserveOrientationModKey() const;
313
315 void setJointRestrictionModKey(::osgGA::GUIEventAdapter::ModKeyMask modkey);
316
318 ::osgGA::GUIEventAdapter::ModKeyMask getJointRestrictionModKey() const;
319
320protected:
323
326
329 Eigen::Vector3d mSavedGlobalOffset;
330
333 Eigen::Vector3d mSavedLocalOffset;
334
336 Eigen::AngleAxisd mSavedRotation;
337
340
343
345 ::osgGA::GUIEventAdapter::ModKeyMask mPreserveOrientationModKey;
346
348 ::osgGA::GUIEventAdapter::ModKeyMask mJointRestrictionModKey;
349
352};
353
354} // namespace osg
355} // namespace gui
356} // namespace dart
357
358#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:61
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:49
Definition DragAndDrop.hpp:265
bool isUsingWholeBody() const
Returns true if this DnD is using the whole body.
Definition DragAndDrop.cpp:861
void update() override
Called when mouse events are being handled.
Definition DragAndDrop.cpp:680
dart::dynamics::BodyNode * getBodyNode() const
Get the BodyNode associated with this DnD.
Definition DragAndDrop.cpp:674
Eigen::AngleAxisd mSavedRotation
The rotation of the BodyNode.
Definition DragAndDrop.hpp:336
::osgGA::GUIEventAdapter::ModKeyMask getPreserveOrientationModKey() const
Get the key that will preserve the orientation of the body.
Definition DragAndDrop.cpp:874
::osgGA::GUIEventAdapter::ModKeyMask mPreserveOrientationModKey
Key for preserving orientation.
Definition DragAndDrop.hpp:345
void setJointRestrictionModKey(::osgGA::GUIEventAdapter::ModKeyMask modkey)
Set the key that will restrict which joints are used by the DnD.
Definition DragAndDrop.cpp:881
std::size_t mAdditionalBodyNodes
Currently unused, but this will change in the future.
Definition DragAndDrop.hpp:351
void setPreserveOrientationModKey(::osgGA::GUIEventAdapter::ModKeyMask modkey)
Set the key that will preserve the orientation of the body.
Definition DragAndDrop.cpp:867
void useWholeBody(bool wholeBody)
Tell this DnD to use the whole body.
Definition DragAndDrop.cpp:855
bool isUsingExternalIK() const
Returns true if it is using an external IK.
Definition DragAndDrop.cpp:849
::osgGA::GUIEventAdapter::ModKeyMask mJointRestrictionModKey
Key for restricting joint usage.
Definition DragAndDrop.hpp:348
dart::dynamics::WeakBodyNodePtr mBodyNode
The BodyNode associated with this DnD.
Definition DragAndDrop.hpp:322
bool mUseWholeBody
Whether to use the whole body.
Definition DragAndDrop.hpp:342
void saveState() override
Called when a point gets picked, and is used to save the current state of the Entity.
Definition DragAndDrop.cpp:802
Eigen::Vector3d mSavedLocalOffset
The offset of the pick from the BodyNode origin, expressed in local coordinates.
Definition DragAndDrop.hpp:333
bool mUseExternalIK
Whether to use an external IK.
Definition DragAndDrop.hpp:339
Eigen::Vector3d mSavedGlobalOffset
The offset of the pick from the BodyNode origin, expressed in global coordinates.
Definition DragAndDrop.hpp:329
void move() override
Called to specify how the Entity should be moved.
Definition DragAndDrop.cpp:727
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:829
dart::dynamics::InverseKinematicsPtr mIK
The IK module being used by this DnD.
Definition DragAndDrop.hpp:325
::osgGA::GUIEventAdapter::ModKeyMask getJointRestrictionModKey() const
Get the key that will restrict which joints are used by the DnD.
Definition DragAndDrop.cpp:888
void useExternalIK(bool external)
Tell this DnD to use an external IK instead of the one embedded in the BodyNode.
Definition DragAndDrop.cpp:843
DragAndDrop is a class that facilitates enabling various kinds of dart Entities to be dragged and dro...
Definition DragAndDrop.hpp:60
Eigen::Vector3d mPivot
Point in space about which rotations should happen.
Definition DragAndDrop.hpp:156
virtual void update()
Called when mouse events are being handled.
Definition DragAndDrop.cpp:78
void setRotationOption(RotationOption option)
Set the option for triggering rotations instead of translations.
Definition DragAndDrop.cpp:214
::osgGA::GUIEventAdapter::ModKeyMask mRotationModKey
Modkey for rotation.
Definition DragAndDrop.hpp:171
dart::dynamics::Entity * getEntity() const
Get the Entity that this DragAndDrop is associated with.
Definition DragAndDrop.cpp:72
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:201
Eigen::Vector3d mPickedPosition
The location in the world that was picked by the user.
Definition DragAndDrop.hpp:149
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:220
bool mAmMoving
Whether this DnD is currently moving.
Definition DragAndDrop.hpp:165
virtual Eigen::AngleAxisd getConstrainedRotation() const
Default method for getting the rotation requested by the user.
Definition DragAndDrop.cpp:150
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:239
::osgGA::GUIEventAdapter::ModKeyMask getRotationModKey() const
Get the modkey that will be used to toggle rotation for this DnD.
Definition DragAndDrop.cpp:233
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:125
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:131
bool isMoving() const
Returns the mAmMoving flag.
Definition DragAndDrop.cpp:208
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:194
virtual ~DragAndDrop()
Virtual destructor.
Definition DragAndDrop.cpp:66
ConstraintType mConstraintType
Constraint type for this DnD.
Definition DragAndDrop.hpp:159
RotationOption
Definition DragAndDrop.hpp:63
RotationOption mRotationOption
Option for rotation settings.
Definition DragAndDrop.hpp:168
virtual Eigen::Vector3d getConstrainedDx() const
Default method for getting the translation requested by the user.
Definition DragAndDrop.cpp:143
Viewer * mViewer
Pointer to the DnD's Viewer.
Definition DragAndDrop.hpp:143
virtual void release()
Called when the user lets go of the object that they are dragging and dropping.
Definition DragAndDrop.cpp:137
void unconstrain()
Remove all constraints from the dragging and dropping.
Definition DragAndDrop.cpp:188
Eigen::Vector3d mVector
Reference vector for constraint (slope for line constraint, or normal for plane constraint)
Definition DragAndDrop.hpp:153
void setRotationModKey(::osgGA::GUIEventAdapter::ModKeyMask rotationModKey)
Set the modkey that will be used to toggle rotation for this DnD.
Definition DragAndDrop.cpp:226
dart::dynamics::Entity * mEntity
Pointer to the DnD's Entity.
Definition DragAndDrop.hpp:146
bool mAmObstructable
Whether other objects can block this one from being picked.
Definition DragAndDrop.hpp:162
Definition DragAndDrop.hpp:235
void saveState() override
Called when a point gets picked, and is used to save the current state of the Entity.
Definition DragAndDrop.cpp:652
virtual ~InteractiveFrameDnD()=default
Virtual destructor.
InteractiveFrame * getFrame() const
Get the frame associated with this DnD.
Definition DragAndDrop.cpp:576
InteractiveFrame * mInteractiveFrame
Pointer to the interactive frame.
Definition DragAndDrop.hpp:260
void move() override
Called to specify how the Entity should be moved.
Definition DragAndDrop.cpp:646
std::vector< DragAndDrop * > mDnDs
Vector of DnD components that are united under this DnD.
Definition DragAndDrop.hpp:257
void update() override
Called when mouse events are being handled.
Definition DragAndDrop.cpp:582
Definition InteractiveFrame.hpp:110
SimpleFrameDnD is a DragAndDrop implementation for SimpleFrame objects.
Definition DragAndDrop.hpp:177
void move() override
Called to specify how the Entity should be moved.
Definition DragAndDrop.cpp:264
dart::dynamics::SimpleFrame * getSimpleFrame() const
Get the SimpleFrame associated with this DnD.
Definition DragAndDrop.cpp:258
Eigen::AngleAxisd mSavedRotation
The saved rotation of the frame.
Definition DragAndDrop.hpp:199
void saveState() override
Called when a point gets picked, and is used to save the current state of the Entity.
Definition DragAndDrop.cpp:299
dart::dynamics::SimpleFrame * mFrame
SimpleFrame pointer.
Definition DragAndDrop.hpp:196
virtual ~SimpleFrameDnD()=default
Virtual destructor.
SimpleFrameShapeDnD is a version of SimpleFrameDnD that allows a specific Shape within the SimpleFram...
Definition DragAndDrop.hpp:207
void handleDestructionNotification(const dart::common::Subject *subscription) override
Perform cleanup when the subject is destroyed.
Definition DragAndDrop.cpp:366
dart::dynamics::Shape * mShape
Shape associated with this DnD.
Definition DragAndDrop.hpp:230
void update() override
Called when mouse events are being handled.
Definition DragAndDrop.cpp:322
virtual ~SimpleFrameShapeDnD()=default
Virtual destructor.
dart::dynamics::Shape * getShape() const
Get the Shape associated with this DnD.
Definition DragAndDrop.cpp:316
Definition Viewer.hpp:112
ConstraintType
Definition DefaultEventHandler.hpp:90
Definition BulletCollisionDetector.cpp:65