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


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:07