All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Scene.hh
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Nate Koenig
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 #ifndef _SCENE_HH_
18 #define _SCENE_HH_
19 
20 #include <vector>
21 #include <map>
22 #include <string>
23 #include <list>
24 #include <boost/enable_shared_from_this.hpp>
25 #include <boost/shared_ptr.hpp>
26 
27 #include "sdf/sdf.hh"
28 #include "msgs/msgs.hh"
29 
30 #include "rendering/RenderTypes.hh"
31 
33 #include "common/Events.hh"
34 #include "common/Color.hh"
35 #include "math/Vector2i.hh"
36 
37 namespace SkyX
38 {
39  class SkyX;
40  class BasicController;
41 }
42 
43 namespace Ogre
44 {
45  class SceneManager;
46  class RaySceneQuery;
47  class Node;
48  class Entity;
49  class Mesh;
50  class Vector3;
51  class Quaternion;
52 }
53 
54 namespace boost
55 {
56  class mutex;
57 }
58 
59 namespace gazebo
60 {
61  namespace rendering
62  {
63  class Projector;
64  class Light;
65  class Visual;
66  class Grid;
67  class Heightmap;
68 
71 
76  class Scene : public boost::enable_shared_from_this<Scene>
77  {
79  private: Scene() {}
80 
86  public: Scene(const std::string &_name,
87  bool _enableVisualizations = false);
88 
90  public: virtual ~Scene();
91 
94  public: void Load(sdf::ElementPtr _scene);
95 
97  public: void Load();
98 
100  public: void Init();
101 
103  public: void PreRender();
104 
107  public: Ogre::SceneManager *GetManager() const;
108 
111  public: std::string GetName() const;
112 
115  public: void SetAmbientColor(const common::Color &_color);
116 
119  public: common::Color GetAmbientColor() const;
120 
123  public: void SetBackgroundColor(const common::Color &_color);
124 
127  public: common::Color GetBackgroundColor() const;
128 
134  public: void CreateGrid(uint32_t _cellCount, float _cellLength,
135  float _lineWidth, const common::Color &_color);
136 
140  public: Grid *GetGrid(uint32_t _index) const;
141 
144  public: uint32_t GetGridCount() const;
145 
151  public: CameraPtr CreateCamera(const std::string &_name,
152  bool _autoRender = true);
153 
159  public: DepthCameraPtr CreateDepthCamera(const std::string &_name,
160  bool _autoRender = true);
161 
167  // public: GpuLaserPtr CreateGpuLaser(const std::string &_name,
168  // bool _autoRender = true);
169 
172  public: uint32_t GetCameraCount() const;
173 
178  public: CameraPtr GetCamera(uint32_t _index) const;
179 
183  public: CameraPtr GetCamera(const std::string &_name) const;
184 
190  public: UserCameraPtr CreateUserCamera(const std::string &_name);
191 
194  public: uint32_t GetUserCameraCount() const;
195 
201  public: UserCameraPtr GetUserCamera(uint32_t _index) const;
202 
206  public: LightPtr GetLight(const std::string &_name) const;
207 
210  public: uint32_t GetLightCount() const;
211 
216  public: LightPtr GetLight(uint32_t _index) const;
217 
219  public: VisualPtr GetVisual(const std::string &_name) const;
220 
224  public: void SelectVisual(const std::string &_name,
225  const std::string &_mode);
226 
233  public: VisualPtr GetVisualAt(CameraPtr _camera,
234  const math::Vector2i &_mousePos,
235  std::string &_mod);
236 
239  public: void SnapVisualToNearestBelow(const std::string &_visualName);
240 
246  public: VisualPtr GetVisualAt(CameraPtr _camera,
247  const math::Vector2i &_mousePos);
248 
254  public: VisualPtr GetModelVisualAt(CameraPtr _camera,
255  const math::Vector2i &_mousePos);
256 
257 
261  public: VisualPtr GetVisualBelow(const std::string &_visualName);
262 
267  public: void GetVisualsBelowPoint(const math::Vector3 &_pt,
268  std::vector<VisualPtr> &_visuals);
269 
270 
275  public: double GetHeightBelowPoint(const math::Vector3 &_pt);
276 
281  public: math::Vector3 GetFirstContact(CameraPtr _camera,
282  const math::Vector2i &_mousePos);
283 
285  public: void PrintSceneGraph();
286 
291  public: void SetVisible(const std::string &_name, bool _visible);
292 
297  public: void DrawLine(const math::Vector3 &_start,
298  const math::Vector3 &_end,
299  const std::string &_name);
300 
308  public: void SetFog(const std::string &_type,
309  const common::Color &_color,
310  double _density, double _start, double _end);
311 
314  public: uint32_t GetId() const;
315 
318  public: std::string GetIdString() const;
319 
322  public: void SetShadowsEnabled(bool _value);
323 
326  public: bool GetShadowsEnabled() const;
327 
330  public: void AddVisual(VisualPtr _vis);
331 
334  public: void RemoveVisual(VisualPtr _vis);
335 
338  public: void SetGrid(bool _enabled);
339 
342  public: VisualPtr GetWorldVisual() const;
343 
347  public: std::string StripSceneName(const std::string &_name) const;
348 
351  public: Heightmap *GetHeightmap() const;
352 
354  public: void Clear();
355 
360  public: VisualPtr CloneVisual(const std::string &_visualName,
361  const std::string &_newName);
362 
366  public: VisualPtr GetSelectedVisual() const;
367 
370  public: void ViewContacts(bool _view);
371 
373  private: void SetSky();
374 
376  private: void InitDeferredShading();
377 
384  private: Ogre::Entity *GetOgreEntityAt(CameraPtr _camera,
385  const math::Vector2i &_mousePos,
386  bool _ignorSelectionObj);
387 
397  // Code found in Wiki: www.ogre3d.org/wiki/index.php/RetrieveVertexData
398  private: void GetMeshInformation(const Ogre::Mesh *_mesh,
399  size_t &_vertexCount,
400  Ogre::Vector3* &_vertices,
401  size_t &_indexCount,
402  uint64_t* &_indices,
403  const Ogre::Vector3 &_position,
404  const Ogre::Quaternion &_orient,
405  const Ogre::Vector3 &_scale);
406 
410  private: void PrintSceneGraphHelper(const std::string &_prefix,
411  Ogre::Node *_node);
412 
416  private: void OnScene(ConstScenePtr &_msg);
417 
420  private: void OnResponse(ConstResponsePtr &_msg);
421 
424  private: void OnRequest(ConstRequestPtr &_msg);
425 
428  private: void OnJointMsg(ConstJointPtr &_msg);
429 
432  private: bool ProcessSensorMsg(ConstSensorPtr &_msg);
433 
436  private: bool ProcessJointMsg(ConstJointPtr &_msg);
437 
440  private: bool ProcessLinkMsg(ConstLinkPtr &_msg);
441 
444  private: void ProcessSceneMsg(ConstScenePtr &_msg);
445 
448  private: bool ProcessModelMsg(const msgs::Model &_msg);
449 
452  private: void OnSensorMsg(ConstSensorPtr &_msg);
453 
456  private: void OnVisualMsg(ConstVisualPtr &_msg);
457 
460  private: bool ProcessVisualMsg(ConstVisualPtr &_msg);
461 
464  private: void OnLightMsg(ConstLightPtr &_msg);
465 
468  private: void ProcessLightMsg(ConstLightPtr &_msg);
469 
472  private: void ProcessRequestMsg(ConstRequestPtr &_msg);
473 
476  private: void OnSelectionMsg(ConstSelectionPtr &_msg);
477 
480  private: void OnSkyMsg(ConstSkyPtr &_msg);
481 
484  private: void OnModelMsg(ConstModelPtr &_msg);
485 
488  private: void OnPoseMsg(ConstPosePtr &_msg);
489 
492  private: void OnSkeletonPoseMsg(ConstPoseAnimationPtr &_msg);
493 
497  private: void CreateCOMVisual(ConstLinkPtr &_msg, VisualPtr _linkVisual);
498 
502  private: void CreateCOMVisual(sdf::ElementPtr _elem,
503  VisualPtr _linkVisual);
504 
506  private: std::string name;
507 
509  private: sdf::ElementPtr sdf;
510 
512  private: std::vector<CameraPtr> cameras;
513 
515  private: std::vector<UserCameraPtr> userCameras;
516 
518  private: Ogre::SceneManager *manager;
519 
521  private: Ogre::RaySceneQuery *raySceneQuery;
522 
524  private: std::vector<Grid *> grids;
525 
527  private: static uint32_t idCounter;
528 
530  private: uint32_t id;
531 
533  private: std::string idString;
534 
537  typedef std::list<boost::shared_ptr<msgs::Visual const> > VisualMsgs_L;
538 
540  private: VisualMsgs_L visualMsgs;
541 
544  typedef std::list<boost::shared_ptr<msgs::Light const> > LightMsgs_L;
545 
547  private: LightMsgs_L lightMsgs;
548 
551  typedef std::list<boost::shared_ptr<msgs::Pose const> > PoseMsgs_L;
552 
554  private: PoseMsgs_L poseMsgs;
555 
558  typedef std::list<boost::shared_ptr<msgs::Scene const> > SceneMsgs_L;
559 
561  private: SceneMsgs_L sceneMsgs;
562 
565  typedef std::list<boost::shared_ptr<msgs::Joint const> > JointMsgs_L;
566 
568  private: JointMsgs_L jointMsgs;
569 
572  typedef std::list<boost::shared_ptr<msgs::Link const> > LinkMsgs_L;
573 
575  private: LinkMsgs_L linkMsgs;
576 
579  typedef std::list<boost::shared_ptr<msgs::Model const> > ModelMsgs_L;
581  private: ModelMsgs_L modelMsgs;
582 
585  typedef std::list<boost::shared_ptr<msgs::Sensor const> > SensorMsgs_L;
586 
588  private: SensorMsgs_L sensorMsgs;
589 
592  typedef std::list<boost::shared_ptr<msgs::Request const> > RequestMsgs_L;
594  private: RequestMsgs_L requestMsgs;
595 
598  typedef std::map<std::string, VisualPtr> Visual_M;
599 
601  private: Visual_M visuals;
602 
605  typedef std::map<std::string, LightPtr> Light_M;
606 
608  private: Light_M lights;
609 
612  typedef std::list<boost::shared_ptr<msgs::PoseAnimation const> >
613  SkeletonPoseMsgs_L;
615  private: SkeletonPoseMsgs_L skeletonPoseMsgs;
616 
618  private: boost::shared_ptr<msgs::Selection const> selectionMsg;
619 
621  private: boost::mutex *receiveMutex;
622 
624  private: transport::NodePtr node;
625 
627  private: transport::SubscriberPtr sensorSub;
628 
630  private: transport::SubscriberPtr sceneSub;
631 
633  private: transport::SubscriberPtr requestSub;
634 
636  private: transport::SubscriberPtr visSub;
637 
639  private: transport::SubscriberPtr lightSub;
640 
642  private: transport::SubscriberPtr poseSub;
643 
645  private: transport::SubscriberPtr jointSub;
646 
648  private: transport::SubscriberPtr selectionSub;
649 
651  private: transport::SubscriberPtr responseSub;
652 
654  private: transport::SubscriberPtr skeletonPoseSub;
655 
657  private: transport::SubscriberPtr skySub;
658 
660  private: transport::SubscriberPtr modelInfoSub;
661 
663  private: transport::PublisherPtr lightPub;
664 
666  private: transport::PublisherPtr responsePub;
667 
669  private: transport::PublisherPtr requestPub;
670 
672  private: std::vector<event::ConnectionPtr> connections;
673 
675  private: VisualPtr worldVisual;
676 
678  private: VisualPtr selectedVis;
679 
685  private: std::string selectionMode;
686 
688  private: msgs::Request *requestMsg;
689 
691  private: bool enableVisualizations;
692 
694  private: Heightmap *terrain;
695 
697  private: std::map<std::string, Projector *> projectors;
698 
700  public: SkyX::SkyX *skyx;
701 
703  private: SkyX::BasicController *skyxController;
704  };
706  }
707 }
708 #endif