24 Ogre::SceneNode* parent_node,
26 lanelet::LaneletMapConstPtr map_ptr)
27 : rend_opts_(rend_opts), scene_manager_(manager), bsd_helpers_(std::make_unique<detail::Lanelet2MapHelpers>(*this)) {
28 std::string ll_map_name =
"Lanelet2Map";
30 if (parent_node ==
nullptr) {
36 const std::string mat_surface_name = ll_map_name +
"SurfaceMaterial";
37 const std::string mat_line_name = ll_map_name +
"LineMaterial";
40 auto res = Ogre::MaterialManager::getSingleton().createOrRetrieve(mat_surface_name,
"rviz_rendering");
41 auto mat = std::dynamic_pointer_cast<Ogre::Material>(res.first);
46 material_surface_->getTechnique(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
48 material_surface_->getTechnique(0)->getPass(0)->setVertexColourTracking(Ogre::TVC_AMBIENT + Ogre::TVC_DIFFUSE);
55 auto res = Ogre::MaterialManager::getSingleton().createOrRetrieve(mat_line_name,
"rviz_rendering");
56 auto mat = std::dynamic_pointer_cast<Ogre::Material>(res.first);
61 material_line_->getTechnique(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
64 material_line_->getTechnique(0)->getPass(0)->setVertexColourTracking(Ogre::TVC_AMBIENT + Ogre::TVC_DIFFUSE);
66 material_line_->getTechnique(0)->getPass(0)->setDepthBias(2.0F, 1.0F);
121 Ogre::ManualObject* map_manual_object =
123 Ogre::ManualObject* separator_manual_object =
125 Ogre::ManualObject* area_manual_object =
127 Ogre::ManualObject* parking_manual_object =
129 Ogre::ManualObject* lane_fill_manual_object =
131 Ogre::ManualObject* sidewalk_manual_object =
133 Ogre::ManualObject* crosswalk_manual_object =
136 if (map_ptr ==
nullptr) {
147 map_manual_object->begin(
material_line_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
148 separator_manual_object->begin(
material_line_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
149 area_manual_object->begin(
material_surface_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
150 parking_manual_object->begin(
material_surface_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
151 lane_fill_manual_object->begin(
material_surface_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
152 sidewalk_manual_object->begin(
material_surface_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
153 crosswalk_manual_object->begin(
material_surface_->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST,
"rviz_rendering");
155 const uint8_t q_surfaces = Ogre::RENDER_QUEUE_MAIN;
156 const uint8_t q_lines = Ogre::RENDER_QUEUE_MAIN + 5;
157 lane_fill_manual_object->setRenderQueueGroup(q_surfaces);
158 area_manual_object->setRenderQueueGroup(q_surfaces);
159 parking_manual_object->setRenderQueueGroup(q_surfaces);
160 sidewalk_manual_object->setRenderQueueGroup(q_surfaces);
161 crosswalk_manual_object->setRenderQueueGroup(q_surfaces);
162 map_manual_object->setRenderQueueGroup(q_lines);
163 separator_manual_object->setRenderQueueGroup(q_lines);
165 for (
const lanelet::ConstLanelet& lanelet : map_ptr->laneletLayer) {
166 bsd_helpers_->addLaneletToManualObject(lanelet, map_manual_object);
167 bsd_helpers_->addSeperatorToManualObject(lanelet, separator_manual_object);
169 bsd_helpers_->addLaneFillToManualObject(lanelet, lane_fill_manual_object);
175 for (
const lanelet::ConstArea& area : map_ptr->areaLayer) {
176 auto attributes = area.attributes();
177 const auto subtype = attributes[lanelet::AttributeName::Subtype];
179 if (subtype == lanelet::AttributeValueString::Parking) {
180 bsd_helpers_->addParkingAreaToManualObject(area, parking_manual_object);
182 bsd_helpers_->addCrosswalkToManualObject(area, crosswalk_manual_object);
184 bsd_helpers_->addSidewalkToManualObject(area, sidewalk_manual_object);
186 bsd_helpers_->addAreaToManualObject(area, area_manual_object);
190 map_manual_object->end();
191 separator_manual_object->end();
192 area_manual_object->end();
193 parking_manual_object->end();
194 lane_fill_manual_object->end();
195 sidewalk_manual_object->end();
196 crosswalk_manual_object->end();
198 auto attach_if_populated = [
this](Ogre::ManualObject* manual_object,
ObjectClassification classification) {
200 if (manual_object->getNumSections() != 0U) {
202 objects_.push_back(std::make_pair(classification, manual_object));