41 #include <OgreSceneNode.h> 42 #include <OgreSceneManager.h> 43 #include <OgreManualObject.h> 44 #include <OgreMaterialManager.h> 45 #include <OgreTextureManager.h> 46 #include <OgreTechnique.h> 63 Ogre::MaterialManager::getSingleton().remove(
material_->getName());
69 ROS_ASSERT(new_message->type == visualization_msgs::Marker::TRIANGLE_LIST);
71 size_t num_points = new_message->points.size();
72 if( (num_points % 3) != 0 || num_points == 0 )
77 ss <<
"TriMesh marker [" <<
getStringID() <<
"] has no points.";
81 ss <<
"TriMesh marker [" <<
getStringID() <<
"] has a point count which is not divisible by 3 [" << num_points <<
"]";
99 static uint32_t count = 0;
101 ss <<
"Triangle List Marker" << count++;
109 material_->getTechnique(0)->setLightingEnabled(
true);
110 material_->setCullingMode(Ogre::CULL_NONE);
115 Ogre::Vector3 pos, scale;
116 Ogre::Quaternion orient;
117 if (!
transform(new_message, pos, orient, scale))
119 ROS_DEBUG(
"Unable to transform marker message");
124 if (
owner_ && (new_message->scale.x * new_message->scale.y * new_message->scale.z == 0.0f) )
134 if (old_message && num_points == old_message->points.size())
145 bool has_vertex_colors = new_message->colors.size() == num_points;
146 bool has_face_colors = new_message->colors.size() == num_points / 3;
147 bool any_vertex_has_alpha =
false;
149 const std::vector<geometry_msgs::Point>& points = new_message->points;
150 for(
size_t i = 0; i < num_points; i += 3)
152 std::vector<Ogre::Vector3> corners(3);
153 for(
size_t c = 0; c < 3; c++)
155 corners[c] = Ogre::Vector3(points[i+c].
x, points[i+c].
y, points[i+c].
z);
157 Ogre::Vector3 normal = (corners[1] - corners[0]).crossProduct(corners[2] - corners[0]);
160 for(
size_t c = 0; c < 3; c++)
164 if(has_vertex_colors)
166 any_vertex_has_alpha = any_vertex_has_alpha || (new_message->colors[i+c].a < 0.9998);
168 new_message->colors[i+c].g,
169 new_message->colors[i+c].b,
170 new_message->color.a * new_message->colors[i+c].a);
172 else if (has_face_colors)
174 any_vertex_has_alpha = any_vertex_has_alpha || (new_message->colors[i/3].a < 0.9998);
176 new_message->colors[i/3].g,
177 new_message->colors[i/3].b,
178 new_message->color.a * new_message->colors[i/3].a);
185 if (has_vertex_colors || has_face_colors)
187 material_->getTechnique(0)->setLightingEnabled(
false);
191 material_->getTechnique(0)->setLightingEnabled(
true);
193 r = new_message->color.r;
194 g = new_message->color.g;
195 b = new_message->color.b;
196 a = new_message->color.a;
197 material_->getTechnique(0)->setAmbient( r/2,g/2,b/2 );
198 material_->getTechnique(0)->setDiffuse( r,g,b,a );
201 if( (!has_vertex_colors && new_message->color.a < 0.9998) || (has_vertex_colors && any_vertex_has_alpha))
203 material_->getTechnique(0)->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA );
204 material_->getTechnique(0)->setDepthWriteEnabled(
false );
208 material_->getTechnique(0)->setSceneBlending( Ogre::SBT_REPLACE );
209 material_->getTechnique(0)->setDepthWriteEnabled(
true );
std::string material_name_
Ogre::MaterialPtr material_
Ogre::SceneNode * scene_node_
bool transform(const MarkerConstPtr &message, Ogre::Vector3 &pos, Ogre::Quaternion &orient, Ogre::Vector3 &scale)
void setMarkerStatus(MarkerID id, StatusLevel level, const std::string &text)
std::string getStringID()
virtual void setPosition(const Ogre::Vector3 &position)
TFSIMD_FORCE_INLINE const tfScalar & y() const
std::pair< std::string, int32_t > MarkerID
Ogre::ManualObject * manual_object_
virtual void onNewMessage(const MarkerConstPtr &old_message, const MarkerConstPtr &new_message)
Pure-virtual base class for objects which give Display subclasses context in which to work...
boost::shared_ptr< MarkerSelectionHandler > handler_
DisplayContext * context_
TFSIMD_FORCE_INLINE const tfScalar & x() const
TFSIMD_FORCE_INLINE const tfScalar & z() const
TriangleListMarker(MarkerDisplay *owner, DisplayContext *context, Ogre::SceneNode *parent_node)
virtual S_MaterialPtr getMaterials()
visualization_msgs::Marker::ConstPtr MarkerConstPtr
virtual Ogre::SceneManager * getSceneManager() const =0
Returns the Ogre::SceneManager used for the main RenderPanel.
std::set< Ogre::MaterialPtr > S_MaterialPtr
virtual void setOrientation(const Ogre::Quaternion &orientation)
Displays "markers" sent in by other ROS nodes on the "visualization_marker" topic.