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


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