46 #include "nav2_rviz_plugins/particle_cloud_display/flat_weighted_arrows_array.hpp"
52 #include <OgreSceneManager.h>
53 #include <OgreTechnique.h>
55 #include "rviz_rendering/material_manager.hpp"
57 namespace nav2_rviz_plugins
60 FlatWeightedArrowsArray::FlatWeightedArrowsArray(Ogre::SceneManager * scene_manager)
61 : scene_manager_(scene_manager), manual_object_(nullptr) {}
63 FlatWeightedArrowsArray::~FlatWeightedArrowsArray()
66 scene_manager_->destroyManualObject(manual_object_);
70 void FlatWeightedArrowsArray::createAndAttachManualObject(Ogre::SceneNode * scene_node)
72 manual_object_ = scene_manager_->createManualObject();
73 manual_object_->setDynamic(
true);
74 scene_node->attachObject(manual_object_);
77 void FlatWeightedArrowsArray::updateManualObject(
78 Ogre::ColourValue color,
82 const std::vector<nav2_rviz_plugins::OgrePoseWithWeight> & poses)
87 setManualObjectMaterial();
88 rviz_rendering::MaterialManager::enableAlphaBlending(material_, alpha);
90 manual_object_->begin(
91 material_->getName(), Ogre::RenderOperation::OT_LINE_LIST,
"rviz_rendering");
92 setManualObjectVertices(color, min_length, max_length, poses);
93 manual_object_->end();
96 void FlatWeightedArrowsArray::clear()
99 manual_object_->clear();
103 void FlatWeightedArrowsArray::setManualObjectMaterial()
105 static int material_count = 0;
106 std::string material_name =
"FlatWeightedArrowsMaterial" + std::to_string(material_count++);
107 material_ = rviz_rendering::MaterialManager::createMaterialWithNoLighting(material_name);
110 void FlatWeightedArrowsArray::setManualObjectVertices(
111 const Ogre::ColourValue & color,
114 const std::vector<nav2_rviz_plugins::OgrePoseWithWeight> & poses)
116 manual_object_->estimateVertexCount(poses.size() * 6);
118 float scale = max_length - min_length;
120 for (
const auto & pose : poses) {
121 length = std::min(std::max(pose.weight * scale + min_length, min_length), max_length);
122 Ogre::Vector3 vertices[6];
123 vertices[0] = pose.position;
125 pose.position + pose.orientation * Ogre::Vector3(length, 0, 0);
126 vertices[2] = vertices[1];
127 vertices[3] = pose.position + pose.orientation * Ogre::Vector3(
128 0.75f * length, 0.2f * length, 0);
129 vertices[4] = vertices[1];
130 vertices[5] = pose.position + pose.orientation * Ogre::Vector3(
131 0.75f * length, -0.2f * length,
134 for (
const auto & vertex : vertices) {
135 manual_object_->position(vertex);
136 manual_object_->colour(color);