DART  6.6.2
Viewer.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2018, 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_VIEWER_HPP_
34 #define DART_GUI_OSG_VIEWER_HPP_
35 
36 #include <map>
37 #include <unordered_set>
38 #include <memory>
39 
40 #include <osgViewer/Viewer>
41 #include <osgShadow/ShadowTechnique>
42 
43 #include <Eigen/Core>
44 
45 #include "dart/common/Subject.hpp"
46 
47 namespace dart {
48 
49 namespace simulation {
50 class World;
51 } // namespace simulation
52 
53 namespace dynamics {
54 class Entity;
55 class SimpleFrame;
56 class Shape;
57 class BodyNode;
58 } // namespace dynamics
59 
60 namespace gui {
61 namespace osg {
62 
63 class WorldNode;
64 class DefaultEventHandler;
65 class DragAndDrop;
66 class SimpleFrameDnD;
67 class SimpleFrameShapeDnD;
68 class InteractiveFrame;
69 class InteractiveFrameDnD;
70 class BodyNodeDnD;
71 class Viewer;
72 class SaveScreen;
73 
74 class ViewerAttachment : public virtual ::osg::Group
75 {
76 public:
77 
78  friend class Viewer;
79 
82 
84  virtual ~ViewerAttachment();
85 
88  virtual void refresh() = 0;
89 
90  Viewer* getViewer();
91 
92  const Viewer* getViewer() const;
93 
94 protected:
95 
99  virtual void customAttach(Viewer* newViewer);
100 
105  virtual void attach(Viewer* newViewer);
106 
107 
108 
109 private:
110 
112 
113 };
114 
115 class Viewer : public osgViewer::Viewer, public dart::common::Subject
116 {
117 public:
120  Viewer(const ::osg::Vec4& clearColor = ::osg::Vec4(0.9,0.9,0.9,1.0));
121 
123  virtual ~Viewer();
124 
131  // TODO(MXG): Add a bool argument that instructs the viewer to append a date
132  // and time to the name of the file.
133  void captureScreen(const std::string& filename);
134 
145  void record(const std::string& directory, const std::string& prefix = "image",
146  bool restart = false, std::size_t digits=6);
147 
151  void pauseRecording();
152 
154  bool isRecording() const;
155 
157  virtual void switchDefaultEventHandler(bool _on);
158 
161 
163  virtual void switchHeadlights(bool _on);
164 
166  bool checkHeadlights() const;
167 
171  void addWorldNode(WorldNode* _newWorldNode, bool _active=true);
172 
174  void removeWorldNode(WorldNode* _oldWorldNode);
175 
177  void removeWorldNode(std::shared_ptr<dart::simulation::World> _oldWorld);
178 
182  std::shared_ptr<dart::simulation::World> _world) const;
183 
186  void addAttachment(ViewerAttachment* _attachment);
187 
189  void removeAttachment(ViewerAttachment* _attachment);
190 
192  const std::unordered_set<ViewerAttachment*>& getAttachments() const;
193 
195  ::osg::Group* getLightGroup();
196 
198  const ::osg::Group* getLightGroup() const;
199 
203  const ::osg::ref_ptr<::osg::LightSource>& getLightSource(std::size_t index = 0) const;
204 
206  void setupDefaultLights();
207 
210  void setUpwardsDirection(const ::osg::Vec3& _up);
211 
214  void setUpwardsDirection(const Eigen::Vector3d& _up);
215 
217  void setWorldNodeActive(WorldNode* _node, bool _active=true);
218 
220  void setWorldNodeActive(std::shared_ptr<dart::simulation::World> _world,
221  bool _active=true);
222 
224  void simulate(bool _on);
225 
227  bool isSimulating() const;
228 
230  void allowSimulation(bool _allow);
231 
233  bool isAllowingSimulation() const;
234 
241 
244 
249  dart::dynamics::Shape* _shape);
250 
253 
256  bool _useExternalIK = true,
257  bool _useWholeBody = false);
258 
261  bool disableDragAndDrop(DragAndDrop* _dnd);
262 
266 
270 
274 
277  bool disableDragAndDrop(BodyNodeDnD* _dnd);
278 
280  const std::string& getInstructions() const;
281 
285  void addInstructionText(const std::string& _instruction);
286 
288  virtual void updateViewer();
289 
291  void updateDragAndDrops();
292 
294  const ::osg::ref_ptr<::osg::Group>& getRootGroup() const;
295 
298  void setVerticalFieldOfView(double fov);
299 
303  double getVerticalFieldOfView() const;
304 
305 protected:
306 
307  friend class SaveScreen;
308 
310  std::size_t mImageSequenceNum;
311 
313  std::size_t mImageDigits;
314 
317 
320 
322  std::string mImageDirectory;
323 
325  std::string mImagePrefix;
326 
328  std::string mScreenCapName;
329 
331  ::osg::ref_ptr<DefaultEventHandler> mDefaultEventHandler;
332 
334  ::osg::ref_ptr<::osg::Group> mRootGroup;
335 
337  ::osg::ref_ptr<::osg::Group> mLightGroup;
338 
340  ::osg::ref_ptr<::osg::Light> mLight1;
341 
343  ::osg::ref_ptr<::osg::LightSource> mLightSource1;
344 
346  ::osg::ref_ptr<::osg::Light> mLight2;
347 
349  ::osg::ref_ptr<::osg::LightSource> mLightSource2;
350 
352  ::osg::Vec3 mUpwards;
353 
355  ::osg::Vec3 mOver;
356 
359 
362 
365 
368  std::map<WorldNode*,bool> mWorldNodes;
369 
370  std::unordered_set<ViewerAttachment*> mAttachments;
371 
373  std::string mInstructions;
374 
375  // TODO(MXG): Consolidate all these maps into a single map of maps which uses
376  // typeid as a key
377 
379  std::map<dart::dynamics::SimpleFrame*,SimpleFrameDnD*> mSimpleFrameDnDMap;
380 
384  std::multimap<dart::dynamics::Shape*,SimpleFrameShapeDnD*> mSimpleFrameShapeDnDMap;
385 
387  std::map<InteractiveFrame*,InteractiveFrameDnD*> mInteractiveFrameDnDMap;
388 
390  std::map<dart::dynamics::BodyNode*,BodyNodeDnD*> mBodyNodeDnDMap;
391 };
392 
393 } // namespace osg
394 } // namespace gui
395 } // namespace dart
396 
397 #endif // DART_GUI_OSG_VIEWER_HPP_
std::size_t index
Definition: SkelParser.cpp:1617
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:78
Entity class is a base class for any objects that exist in the kinematic tree structure of DART.
Definition: Entity.hpp:60
Definition: Shape.hpp:49
The SimpleFrame class offers a user-friendly way of creating arbitrary Frames within the kinematic tr...
Definition: SimpleFrame.hpp:52
Definition: DragAndDrop.hpp:272
Definition: DefaultEventHandler.hpp:101
DragAndDrop is a class that facilitates enabling various kinds of dart Entities to be dragged and dro...
Definition: DragAndDrop.hpp:61
Definition: DragAndDrop.hpp:240
Definition: InteractiveFrame.hpp:112
Definition: Viewer.cpp:56
SimpleFrameDnD is a DragAndDrop implementation for SimpleFrame objects.
Definition: DragAndDrop.hpp:180
SimpleFrameShapeDnD is a version of SimpleFrameDnD that allows a specific Shape within the SimpleFram...
Definition: DragAndDrop.hpp:212
Definition: Viewer.hpp:75
ViewerAttachment()
Default constructor.
Definition: Viewer.cpp:151
Viewer * getViewer()
Definition: Viewer.cpp:165
virtual void attach(Viewer *newViewer)
This function will get called when the visual is attached to a new Viewer.
Definition: Viewer.cpp:183
Viewer * mViewer
Definition: Viewer.hpp:111
virtual ~ViewerAttachment()
Virtual destructor.
Definition: Viewer.cpp:158
virtual void customAttach(Viewer *newViewer)
This function will be called by attach(Viewer*) so you can do customized setup when the Viewer change...
Definition: Viewer.cpp:177
virtual void refresh()=0
This function will get called each time the Viewer is refreshed.
Definition: Viewer.hpp:116
void setUpwardsDirection(const ::osg::Vec3 &_up)
Set the direction that this Viewer should consider to be upwards (default is <0,0,...
Definition: Viewer.cpp:510
Viewer(const ::osg::Vec4 &clearColor=::osg::Vec4(0.9, 0.9, 0.9, 1.0))
Constructor for dart::gui::osg::Viewer.
Definition: Viewer.cpp:193
bool isSimulating() const
Return true iff this Viewer is currently set to simulate.
Definition: Viewer.cpp:569
void removeWorldNode(WorldNode *_oldWorldNode)
Remove a WorldNode from this Viewer.
Definition: Viewer.cpp:389
void simulate(bool _on)
Set all currently active WorldNodes to simulate _on.
Definition: Viewer.cpp:553
void addWorldNode(WorldNode *_newWorldNode, bool _active=true)
Add a WorldNode to this Viewer.
Definition: Viewer.cpp:372
virtual void switchHeadlights(bool _on)
Pass in true to turn headlights on, false to turn headlights off.
Definition: Viewer.cpp:313
bool mSimulating
True iff this Viewer is currently simulating.
Definition: Viewer.hpp:358
WorldNode * getWorldNode(std::shared_ptr< dart::simulation::World > _world) const
Get the WorldNode associated with the given _world.
Definition: Viewer.cpp:412
std::string mImageDirectory
Directory for saving images.
Definition: Viewer.hpp:322
DragAndDrop * enableDragAndDrop(dart::dynamics::Entity *_entity)
Returns a nullptr if _entity is not a type that can support the built-in drag and drop features,...
Definition: Viewer.cpp:590
const std::string & getInstructions() const
Get a string containing the user interface constructions for this Viewer.
Definition: Viewer.cpp:795
void addAttachment(ViewerAttachment *_attachment)
Add an attachment to this Viewer.
Definition: Viewer.cpp:432
void record(const std::string &directory, const std::string &prefix="image", bool restart=false, std::size_t digits=6)
As the screen refreshes, save screen capture images to the specified directory.
Definition: Viewer.cpp:255
std::multimap< dart::dynamics::Shape *, SimpleFrameShapeDnD * > mSimpleFrameShapeDnDMap
Multimap from Shape ptrs to SimpleFrameShapeDnD ptrs.
Definition: Viewer.hpp:384
bool isAllowingSimulation() const
Return true iff this Viewer is currently allowing simulation to happen.
Definition: Viewer.cpp:584
std::string mInstructions
string of instructions for this Viewer
Definition: Viewer.hpp:373
std::string mScreenCapName
Name for the next screen capture.
Definition: Viewer.hpp:328
::osg::ref_ptr< DefaultEventHandler > mDefaultEventHandler
Default WorldNodeEventHandler for this dart::gui::osg::Viewer.
Definition: Viewer.hpp:331
const ::osg::ref_ptr<::osg::LightSource > & getLightSource(std::size_t index=0) const
Get one of the LightSources of this Viewer index either 0 or 1 Useful for shadowing techniques.
Definition: Viewer.cpp:475
::osg::ref_ptr<::osg::Light > mLight2
Non-headlights Light #2.
Definition: Viewer.hpp:346
void setVerticalFieldOfView(double fov)
Sets the vertical field of view of the master camera of the view.
Definition: Viewer.cpp:847
void allowSimulation(bool _allow)
Prevent simulation from starting, even if simulate(true) is called.
Definition: Viewer.cpp:575
virtual void updateViewer()
Called automatically at the beginning of each render cycle.
Definition: Viewer.cpp:807
std::size_t mImageSequenceNum
Current number of the image sequence for screen recording.
Definition: Viewer.hpp:310
::osg::Vec3 mOver
Vector pointing to the side.
Definition: Viewer.hpp:355
::osg::Vec3 mUpwards
Vector pointing upwards.
Definition: Viewer.hpp:352
void updateDragAndDrops()
Called automatically by updateViewer()
Definition: Viewer.cpp:813
::osg::ref_ptr<::osg::Light > mLight1
Non-headlights Light #1.
Definition: Viewer.hpp:340
bool disableDragAndDrop(DragAndDrop *_dnd)
Delete a DragAndDrop object.
Definition: Viewer.cpp:706
void setupDefaultLights()
Set up the default lighting scheme.
Definition: Viewer.cpp:484
bool mHeadlights
True iff headlights were last set to be on.
Definition: Viewer.hpp:364
::osg::Group * getLightGroup()
Get the Group node that contains the LightSources for this Viewer.
Definition: Viewer.cpp:463
::osg::ref_ptr<::osg::LightSource > mLightSource2
Non-headlights LightSource #2.
Definition: Viewer.hpp:349
void captureScreen(const std::string &filename)
Capture the current screen in a png file.
Definition: Viewer.cpp:238
void addInstructionText(const std::string &_instruction)
Add something to the instructions for this Viewer.
Definition: Viewer.cpp:801
::osg::ref_ptr<::osg::Group > mLightGroup
The Group Node containing light sources.
Definition: Viewer.hpp:337
virtual ~Viewer()
Destructor.
Definition: Viewer.cpp:227
void pauseRecording()
If the Viewer is recording, then pause the recording.
Definition: Viewer.cpp:282
void setWorldNodeActive(WorldNode *_node, bool _active=true)
Set the given WorldNode to active.
Definition: Viewer.cpp:536
std::unordered_set< ViewerAttachment * > mAttachments
Definition: Viewer.hpp:370
double getVerticalFieldOfView() const
Returns the vertical field of view of the master camera of the view.
Definition: Viewer.cpp:878
::osg::ref_ptr<::osg::Group > mRootGroup
The root node of this Viewer.
Definition: Viewer.hpp:334
virtual void switchDefaultEventHandler(bool _on)
Creates the default event handler for this dart::gui::osg::Viewer.
Definition: Viewer.cpp:299
std::string mImagePrefix
Prefix to apply to images.
Definition: Viewer.hpp:325
std::map< WorldNode *, bool > mWorldNodes
Map of WorldNodes in this dart::gui::osg::Viewer.
Definition: Viewer.hpp:368
const ::osg::ref_ptr<::osg::Group > & getRootGroup() const
Get the root ::osg::Group of this Viewer.
Definition: Viewer.cpp:841
bool isRecording() const
Returns true if the Viewer is currently recording.
Definition: Viewer.cpp:293
::osg::ref_ptr<::osg::LightSource > mLightSource1
Non-headlights LightSource #1.
Definition: Viewer.hpp:343
std::map< dart::dynamics::SimpleFrame *, SimpleFrameDnD * > mSimpleFrameDnDMap
Map from SimpleFrame ptrs to SimpleFrameDnD ptrs.
Definition: Viewer.hpp:379
DefaultEventHandler * getDefaultEventHandler() const
Return a pointer to the default event handler.
Definition: Viewer.cpp:307
void removeAttachment(ViewerAttachment *_attachment)
Remove the attachment from this Viewer.
Definition: Viewer.cpp:444
std::size_t mImageDigits
Number of digits to use when saving an image sequence.
Definition: Viewer.hpp:313
std::map< InteractiveFrame *, InteractiveFrameDnD * > mInteractiveFrameDnDMap
Map from InteractiveFrame ptrs to InteractiveFrameDnD ptrs.
Definition: Viewer.hpp:387
bool mAllowSimulation
True iff this Viewer is allowing simulation.
Definition: Viewer.hpp:361
std::map< dart::dynamics::BodyNode *, BodyNodeDnD * > mBodyNodeDnDMap
Map from BodyNode ptrs to BodyNodeDnD ptrs.
Definition: Viewer.hpp:390
bool mScreenCapture
Whether or not the Viewer is staged for a screen capture.
Definition: Viewer.hpp:319
bool mRecording
Whether or not the Viewer is currently recording.
Definition: Viewer.hpp:316
const std::unordered_set< ViewerAttachment * > & getAttachments() const
Get the set of attachments in this Viewer.
Definition: Viewer.cpp:457
bool checkHeadlights() const
True iff headlights are currently set to true.
Definition: Viewer.cpp:366
WorldNode class encapsulates a World to be displayed in OpenSceneGraph.
Definition: WorldNode.hpp:65
class World
Definition: World.hpp:78
Definition: BulletCollisionDetector.cpp:63