Skip to content

Commit de547fb

Browse files
committed
When a link has multiple visual tags, use appropriate material for each
Fixes #1293
1 parent 9bbca6e commit de547fb

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

rviz_default_plugins/include/rviz_default_plugins/robot/robot_link.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,18 @@ private Q_SLOTS:
179179
Ogre::Entity * createEntityForGeometryElement(
180180
const urdf::LinkConstSharedPtr & link,
181181
const urdf::Geometry & geom, const urdf::Pose & origin,
182-
std::string material_name, Ogre::SceneNode * scene_node);
182+
Ogre::SceneNode * scene_node);
183183
void assignMaterialsToEntities(
184184
const urdf::LinkConstSharedPtr & link,
185185
const std::string & material_name,
186186
const Ogre::Entity * entity);
187187
Ogre::MaterialPtr getMaterialForLink(
188188
const urdf::LinkConstSharedPtr & link, std::string material_name = "");
189+
Ogre::MaterialPtr getMaterialForVisual(const urdf::VisualSharedPtr & visual);
190+
void getMaterialForVisualizable(Ogre::Entity * entity, const urdf::VisualSharedPtr & visual);
191+
void getMaterialForVisualizable(
192+
Ogre::Entity * /* entity */,
193+
const urdf::CollisionSharedPtr & /* collision */ ) {};
189194
urdf::VisualSharedPtr getVisualWithMaterial(
190195
const urdf::LinkConstSharedPtr & link, const std::string & material_name) const;
191196
void loadMaterialFromTexture(
@@ -214,8 +219,10 @@ private Q_SLOTS:
214219
T link_visual_element = vector_element;
215220
if (link_visual_element && link_visual_element->geometry) {
216221
Ogre::Entity * mesh = createEntityForGeometryElement(
217-
link, *link_visual_element->geometry, link_visual_element->origin, "", scene_node);
222+
link, *link_visual_element->geometry, link_visual_element->origin, scene_node);
218223
if (mesh) {
224+
getMaterialForVisualizable(mesh, link_visual_element);
225+
assignMaterialsToEntities(link, "", mesh);
219226
meshes_vector.push_back(mesh);
220227
valid_visualizable_found = true;
221228
}
@@ -224,8 +231,10 @@ private Q_SLOTS:
224231

225232
if (!valid_visualizable_found && visualizable_element && visualizable_element->geometry) {
226233
Ogre::Entity * mesh = createEntityForGeometryElement(
227-
link, *visualizable_element->geometry, visualizable_element->origin, "", scene_node);
234+
link, *visualizable_element->geometry, visualizable_element->origin, scene_node);
228235
if (mesh) {
236+
getMaterialForVisualizable(mesh, visualizable_element);
237+
assignMaterialsToEntities(link, "", mesh);
229238
meshes_vector.push_back(mesh);
230239
}
231240
}

rviz_default_plugins/src/rviz_default_plugins/robot/robot_link.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,6 @@ Ogre::Entity * RobotLink::createEntityForGeometryElement(
597597
const urdf::LinkConstSharedPtr & link,
598598
const urdf::Geometry & geom,
599599
const urdf::Pose & origin,
600-
const std::string material_name,
601600
Ogre::SceneNode * scene_node)
602601
{
603602
Ogre::Entity * entity = nullptr; // default in case nothing works.
@@ -702,7 +701,6 @@ Ogre::Entity * RobotLink::createEntityForGeometryElement(
702701
offset_node->setPosition(offset_position);
703702
offset_node->setOrientation(offset_orientation);
704703

705-
assignMaterialsToEntities(link, material_name, entity);
706704
}
707705
return entity;
708706
}
@@ -759,14 +757,19 @@ Ogre::MaterialPtr RobotLink::getMaterialForLink(
759757
return Ogre::MaterialManager::getSingleton().getByName("RVIZ/ShadedRed");
760758
}
761759

760+
urdf::VisualSharedPtr visual = getVisualWithMaterial(link, material_name);
761+
762+
return getMaterialForVisual(visual);
763+
}
764+
765+
Ogre::MaterialPtr RobotLink::getMaterialForVisual(const urdf::VisualSharedPtr & visual)
766+
{
762767
static int count = 0;
763-
std::string link_material_name = "Robot Link Material" + std::to_string(count++);
768+
std::string link_material_name = "Robot Material" + std::to_string(count++);
764769

765770
auto material_for_link =
766771
rviz_rendering::MaterialManager::createMaterialWithShadowsAndLighting(link_material_name);
767772

768-
urdf::VisualSharedPtr visual = getVisualWithMaterial(link, material_name);
769-
770773
if (visual->material->texture_filename.empty()) {
771774
const urdf::Color & color = visual->material->color;
772775
material_for_link->getTechnique(0)->setAmbient(color.r * 0.5f, color.g * 0.5f, color.b * 0.5f);
@@ -780,14 +783,27 @@ Ogre::MaterialPtr RobotLink::getMaterialForLink(
780783
return material_for_link;
781784
}
782785

786+
void RobotLink::getMaterialForVisualizable(
787+
Ogre::Entity * entity,
788+
const urdf::VisualSharedPtr & visual)
789+
{
790+
if (!visual->material_name.empty() ||
791+
(visual->material && !visual->material->texture_filename.empty()))
792+
{
793+
Ogre::MaterialPtr material = getMaterialForVisual(visual);
794+
// Sets uniformly for all subentities
795+
entity -> setMaterial(material);
796+
entity -> setMaterialName(material->getName());
797+
}
798+
}
799+
783800
urdf::VisualSharedPtr RobotLink::getVisualWithMaterial(
784801
const urdf::LinkConstSharedPtr & link, const std::string & material_name) const
785802
{
786803
urdf::VisualSharedPtr visual = link->visual;
787804
for (const auto & visual_array_element : link->visual_array) {
788-
if (visual_array_element &&
789-
!material_name.empty() &&
790-
visual_array_element->material_name == material_name)
805+
if (visual_array_element && !visual_array_element->material_name.empty() &&
806+
(material_name.empty() || visual_array_element->material_name == material_name))
791807
{
792808
visual = visual_array_element;
793809
break;

0 commit comments

Comments
 (0)