MVSim
Lightweight simulator for 2.5D vehicles and robots
VisualObject.h
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2026 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #pragma once
11 
12 #include <mrpt/core/optional_ref.h>
13 #include <mrpt/math/TBoundingBox.h>
14 #include <mrpt/opengl/COpenGLScene.h>
15 #include <mrpt/opengl/opengl_frwds.h>
16 #include <mrpt/poses/CPose3D.h>
17 #include <mvsim/Shape2p5.h>
18 #include <mvsim/basic_types.h>
19 
20 #include <cstdint>
21 #include <memory>
22 
23 namespace mvsim
24 {
25 class World;
26 
36 {
37  public:
39  World* parent, bool insertCustomVizIntoViz = true, bool insertCustomVizIntoPhysical = true);
40 
41  virtual ~VisualObject();
42 
43  VisualObject(const VisualObject&) = delete;
44  VisualObject& operator=(const VisualObject&) = delete;
45  VisualObject(VisualObject&&) = delete;
46  VisualObject& operator=(VisualObject&&) = delete;
47 
52  virtual void guiUpdate(
53  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
54  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical);
55 
56  World* parent() { return world_; }
57  const World* parent() const { return world_; }
58 
59  void customVisualVisible(const bool visible);
60  bool customVisualVisible() const;
61 
64  const std::optional<Shape2p5>& collisionShape() const { return collisionShape_; }
65 
66  void showCollisionShape(bool show);
67 
68  static void FreeOpenGLResources();
69 
71  static double GeometryEpsilon;
72 
73  protected:
75  bool parseVisual(const rapidxml::xml_node<char>& rootNode);
76  bool parseVisual(const JointXMLnode<>& rootNode);
77 
78  World* world_;
79 
82  std::shared_ptr<mrpt::opengl::CSetOfObjects> glCustomVisual_;
83  std::shared_ptr<mrpt::opengl::CSetOfObjects> glCollision_;
84  int32_t glCustomVisualId_ = -1;
85 
86  const bool insertCustomVizIntoViz_ = true;
87  const bool insertCustomVizIntoPhysical_ = true;
88 
89  virtual void internalGuiUpdate(
90  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
91  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
92  bool childrenOnly = false) = 0;
93 
94  void addCustomVisualization(
95  const mrpt::opengl::CRenderizable::Ptr& glModel, const mrpt::poses::CPose3D& modelPose = {},
96  const float modelScale = 1.0f, const std::string& modelName = "group",
97  const std::optional<std::string>& modelURI = std::nullopt,
98  const bool initialShowBoundingBox = false,
99  const std::optional<double>& scaleOverride = std::nullopt);
100 
101  void setCollisionShape(const Shape2p5& cs) { collisionShape_ = cs; }
102 
103  private:
104  std::optional<Shape2p5> collisionShape_;
105 
107  bool implParseVisual(const rapidxml::xml_node<char>& visual_node);
108 };
109 } // namespace mvsim
Definition: JointXMLnode.h:20
Definition: Shape2p5.h:31
Definition: VisualObject.h:36
std::shared_ptr< mrpt::opengl::CSetOfObjects > glCustomVisual_
Definition: VisualObject.h:82
virtual void guiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical)
bool parseVisual(const rapidxml::xml_node< char > &rootNode)
Returns true if there is at least one <visual>...</visual> entry.
static double GeometryEpsilon
Definition: VisualObject.h:71
const std::optional< Shape2p5 > & collisionShape() const
Definition: VisualObject.h:64
Definition: World.h:132