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> 53 Ogre::SceneNode* parent_node)
54 :
MarkerBase(owner, context, parent_node), entity_(nullptr)
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 if (!
entity_ || old_message->mesh_resource != new_message->mesh_resource ||
104 old_message->mesh_use_embedded_materials != new_message->mesh_use_embedded_materials)
108 if (new_message->mesh_resource.empty())
115 std::stringstream ss;
116 ss <<
"Mesh resource marker [" <<
getStringID() <<
"] could not load [" 117 << new_message->mesh_resource <<
"]";
126 static uint32_t count = 0;
127 std::stringstream ss;
128 ss <<
"mesh_resource_marker_" << count++;
129 std::string
id = ss.str();
135 Ogre::MaterialPtr default_material =
137 default_material->setReceiveShadows(
false);
138 default_material->getTechnique(0)->setLightingEnabled(
true);
139 default_material->getTechnique(0)->setAmbient(0.5, 0.5, 0.5);
142 if (new_message->mesh_use_embedded_materials)
145 for (
const Ogre::MaterialPtr& material :
getMaterials())
147 if (material->getName() !=
"BaseWhiteNoLighting")
149 Ogre::MaterialPtr new_material = material->clone(
id + material->getName());
151 Ogre::Pass* pass = new_material->getTechnique(0)->createPass();
152 pass->setAmbient(0.0
f, 0.0
f, 0.0
f);
153 pass->setDiffuse(0.0
f, 0.0
f, 0.0
f, 0.0
f);
154 pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
155 pass->setDepthWriteEnabled(
false);
156 pass->setLightingEnabled(
true);
162 for (uint32_t i = 0; i <
entity_->getNumSubEntities(); ++i)
164 std::string mat_name =
entity_->getSubEntity(i)->getMaterialName();
165 if (mat_name !=
"BaseWhiteNoLighting")
167 entity_->getSubEntity(i)->setMaterialName(
id + mat_name);
175 entity_->getSubEntity(i)->setMaterial(default_material);
181 entity_->setMaterial(default_material);
184 update_color = !(new_message->mesh_use_embedded_materials && r == 0 && g == 0 && b == 0 && a == 0);
194 if (!old_message || old_message->color.r != r || old_message->color.g != g ||
195 old_message->color.b != b || old_message->color.a != a)
204 bool depth_write = a >= 0.9998;
205 Ogre::SceneBlendType blending = depth_write ? Ogre::SBT_REPLACE : Ogre::SBT_TRANSPARENT_ALPHA;
206 bool tinting = new_message->mesh_use_embedded_materials;
208 for (
const Ogre::MaterialPtr& material :
materials_)
210 Ogre::Technique* technique = material->getTechnique(0);
211 Ogre::Pass* pass0 = technique->getPass(0);
212 Ogre::Pass* passT = technique->getPass(technique->getNumPasses() - 1);
216 Ogre::ColourValue color = pass0->getDiffuse();
218 pass0->setDiffuse(color);
220 passT->setAmbient(r * 0.5
f, g * 0.5f, b * 0.5f);
221 passT->setDiffuse(r, g, b, std::min(a, 0.5f));
225 pass0->setAmbient(r * 0.5
f, g * 0.5f, b * 0.5f);
226 pass0->setDiffuse(r, g, b, a);
229 pass0->setSceneBlending(blending);
230 pass0->setDepthWriteEnabled(depth_write);
231 pass0->setLightingEnabled(
true);
235 Ogre::Vector3 pos, scale;
236 Ogre::Quaternion orient;
237 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 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
S_MaterialPtr getMaterials() override
Pure-virtual base class for objects which give Display subclasses context in which to work...
boost::shared_ptr< MarkerSelectionHandler > handler_
void onNewMessage(const MarkerConstPtr &old_message, const MarkerConstPtr &new_message) override
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)
~MeshResourceMarker() override
Displays "markers" sent in by other ROS nodes on the "visualization_marker" topic.