40 #include <OgreSceneNode.h> 41 #include <OgreSceneManager.h> 42 #include <OgreEntity.h> 43 #include <OgreSubEntity.h> 44 #include <OgreMaterialManager.h> 45 #include <OgreTextureManager.h> 46 #include <OgreSharedPtr.h> 47 #include <OgreTechnique.h> 74 S_MaterialPtr::iterator it;
77 Ogre::MaterialPtr material = *it;
78 if (!material.isNull())
81 Ogre::MaterialManager::getSingleton().remove(material->getName());
90 ROS_ASSERT(new_message->type == visualization_msgs::Marker::MESH_RESOURCE);
93 bool update_color =
false;
98 float r = new_message->color.r;
99 float g = new_message->color.g;
100 float b = new_message->color.b;
101 float a = new_message->color.a;
103 Ogre::SceneBlendType blending;
108 blending = Ogre::SBT_TRANSPARENT_ALPHA;
113 blending = Ogre::SBT_REPLACE;
119 old_message->mesh_resource != new_message->mesh_resource ||
120 old_message->mesh_use_embedded_materials != new_message->mesh_use_embedded_materials)
124 if (new_message->mesh_resource.empty())
131 std::stringstream ss;
132 ss <<
"Mesh resource marker [" <<
getStringID() <<
"] could not load [" << new_message->mesh_resource <<
"]";
141 static uint32_t count = 0;
142 std::stringstream ss;
143 ss <<
"mesh_resource_marker_" << count++;
144 std::string
id = ss.str();
150 Ogre::MaterialPtr default_material = Ogre::MaterialManager::getSingleton().create(ss.str(),
ROS_PACKAGE_NAME);
151 default_material->setReceiveShadows(
false);
152 default_material->getTechnique(0)->setLightingEnabled(
true);
153 default_material->getTechnique(0)->setAmbient(0.5, 0.5, 0.5);
157 if (new_message->mesh_use_embedded_materials)
162 S_MaterialPtr::iterator it;
163 for (it = materials.begin(); it != materials.end(); it++)
165 if ((*it)->getName() !=
"BaseWhiteNoLighting")
167 Ogre::MaterialPtr new_material = (*it)->clone(
id + (*it)->getName());
173 for (uint32_t i = 0; i <
entity_->getNumSubEntities(); ++i)
175 std::string mat_name =
entity_->getSubEntity(i)->getMaterialName();
176 if (mat_name !=
"BaseWhiteNoLighting")
178 entity_->getSubEntity(i)->setMaterialName(
id + mat_name);
186 entity_->getSubEntity(i)->setMaterial(default_material);
192 entity_->setMaterial(default_material);
204 if (new_message->mesh_use_embedded_materials ==
false 206 || old_message->mesh_use_embedded_materials ==
true 207 || old_message->color.r != new_message->color.r
208 || old_message->color.g != new_message->color.g
209 || old_message->color.b != new_message->color.b
210 || old_message->color.a != new_message->color.a))
221 if( new_message->mesh_use_embedded_materials && r == 0 && g == 0 && b == 0 && a == 0 )
223 blending = Ogre::SBT_REPLACE;
225 r = 1; g = 1; b = 1; a = 1;
227 S_MaterialPtr::iterator material_it;
230 Ogre::Technique* technique = (*material_it)->getTechnique(0);
231 technique->setAmbient( r*0.5, g*0.5, b*0.5 );
232 technique->setDiffuse( r, g, b, a );
233 technique->setSceneBlending( blending );
234 technique->setDepthWriteEnabled( depth_write );
235 technique->setLightingEnabled(
true );
240 Ogre::Vector3 pos, scale;
241 Ogre::Quaternion orient;
242 transform(new_message, pos, orient, scale);
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)
MeshResourceMarker(MarkerDisplay *owner, DisplayContext *context, Ogre::SceneNode *parent_node)
std::string getStringID()
virtual void onNewMessage(const MarkerConstPtr &old_message, const MarkerConstPtr &new_message)
virtual void setPosition(const Ogre::Vector3 &position)
Ogre::MeshPtr loadMeshFromResource(const std::string &resource_path)
void extractMaterials(Ogre::Entity *entity, S_MaterialPtr &materials)
std::pair< std::string, int32_t > MarkerID
Pure-virtual base class for objects which give Display subclasses context in which to work...
boost::shared_ptr< MarkerSelectionHandler > handler_
virtual S_MaterialPtr getMaterials()
DisplayContext * context_
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.