lanelet2_map_server v1.2.3
Loading...
Searching...
No Matches
rviz_rendering::detail::Lanelet2MapHelpers Class Reference

#include <lanelet2_map_helpers.hpp>

Public Member Functions

 Lanelet2MapHelpers (Lanelet2Map &owner)
 Create helper routines bound to the owning map renderer.
 
void clearObjects ()
 Remove all helper-owned OGRE objects.
 
void addLaneletToManualObject (const lanelet::ConstLanelet &lanelet, Ogre::ManualObject *manual)
 Add lanelet boundary lines to a manual object.
 
void addSeperatorToManualObject (const lanelet::ConstLanelet &lanelet, Ogre::ManualObject *manual)
 Add lanelet separator lines to a manual object.
 
void addAreaToManualObject (const lanelet::ConstArea &area, Ogre::ManualObject *manual)
 Add area outlines or fills to a manual object.
 
void addParkingAreaToManualObject (const lanelet::ConstArea &area, Ogre::ManualObject *manual)
 Add parking area outlines or fills to a manual object.
 
void addLaneFillToManualObject (const lanelet::ConstLanelet &lanelet, Ogre::ManualObject *manual)
 Add a filled lanelet surface to a manual object.
 
void addSidewalkToManualObject (const lanelet::ConstArea &area, Ogre::ManualObject *manual)
 Add a sidewalk surface to a manual object.
 
void addCrosswalkToManualObject (const lanelet::ConstArea &area, Ogre::ManualObject *manual)
 Add a crosswalk surface to a manual object.
 
void addRegulatoryElements (const lanelet::ConstLanelet &lanelet, Ogre::SceneNode *parent_node)
 Attach regulatory element visuals for a lanelet.
 
void attachRefLinesToSceneNode (std::vector< lanelet::ConstLineString3d > &stop_lines, Ogre::SceneNode *parent_node)
 Attach stop-line reference geometry to a scene node.
 
void attachTrafficLightsToSceneNode (std::vector< lanelet::ConstPolygon3d > &traffic_lights, Ogre::SceneNode *parent_node)
 Attach traffic light geometry to a scene node.
 
void attachLaneletIdToSceneNode (const lanelet::ConstLanelet &lanelet, Ogre::SceneNode *parent_node)
 Attach the lanelet ID text to a scene node.
 

Private Member Functions

std::vector< Ogre::Vector3 > ogreLineFromLLetLineString (const lanelet::ConstLineString3d &line_string) const
 Convert a Lanelet2 line string to OGRE points.
 
std::vector< Ogre::Vector3 > ogreLineFromLLetPolygon (const lanelet::CompoundPolygon3d &polygon) const
 Convert a Lanelet2 polygon to OGRE points.
 
std::vector< Ogre::Vector3 > ogreLineFromLLetTrafficLight (const lanelet::ConstPolygon3d &polygon) const
 Convert a traffic light polygon to OGRE points.
 
std::vector< Ogre::Vector3 > ogreLineFromLLetPts (const lanelet::ConstPoints3d &pts_vector) const
 Convert Lanelet2 points to OGRE points.
 
Ogre::Vector3 ogreVec3FromLLetPoint (lanelet::ConstPoint3d point) const
 Convert a Lanelet2 point to an OGRE point.
 

Static Private Member Functions

static Ogre::Vector3 ogreVec3FromLLetTrafficLight (lanelet::ConstPoint3d point, double z_offset)
 Convert a traffic light point to an OGRE point with a height offset.
 
static std::vector< Ogre::Vector3 > bufferSegment (const std::vector< Ogre::Vector3 > &line, double buffer_length)
 Create a buffered segment around a line.
 
template<typename Iter >
static Ogre::Vector3 getNormal (Iter it, Iter begin, Iter end)
 Return the local 2D normal at an iterator position.
 
static void drawLine (const std::vector< Ogre::Vector3 > &line, Ogre::ManualObject *obj, Ogre::ColourValue color=Ogre::ColourValue::White, double width=0.1, double z_offset=0.0)
 Draw a line strip into a manual object.
 
static void drawArea (const std::vector< Ogre::Vector3 > &line, Ogre::ManualObject *obj, Ogre::ColourValue color=Ogre::ColourValue::White, double z_offset=0.0)
 Draw an area outline or fill into a manual object.
 
static void drawMonoPolygon (const std::vector< Ogre::Vector3 > &poly, Ogre::ManualObject *obj, Ogre::ColourValue color=Ogre::ColourValue::White)
 Draw a single polygon into a manual object.
 
static void drawLaneFillStrip (const std::vector< Ogre::Vector3 > &left, const std::vector< Ogre::Vector3 > &right, Ogre::ManualObject *obj, Ogre::ColourValue color, double z_offset=0.0)
 Draw a filled strip between lanelet boundaries.
 

Private Attributes

Lanelet2Map & owner_
 

Detailed Description

Definition at line 37 of file lanelet2_map_helpers.hpp.

Constructor & Destructor Documentation

◆ Lanelet2MapHelpers()

rviz_rendering::detail::Lanelet2MapHelpers::Lanelet2MapHelpers ( Lanelet2Map & owner)
inlineexplicit

Create helper routines bound to the owning map renderer.

Definition at line 40 of file lanelet2_map_helpers.hpp.

Member Function Documentation

◆ addAreaToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addAreaToManualObject ( const lanelet::ConstArea & area,
Ogre::ManualObject * manual )

Add area outlines or fills to a manual object.

Definition at line 93 of file lanelet2_map_helpers.cpp.

93 {
94 const lanelet::CompoundPolygon3d outer_polygon = area.outerBoundPolygon();
95 const auto area_line = ogreLineFromLLetPolygon(outer_polygon);
98 } else {
100 }
101}
Lanelet2Map::RenderingOptions rend_opts_
static void drawArea(const std::vector< Ogre::Vector3 > &line, Ogre::ManualObject *obj, Ogre::ColourValue color=Ogre::ColourValue::White, double z_offset=0.0)
Draw an area outline or fill into a manual object.
std::vector< Ogre::Vector3 > ogreLineFromLLetPolygon(const lanelet::CompoundPolygon3d &polygon) const
Convert a Lanelet2 polygon to OGRE points.
static void drawLine(const std::vector< Ogre::Vector3 > &line, Ogre::ManualObject *obj, Ogre::ColourValue color=Ogre::ColourValue::White, double width=0.1, double z_offset=0.0)
Draw a line strip into a manual object.

◆ addCrosswalkToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addCrosswalkToManualObject ( const lanelet::ConstArea & area,
Ogre::ManualObject * manual )

Add a crosswalk surface to a manual object.

Definition at line 124 of file lanelet2_map_helpers.cpp.

124 {
125 const auto area_line = ogreLineFromLLetPolygon(area.outerBoundPolygon());
127}

◆ addLaneFillToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addLaneFillToManualObject ( const lanelet::ConstLanelet & lanelet,
Ogre::ManualObject * manual )

Add a filled lanelet surface to a manual object.

Definition at line 113 of file lanelet2_map_helpers.cpp.

113 {
114 const auto left = ogreLineFromLLetLineString(lanelet.leftBound());
115 const auto right = ogreLineFromLLetLineString(lanelet.rightBound());
117}
static void drawLaneFillStrip(const std::vector< Ogre::Vector3 > &left, const std::vector< Ogre::Vector3 > &right, Ogre::ManualObject *obj, Ogre::ColourValue color, double z_offset=0.0)
Draw a filled strip between lanelet boundaries.
std::vector< Ogre::Vector3 > ogreLineFromLLetLineString(const lanelet::ConstLineString3d &line_string) const
Convert a Lanelet2 line string to OGRE points.

◆ addLaneletToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addLaneletToManualObject ( const lanelet::ConstLanelet & lanelet,
Ogre::ManualObject * manual )

Add lanelet boundary lines to a manual object.

Definition at line 69 of file lanelet2_map_helpers.cpp.

69 {
70 auto left_bound = lanelet.leftBound();
71 auto line_left = ogreLineFromLLetLineString(left_bound);
73
74 auto right_bound = lanelet.rightBound();
75 auto line_right = ogreLineFromLLetLineString(right_bound);
77}

◆ addParkingAreaToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addParkingAreaToManualObject ( const lanelet::ConstArea & area,
Ogre::ManualObject * manual )

Add parking area outlines or fills to a manual object.

Definition at line 103 of file lanelet2_map_helpers.cpp.

103 {
104 const lanelet::CompoundPolygon3d outer_polygon = area.outerBoundPolygon();
105 const auto area_line = ogreLineFromLLetPolygon(outer_polygon);
108 } else {
110 }
111}

◆ addRegulatoryElements()

void rviz_rendering::detail::Lanelet2MapHelpers::addRegulatoryElements ( const lanelet::ConstLanelet & lanelet,
Ogre::SceneNode * parent_node )

Attach regulatory element visuals for a lanelet.

Definition at line 129 of file lanelet2_map_helpers.cpp.

129 {
130 Ogre::SceneNode* regulatory_elements_node = parent_node->createChildSceneNode();
131 auto regulatory_elements = lanelet.regulatoryElements();
132 auto traffic_light_regelems = lanelet.regulatoryElementsAs<lanelet::TrafficLight>();
133
135 for (auto&& reg_element : regulatory_elements) {
136 auto ref_lines = reg_element->getParameters<lanelet::ConstLineString3d>(lanelet::RoleName::RefLine);
137 attachRefLinesToSceneNode(ref_lines, regulatory_elements_node);
138 }
139 }
140
142 for (auto&& traffic_light : traffic_light_regelems) {
143 auto traffic_lights = traffic_light->getParameters<lanelet::ConstPolygon3d>(lanelet::RoleName::Refers);
144 attachTrafficLightsToSceneNode(traffic_lights, regulatory_elements_node);
145 }
146 }
147}
void attachTrafficLightsToSceneNode(std::vector< lanelet::ConstPolygon3d > &traffic_lights, Ogre::SceneNode *parent_node)
Attach traffic light geometry to a scene node.
void attachRefLinesToSceneNode(std::vector< lanelet::ConstLineString3d > &stop_lines, Ogre::SceneNode *parent_node)
Attach stop-line reference geometry to a scene node.

◆ addSeperatorToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addSeperatorToManualObject ( const lanelet::ConstLanelet & lanelet,
Ogre::ManualObject * manual )

Add lanelet separator lines to a manual object.

Definition at line 79 of file lanelet2_map_helpers.cpp.

79 {
80 lanelet::ConstPoints3d first_points;
81 first_points.push_back(lanelet.leftBound().front());
82 first_points.push_back(lanelet.rightBound().front());
83 auto line = ogreLineFromLLetPts(first_points);
85
86 lanelet::ConstPoints3d last_points;
87 last_points.push_back(lanelet.leftBound().back());
88 last_points.push_back(lanelet.rightBound().back());
89 line = ogreLineFromLLetPts(last_points);
91}
std::vector< Ogre::Vector3 > ogreLineFromLLetPts(const lanelet::ConstPoints3d &pts_vector) const
Convert Lanelet2 points to OGRE points.

◆ addSidewalkToManualObject()

void rviz_rendering::detail::Lanelet2MapHelpers::addSidewalkToManualObject ( const lanelet::ConstArea & area,
Ogre::ManualObject * manual )

Add a sidewalk surface to a manual object.

Definition at line 119 of file lanelet2_map_helpers.cpp.

119 {
120 const auto area_line = ogreLineFromLLetPolygon(area.outerBoundPolygon());
122}

◆ attachLaneletIdToSceneNode()

void rviz_rendering::detail::Lanelet2MapHelpers::attachLaneletIdToSceneNode ( const lanelet::ConstLanelet & lanelet,
Ogre::SceneNode * parent_node )

Attach the lanelet ID text to a scene node.

Definition at line 189 of file lanelet2_map_helpers.cpp.

189 {
190 Ogre::SceneNode* child_node = parent_node->createChildSceneNode();
191
192 auto* msg = new rviz_rendering::MovableText(std::to_string(lanelet.id()));
193 msg->setCharacterHeight(boost::numeric_cast<Ogre::Real>(owner_.rend_opts_.characterHeight));
194 msg->setColor(owner_.rend_opts_.colorLaneletId);
195 msg->setTextAlignment(rviz_rendering::MovableText::H_CENTER, rviz_rendering::MovableText::V_ABOVE);
196
197 lanelet::ConstPoint3d text_pos(
198 lanelet::utils::getId(), lanelet.centerline()[lanelet.centerline().size() / 2].x(),
199 lanelet.centerline()[lanelet.centerline().size() / 2].y(),
200 owner_.rend_opts_.threeD ? lanelet.centerline()[lanelet.centerline().size() / 2].z() - 0.2 : -0.2);
201
202 child_node->setPosition(ogreVec3FromLLetPoint(text_pos));
203 child_node->attachObject(msg);
204 owner_.objects_.push_back(std::make_pair(ObjectClassification::LANELETID, msg));
205}
std::vector< ClassifiedMovableObject > objects_
Ogre::Vector3 ogreVec3FromLLetPoint(lanelet::ConstPoint3d point) const
Convert a Lanelet2 point to an OGRE point.

◆ attachRefLinesToSceneNode()

void rviz_rendering::detail::Lanelet2MapHelpers::attachRefLinesToSceneNode ( std::vector< lanelet::ConstLineString3d > & stop_lines,
Ogre::SceneNode * parent_node )

Attach stop-line reference geometry to a scene node.

Definition at line 149 of file lanelet2_map_helpers.cpp.

150 {
151 Ogre::ManualObject* stop_lines_manual_object =
152 owner_.scene_manager_->createManualObject("llet_object_" + std::to_string(Lanelet2Map::manual_object_counter_++));
153 stop_lines_manual_object->begin(owner_.material_line_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST, "rviz_rendering");
154 stop_lines_manual_object->setRenderQueueGroup(Ogre::RENDER_QUEUE_MAIN + 6);
155 for (auto&& stop_line : stop_lines) {
156 auto line = ogreLineFromLLetLineString(stop_line);
157 drawLine(line, stop_lines_manual_object, owner_.rend_opts_.colorStopLine, owner_.rend_opts_.stopLineWidth,
159 }
160 // OGRE 1.x exposes section counts through this deprecated API; RViz still uses this vendor version.
161 // NOLINTNEXTLINE(clang-diagnostic-deprecated-declarations)
162 if (stop_lines_manual_object->getNumSections() != 0U) {
163 parent_node->attachObject(stop_lines_manual_object);
164 owner_.objects_.push_back(std::make_pair(ObjectClassification::STOPLINE, stop_lines_manual_object));
165 }
166 stop_lines_manual_object->end();
167}
std::shared_ptr< Ogre::Material > material_line_
Ogre::SceneManager * scene_manager_

◆ attachTrafficLightsToSceneNode()

void rviz_rendering::detail::Lanelet2MapHelpers::attachTrafficLightsToSceneNode ( std::vector< lanelet::ConstPolygon3d > & traffic_lights,
Ogre::SceneNode * parent_node )

Attach traffic light geometry to a scene node.

Definition at line 169 of file lanelet2_map_helpers.cpp.

170 {
171 Ogre::ManualObject* traffic_light_manual_object =
172 owner_.scene_manager_->createManualObject("llet_object_" + std::to_string(Lanelet2Map::manual_object_counter_++));
173 traffic_light_manual_object->begin(owner_.material_surface_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
174 "rviz_rendering");
175 traffic_light_manual_object->setRenderQueueGroup(Ogre::RENDER_QUEUE_MAIN + 4);
176 for (auto&& traffic_light : traffic_lights) {
177 auto line = ogreLineFromLLetTrafficLight(traffic_light);
178 drawArea(line, traffic_light_manual_object, owner_.rend_opts_.colorTrafficLight, owner_.rend_opts_.zStopLine);
179 }
180 // OGRE 1.x exposes section counts through this deprecated API; RViz still uses this vendor version.
181 // NOLINTNEXTLINE(clang-diagnostic-deprecated-declarations)
182 if (traffic_light_manual_object->getNumSections() != 0U) {
183 parent_node->attachObject(traffic_light_manual_object);
184 owner_.objects_.push_back(std::make_pair(ObjectClassification::TRAFFICLIGHT, traffic_light_manual_object));
185 }
186 traffic_light_manual_object->end();
187}
std::shared_ptr< Ogre::Material > material_surface_
std::vector< Ogre::Vector3 > ogreLineFromLLetTrafficLight(const lanelet::ConstPolygon3d &polygon) const
Convert a traffic light polygon to OGRE points.

◆ bufferSegment()

std::vector< Ogre::Vector3 > rviz_rendering::detail::Lanelet2MapHelpers::bufferSegment ( const std::vector< Ogre::Vector3 > & line,
double buffer_length )
staticprivate

Create a buffered segment around a line.

Definition at line 259 of file lanelet2_map_helpers.cpp.

259 {
260 std::vector<Ogre::Vector3> buffered;
261 buffered.reserve(line.size());
262 assert(line.size() >= 2);
263 for (auto it = line.begin(); it != line.end(); ++it) {
264 auto normal = getNormal(it, line.begin(), line.end());
265 buffered.push_back(*it + normal * boost::numeric_cast<Ogre::Real>(buffer_length / 2.0));
266 }
267 for (auto it = line.rbegin(); it != line.rend(); ++it) {
268 auto normal = getNormal(it, line.rbegin(), line.rend());
269 buffered.push_back(*it + normal * boost::numeric_cast<Ogre::Real>(buffer_length / 2.0));
270 }
271 return buffered;
272}
static Ogre::Vector3 getNormal(Iter it, Iter begin, Iter end)
Return the local 2D normal at an iterator position.

◆ clearObjects()

void rviz_rendering::detail::Lanelet2MapHelpers::clearObjects ( )

Remove all helper-owned OGRE objects.

Definition at line 23 of file lanelet2_map_helpers.cpp.

23 {
24 for (auto object : owner_.objects_) {
25 switch (object.first) {
35 auto man_object = dynamic_cast<Ogre::ManualObject*>(object.second);
36 if (man_object != nullptr) {
37 man_object->detachFromParent();
38 owner_.scene_manager_->destroyManualObject(man_object);
39 }
40 break;
41 }
42
44 auto mov_text = dynamic_cast<rviz_rendering::MovableText*>(object.second);
45 if (mov_text != nullptr) {
46 mov_text->detachFromParent();
47 // MovableText is created directly and attached to the scene node, so it is destroyed directly here.
48 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory)
49 delete mov_text;
50 }
51 break;
52 }
53
54 default: {
55 if (object.second != nullptr) {
56 object.second->detachFromParent();
57 // Fallback for directly owned OGRE objects not handled by the scene manager helpers above.
58 // NOLINTNEXTLINE(cppcoreguidelines-owning-memory)
59 delete object.second;
60 }
61 }
62 }
63 }
64
66 owner_.objects_.clear();
67}

◆ drawArea()

void rviz_rendering::detail::Lanelet2MapHelpers::drawArea ( const std::vector< Ogre::Vector3 > & line,
Ogre::ManualObject * obj,
Ogre::ColourValue color = Ogre::ColourValue::White,
double z_offset = 0.0 )
staticprivate

Draw an area outline or fill into a manual object.

Definition at line 288 of file lanelet2_map_helpers.cpp.

291 {
292 if (line.size() < 2) {
293 return;
294 }
295 if (z_offset != 0.0) {
296 std::vector<Ogre::Vector3> elevated;
297 elevated.reserve(line.size());
298 for (auto v : line) {
299 v.z += boost::numeric_cast<Ogre::Real>(z_offset);
300 elevated.push_back(v);
301 }
302 drawMonoPolygon(elevated, obj, color);
303 return;
304 }
305 drawMonoPolygon(line, obj, color);
306}
static void drawMonoPolygon(const std::vector< Ogre::Vector3 > &poly, Ogre::ManualObject *obj, Ogre::ColourValue color=Ogre::ColourValue::White)
Draw a single polygon into a manual object.

◆ drawLaneFillStrip()

void rviz_rendering::detail::Lanelet2MapHelpers::drawLaneFillStrip ( const std::vector< Ogre::Vector3 > & left,
const std::vector< Ogre::Vector3 > & right,
Ogre::ManualObject * obj,
Ogre::ColourValue color,
double z_offset = 0.0 )
staticprivate

Draw a filled strip between lanelet boundaries.

Definition at line 339 of file lanelet2_map_helpers.cpp.

343 {
344 if (left.size() < 2 || right.size() < 2) {
345 return;
346 }
347
348 const size_t n_left = left.size();
349 const size_t n_right = right.size();
350 const size_t max_steps = std::max(n_left, n_right) - 1;
351 for (size_t i = 0; i < max_steps; ++i) {
352 double t0 = static_cast<double>(i) / static_cast<double>(max_steps);
353 double t1 = static_cast<double>(i + 1) / static_cast<double>(max_steps);
354
355 size_t i_left0 = static_cast<size_t>(t0 * static_cast<double>(n_left - 1));
356 size_t i_left1 = std::min(static_cast<size_t>(t1 * static_cast<double>(n_left - 1)), n_left - 1);
357 size_t i_right0 = static_cast<size_t>(t0 * static_cast<double>(n_right - 1));
358 size_t i_right1 = std::min(static_cast<size_t>(t1 * static_cast<double>(n_right - 1)), n_right - 1);
359
360 Ogre::Vector3 left0 = left[i_left0];
361 Ogre::Vector3 left1 = left[i_left1];
362 Ogre::Vector3 right0 = right[i_right0];
363 Ogre::Vector3 right1 = right[i_right1];
364 const auto z_offset_real = boost::numeric_cast<Ogre::Real>(z_offset);
365 left0.z += z_offset_real;
366 left1.z += z_offset_real;
367 right0.z += z_offset_real;
368 right1.z += z_offset_real;
369
370 const auto base = obj->getCurrentVertexCount();
371 obj->position(left0);
372 obj->normal(0, 0, 1);
373 obj->colour(color);
374 obj->position(right0);
375 obj->normal(0, 0, 1);
376 obj->colour(color);
377 obj->position(left1);
378 obj->normal(0, 0, 1);
379 obj->colour(color);
380 obj->triangle(base + 0, base + 1, base + 2);
381
382 obj->position(left1);
383 obj->normal(0, 0, 1);
384 obj->colour(color);
385 obj->position(right0);
386 obj->normal(0, 0, 1);
387 obj->colour(color);
388 obj->position(right1);
389 obj->normal(0, 0, 1);
390 obj->colour(color);
391 obj->triangle(base + 3, base + 4, base + 5);
392 }
393}

◆ drawLine()

void rviz_rendering::detail::Lanelet2MapHelpers::drawLine ( const std::vector< Ogre::Vector3 > & line,
Ogre::ManualObject * obj,
Ogre::ColourValue color = Ogre::ColourValue::White,
double width = 0.1,
double z_offset = 0.0 )
staticprivate

Draw a line strip into a manual object.

Definition at line 274 of file lanelet2_map_helpers.cpp.

275 {
276 if (width <= 0 || line.size() < 2) {
277 return;
278 }
279 auto buffered = bufferSegment(line, width);
280 if (z_offset != 0.0) {
281 for (auto& v : buffered) {
282 v.z += boost::numeric_cast<Ogre::Real>(z_offset);
283 }
284 }
285 drawMonoPolygon(buffered, obj, color);
286}
static std::vector< Ogre::Vector3 > bufferSegment(const std::vector< Ogre::Vector3 > &line, double buffer_length)
Create a buffered segment around a line.

◆ drawMonoPolygon()

void rviz_rendering::detail::Lanelet2MapHelpers::drawMonoPolygon ( const std::vector< Ogre::Vector3 > & poly,
Ogre::ManualObject * obj,
Ogre::ColourValue color = Ogre::ColourValue::White )
staticprivate

Draw a single polygon into a manual object.

Definition at line 308 of file lanelet2_map_helpers.cpp.

310 {
311 if (poly.size() < 3) {
312 return;
313 }
314
315 auto it_left = poly.begin();
316 auto it_right = --poly.end();
317 const auto start_index = obj->getCurrentVertexCount();
318 auto count = 0U;
319 for (; it_right >= it_left; ++it_left, --it_right) {
320 obj->position(*it_left);
321 obj->normal(0, 0, 1);
322 obj->colour(color);
323 if (count >= 2) {
324 assert(obj->getCurrentVertexCount() > start_index + count);
325 obj->triangle(start_index + count - 2, start_index + count - 1, start_index + count);
326 }
327 count++;
328 obj->position(*it_right);
329 obj->normal(0, 0, 1);
330 obj->colour(color);
331 if (count >= 2) {
332 assert(obj->getCurrentVertexCount() > start_index + count);
333 obj->triangle(start_index + count, start_index + count - 1, start_index + count - 2);
334 }
335 count++;
336 }
337}

◆ getNormal()

template<typename Iter >
static Ogre::Vector3 rviz_rendering::detail::Lanelet2MapHelpers::getNormal ( Iter it,
Iter begin,
Iter end )
inlinestaticprivate

Return the local 2D normal at an iterator position.

Definition at line 86 of file lanelet2_map_helpers.hpp.

86 {
87 Ogre::Vector3 zero(0, 0, 0);
88 auto dir_before = zero;
89 int i = 1;
90 while (it != begin && dir_before == zero) {
91 dir_before = *it - *std::prev(it, i);
92 i++;
93 }
94
95 auto dir_after = zero;
96 i = 1;
97 while (std::next(it) != end && dir_after == zero) {
98 dir_after = *std::next(it, i) - *it;
99 i++;
100 }
101
102 if (dir_before == zero && dir_after == zero) {
103 return zero;
104 }
105 if (dir_after == zero) {
106 dir_after = dir_before;
107 }
108 if (dir_before == zero) {
109 dir_before = dir_after;
110 }
111
112 auto dir_combined = dir_after * (1 / dir_after.length()) + dir_before * (1 / dir_before.length());
113 dir_combined *= 1 / dir_combined.length();
114 return Ogre::Vector3(dir_combined.y, -dir_combined.x, 0);
115 }

◆ ogreLineFromLLetLineString()

std::vector< Ogre::Vector3 > rviz_rendering::detail::Lanelet2MapHelpers::ogreLineFromLLetLineString ( const lanelet::ConstLineString3d & line_string) const
private

Convert a Lanelet2 line string to OGRE points.

Definition at line 207 of file lanelet2_map_helpers.cpp.

207 {
208 std::vector<Ogre::Vector3> line;
209 for (lanelet::ConstPoint3d point : line_string) {
210 line.push_back(ogreVec3FromLLetPoint(point));
211 }
212 return line;
213}

◆ ogreLineFromLLetPolygon()

std::vector< Ogre::Vector3 > rviz_rendering::detail::Lanelet2MapHelpers::ogreLineFromLLetPolygon ( const lanelet::CompoundPolygon3d & polygon) const
private

Convert a Lanelet2 polygon to OGRE points.

Definition at line 215 of file lanelet2_map_helpers.cpp.

215 {
216 std::vector<Ogre::Vector3> line;
217 for (lanelet::ConstPoint3d point : polygon) {
218 line.push_back(ogreVec3FromLLetPoint(point));
219 }
220 return line;
221}

◆ ogreLineFromLLetPts()

std::vector< Ogre::Vector3 > rviz_rendering::detail::Lanelet2MapHelpers::ogreLineFromLLetPts ( const lanelet::ConstPoints3d & pts_vector) const
private

Convert Lanelet2 points to OGRE points.

Definition at line 239 of file lanelet2_map_helpers.cpp.

239 {
240 std::vector<Ogre::Vector3> line;
241 for (lanelet::ConstPoint3d point : pts_vector) {
242 line.push_back(ogreVec3FromLLetPoint(point));
243 }
244 return line;
245}

◆ ogreLineFromLLetTrafficLight()

std::vector< Ogre::Vector3 > rviz_rendering::detail::Lanelet2MapHelpers::ogreLineFromLLetTrafficLight ( const lanelet::ConstPolygon3d & polygon) const
private

Convert a traffic light polygon to OGRE points.

Definition at line 223 of file lanelet2_map_helpers.cpp.

223 {
224 if (polygon.empty()) {
225 return {};
226 }
227
228 std::vector<Ogre::Vector3> line;
229 const lanelet::ConstPoint3d lowest_point =
230 *std::min_element(polygon.begin(), polygon.end(),
231 [](const lanelet::ConstPoint3d& p1, const lanelet::ConstPoint3d& p2) { return p1.z() < p2.z(); });
232
233 for (lanelet::ConstPoint3d point : polygon) {
234 line.push_back(ogreVec3FromLLetTrafficLight(point, owner_.rend_opts_.trafficLightHeightAboveGround - lowest_point.z()));
235 }
236 return line;
237}
static Ogre::Vector3 ogreVec3FromLLetTrafficLight(lanelet::ConstPoint3d point, double z_offset)
Convert a traffic light point to an OGRE point with a height offset.

◆ ogreVec3FromLLetPoint()

Ogre::Vector3 rviz_rendering::detail::Lanelet2MapHelpers::ogreVec3FromLLetPoint ( lanelet::ConstPoint3d point) const
private

Convert a Lanelet2 point to an OGRE point.

Definition at line 247 of file lanelet2_map_helpers.cpp.

247 {
248 using boost::numeric_cast;
249 return Ogre::Vector3(numeric_cast<Ogre::Real>(point.x()), numeric_cast<Ogre::Real>(point.y()),
250 numeric_cast<Ogre::Real>(point.z()) * numeric_cast<Ogre::Real>(owner_.rend_opts_.threeD));
251}

◆ ogreVec3FromLLetTrafficLight()

Ogre::Vector3 rviz_rendering::detail::Lanelet2MapHelpers::ogreVec3FromLLetTrafficLight ( lanelet::ConstPoint3d point,
double z_offset )
staticprivate

Convert a traffic light point to an OGRE point with a height offset.

Definition at line 253 of file lanelet2_map_helpers.cpp.

253 {
254 using boost::numeric_cast;
255 return Ogre::Vector3(numeric_cast<Ogre::Real>(point.x()), numeric_cast<Ogre::Real>(point.y()),
256 numeric_cast<Ogre::Real>(point.z() + z_offset));
257}

Member Data Documentation

◆ owner_

Lanelet2Map& rviz_rendering::detail::Lanelet2MapHelpers::owner_
private

Definition at line 139 of file lanelet2_map_helpers.hpp.


The documentation for this class was generated from the following files: