HorizontalPlane.cpp
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2023 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 #include <mrpt/opengl/COpenGLScene.h>
11 #include <mrpt/system/filesystem.h>
12 #include <mrpt/version.h>
13 #include <mvsim/World.h>
15 
16 #include <rapidxml.hpp>
17 
18 #include "JointXMLnode.h"
19 #include "xml_utils.h"
20 
21 using namespace rapidxml;
22 using namespace mvsim;
23 using namespace std;
24 
25 HorizontalPlane::HorizontalPlane(
26  World* parent, const rapidxml::xml_node<char>* root)
27  : WorldElementBase(parent)
28 {
29  // Create opengl object: in this class, we'll store most state data directly
30  // in the mrpt::opengl object.
32 }
33 
35 
37 {
38  if (!root) return; // Assume defaults
39 
40  // Common setup for simulable objects:
41  // -----------------------------------------------------------
42  {
44  p.init_pose_mandatory = false;
45 
46  JointXMLnode<> jnode;
47  jnode.add(root);
48  parseSimulable(jnode, p);
49  }
50 
51  TParameterDefinitions params;
52  params["color"] = TParamEntry("%color", &color_);
53  params["enable_shadows"] = TParamEntry("%bool", &enableShadows_);
54 
55  params["x_min"] = TParamEntry("%f", &x_min_);
56  params["x_max"] = TParamEntry("%f", &x_max_);
57  params["y_min"] = TParamEntry("%f", &y_min_);
58  params["y_max"] = TParamEntry("%f", &y_max_);
59  params["z"] = TParamEntry("%f", &z_);
60  params["cull_face"] = TParamEntry("%s", &cull_faces_);
61 
62  params["texture"] = TParamEntry("%s", &textureFileName_);
63  params["texture_size_x"] = TParamEntry("%lf", &textureSizeX_);
64  params["texture_size_y"] = TParamEntry("%lf", &textureSizeY_);
65 
67  *root, params, world_->user_defined_variables());
68 }
69 
71  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
72  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
73  [[maybe_unused]] bool childrenOnly)
74 {
75  using namespace mrpt::math;
76  using namespace std::string_literals;
77 
78  if (!glGroup_) glGroup_ = mrpt::opengl::CSetOfObjects::Create();
79 
80  // 1st call? (w/o texture)
81  if (!gl_plane_ && textureFileName_.empty() && viz && physical)
82  {
83  gl_plane_ = mrpt::opengl::CTexturedPlane::Create();
84  gl_plane_->setPlaneCorners(x_min_, x_max_, y_min_, y_max_);
85  gl_plane_->setLocation(0, 0, z_);
86  gl_plane_->setName("HorizontalPlane_"s + getName());
87 
88 #if MRPT_VERSION >= 0x270
89  gl_plane_->enableLighting(enableShadows_);
90 #endif
91 
92  gl_plane_->setColor_u8(color_);
93 
94 #if MRPT_VERSION >= 0x240
95  gl_plane_->cullFaces(
96  mrpt::typemeta::TEnumType<mrpt::opengl::TCullFace>::name2value(
97  cull_faces_));
98 #endif
99  glGroup_->insert(gl_plane_);
100  viz->get().insert(glGroup_);
101  physical->get().insert(glGroup_);
102  }
103  // 1st call? (with texture)
104  if (!gl_plane_text_ && !textureFileName_.empty() && viz && physical)
105  {
106  const std::string localFileName =
108  ASSERT_FILE_EXISTS_(localFileName);
109 
110  mrpt::img::CImage texture;
111  bool textureReadOk = texture.loadFromFile(localFileName);
112  ASSERT_(textureReadOk);
113 
114  // Compute (U,V) texture coordinates:
115  float u_min = 0;
116  float v_min = 0;
117  float u_max = (x_max_ - x_min_) / textureSizeX_;
118  float v_max = (y_max_ - y_min_) / textureSizeY_;
119 
120  gl_plane_text_ = mrpt::opengl::CSetOfTexturedTriangles::Create();
121  gl_plane_text_->setName("HorizontalPlane_"s + getName());
122 
123  gl_plane_text_->enableLight(enableShadows_);
124 
125  {
126  mrpt::opengl::CSetOfTexturedTriangles::TTriangle t;
127  t.vertices[0].xyzrgba.pt = {x_min_, y_min_, z_};
128  t.vertices[1].xyzrgba.pt = {x_max_, y_min_, z_};
129  t.vertices[2].xyzrgba.pt = {x_max_, y_max_, z_};
130 
131  t.vertices[0].uv = {u_min, v_min};
132  t.vertices[1].uv = {u_max, v_min};
133  t.vertices[2].uv = {u_max, v_max};
134 
135  t.computeNormals();
136  gl_plane_text_->insertTriangle(t);
137  }
138  {
139  mrpt::opengl::CSetOfTexturedTriangles::TTriangle t;
140  t.vertices[0].xyzrgba.pt = {x_min_, y_min_, z_};
141  t.vertices[1].xyzrgba.pt = {x_max_, y_max_, z_};
142  t.vertices[2].xyzrgba.pt = {x_min_, y_max_, z_};
143 
144  t.vertices[0].uv = {u_min, v_min};
145  t.vertices[1].uv = {u_max, v_max};
146  t.vertices[2].uv = {u_min, v_max};
147 
148  t.computeNormals();
149  gl_plane_text_->insertTriangle(t);
150  }
151 
152  gl_plane_text_->assignImage(texture);
153 
154 #if MRPT_VERSION >= 0x240
155  gl_plane_text_->cullFaces(
156  mrpt::typemeta::TEnumType<mrpt::opengl::TCullFace>::name2value(
157  cull_faces_));
158 #endif
159 
160  glGroup_->insert(gl_plane_text_);
161  viz->get().insert(glGroup_);
162  physical->get().insert(glGroup_);
163  }
164 
165  // Update them:
166  // If "viz" does not have a value, it's because we are already inside a
167  // setPose() change event, so my caller already holds the mutex and we
168  // don't need/can't acquire it again:
169  const auto objectPose = viz.has_value() ? getPose() : getPoseNoLock();
170 
171  glGroup_->setPose(objectPose);
172 }
173 
175 {
177 }
178 
180 {
182 }
This file contains rapidxml parser and DOM implementation.
void simul_pre_timestep(const TSimulContext &context) override
std::map< std::string, TParamEntry > TParameterDefinitions
void parse_xmlnode_children_as_param(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions &params, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="", mrpt::system::COutputLogger *logger=nullptr)
Definition: xml_utils.cpp:224
mrpt::math::TPose3D getPose() const
Definition: Simulable.cpp:438
mrpt::math::TPose3D getPoseNoLock() const
No thread-safe version. Used internally only.
Definition: Simulable.cpp:446
XmlRpcServer s
virtual void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, bool childrenOnly) override
mrpt::opengl::CTexturedPlane::Ptr gl_plane_
geometry_msgs::TransformStamped t
const std::map< std::string, std::string > & user_defined_variables() const
Definition: World.h:391
virtual void simul_post_timestep(const TSimulContext &context)
Definition: Simulable.cpp:59
const std::string & getName() const
Definition: Simulable.h:92
mrpt::opengl::CSetOfObjects::Ptr glGroup_
std::string textureFileName_
virtual void simul_pre_timestep(const TSimulContext &context)
Definition: Simulable.cpp:30
mrpt::img::TColor color_
mrpt::opengl::CSetOfTexturedTriangles::Ptr gl_plane_text_
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root) override
void simul_post_timestep(const TSimulContext &context) override
std::string xmlPathToActualPath(const std::string &modelURI) const
Definition: World.cpp:244
void add(const rapidxml::xml_node< Ch > *node)
Definition: JointXMLnode.h:28


mvsim
Author(s):
autogenerated on Tue Jul 4 2023 03:08:20