SkyBox.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 <mvsim/World.h>
12 
13 //
14 #include <mrpt/version.h>
15 #if MRPT_VERSION >= 0x270
16 #include <mrpt/opengl/CSkyBox.h> // class introduced in mrpt 2.7.0
17 #else
18 #endif
19 
20 #include <rapidxml.hpp>
21 
22 #include "xml_utils.h"
23 
24 using namespace rapidxml;
25 using namespace mvsim;
26 using namespace std;
27 
28 SkyBox::SkyBox(World* parent, const rapidxml::xml_node<char>* root)
29  : WorldElementBase(parent)
30 {
31  // Create opengl object: in this class, we'll store most state data directly
32  // in the mrpt::opengl object.
33  loadConfigFrom(root);
34 }
35 
36 SkyBox::~SkyBox() = default;
37 
39 {
40  if (!root) return; // Assume defaults
41 
42  std::string texturesPattern;
43 
44  TParameterDefinitions params;
45  params["textures"] = TParamEntry("%s", &texturesPattern);
46 
48  *root, params, world_->user_defined_variables());
49 
50  ASSERTMSG_(
51  !texturesPattern.empty(),
52  "Textures must be defined in a <textures>...</textures> tag.");
53 
54  ASSERTMSG_(
55  texturesPattern.find("%s") != std::string::npos,
56  "Texture pattern URI in <textures>...</textures> must contain one '%s' "
57  "placeholder.");
58 
59 #if MRPT_VERSION >= 0x270
60  using mrpt::opengl::CUBE_TEXTURE_FACE;
61 
62  const std::vector<std::pair<CUBE_TEXTURE_FACE, const char*>> faceImages = {
63  {CUBE_TEXTURE_FACE::FRONT, "Front"},
64  {CUBE_TEXTURE_FACE::BACK, "Back"},
65  {CUBE_TEXTURE_FACE::BOTTOM, "Down"},
66  {CUBE_TEXTURE_FACE::TOP, "Up"},
67  {CUBE_TEXTURE_FACE::LEFT, "Left"},
68  {CUBE_TEXTURE_FACE::RIGHT, "Right"},
69  };
70 
71  auto sb = mrpt::opengl::CSkyBox::Create();
72 
73  for (const auto& p : faceImages)
74  {
75  std::string fil = mrpt::format(texturesPattern.c_str(), p.second);
76 
77  // MRPT_LOG_DEBUG_STREAM("Loading face texture: " << fil);
78  fil = world_->xmlPathToActualPath(fil);
79 
80  sb->assignImage(p.first, mrpt::img::CImage::LoadFromFile(fil));
81  }
82 
83  glSkyBoxPrepared_ = sb;
84 #else
85  std::cerr
86  << "[mvsim::SkyBox] Ignoring SkyBox since MRPT>=2.7.0 is not available."
87  << std::endl;
88 #endif
89 }
90 
92  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
93  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
94  [[maybe_unused]] bool childrenOnly)
95 {
96  using namespace mrpt::math;
97 
98  // 1st call?
99  if (!glSkyBox_ && viz && physical && glSkyBoxPrepared_)
100  {
102  viz->get().insert(glSkyBox_);
103  physical->get().insert(glSkyBox_);
104  }
105 
106  // No need to update, this is a static, "background" entity.
107 }
This file contains rapidxml parser and DOM implementation.
mrpt::opengl::CRenderizable::Ptr glSkyBox_
Definition: SkyBox.h:39
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
virtual void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, bool childrenOnly) override
Definition: SkyBox.cpp:91
virtual ~SkyBox()
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root) override
Definition: SkyBox.cpp:38
const std::map< std::string, std::string > & user_defined_variables() const
Definition: World.h:391
mrpt::opengl::CRenderizable::Ptr glSkyBoxPrepared_
Definition: SkyBox.h:41
std::string xmlPathToActualPath(const std::string &modelURI) const
Definition: World.cpp:244


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