40 #include <OgreSceneNode.h>
41 #include <OgreSceneManager.h>
42 #include <OgreManualObject.h>
43 #include <OgreMaterialManager.h>
44 #include <OgreTextureManager.h>
45 #include <OgreTechnique.h>
51 Ogre::SceneNode* parent_node)
52 :
MarkerBase(owner, context, parent_node), manual_object_(nullptr)
61 Ogre::MaterialManager::getSingleton().remove(
material_->getName());
68 ROS_ASSERT(new_message->type == visualization_msgs::Marker::TRIANGLE_LIST);
70 Ogre::Vector3 pos, scale;
71 Ogre::Quaternion orient;
72 if (!
transform(new_message, pos, orient, scale))
78 size_t num_points = new_message->points.size();
79 if ((num_points % 3) != 0 || num_points == 0)
91 static uint32_t count = 0;
93 ss <<
"Triangle List Marker" << count++;
99 material_ = Ogre::MaterialManager::getSingleton().create(
100 material_name_, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
102 material_->getTechnique(0)->setLightingEnabled(
true);
103 material_->setCullingMode(Ogre::CULL_NONE);
114 if (old_message && num_points == old_message->points.size())
125 bool has_vertex_colors = new_message->colors.size() == num_points;
126 bool has_face_colors = new_message->colors.size() == num_points / 3;
127 bool any_vertex_has_alpha =
false;
129 const std::vector<geometry_msgs::Point>& points = new_message->points;
130 for (
size_t i = 0; i < num_points; i += 3)
132 std::vector<Ogre::Vector3> corners(3);
133 for (
size_t c = 0; c < 3; c++)
135 corners[c] = Ogre::Vector3(points[i + c].x, points[i + c].y, points[i + c].z);
137 Ogre::Vector3 normal = (corners[1] - corners[0]).crossProduct(corners[2] - corners[0]);
140 for (
size_t c = 0; c < 3; c++)
144 if (has_vertex_colors)
146 any_vertex_has_alpha = any_vertex_has_alpha || (new_message->colors[i + c].a < 0.9998);
147 manual_object_->colour(new_message->colors[i + c].r, new_message->colors[i + c].g,
148 new_message->colors[i + c].b,
149 new_message->color.a * new_message->colors[i + c].a);
151 else if (has_face_colors)
153 any_vertex_has_alpha = any_vertex_has_alpha || (new_message->colors[i / 3].a < 0.9998);
154 manual_object_->colour(new_message->colors[i / 3].r, new_message->colors[i / 3].g,
155 new_message->colors[i / 3].b,
156 new_message->color.a * new_message->colors[i / 3].a);
163 if (has_vertex_colors || has_face_colors)
165 material_->getTechnique(0)->setLightingEnabled(
false);
169 material_->getTechnique(0)->setLightingEnabled(
true);
171 r = new_message->color.r;
172 g = new_message->color.g;
173 b = new_message->color.b;
174 a = new_message->color.a;
175 material_->getTechnique(0)->setAmbient(r / 2, g / 2, b / 2);
176 material_->getTechnique(0)->setDiffuse(r, g, b, a);
179 if ((!has_vertex_colors && new_message->color.a < 0.9998) ||
180 (has_vertex_colors && any_vertex_has_alpha))
182 material_->getTechnique(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
183 material_->getTechnique(0)->setDepthWriteEnabled(
false);
187 material_->getTechnique(0)->setSceneBlending(Ogre::SBT_REPLACE);
188 material_->getTechnique(0)->setDepthWriteEnabled(
true);