Skip to content

Commit c5bc556

Browse files
committed
When a link has multiple visual tags, use appropriate material for each
Fixes #1293
1 parent 8b21a9e commit c5bc556

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
@@ -177,13 +177,18 @@ private Q_SLOTS:
177177
Ogre::Entity * createEntityForGeometryElement(
178178
const urdf::LinkConstSharedPtr & link,
179179
const urdf::Geometry & geom, const urdf::Pose & origin,
180-
std::string material_name, Ogre::SceneNode * scene_node);
180+
Ogre::SceneNode * scene_node);
181181
void assignMaterialsToEntities(
182182
const urdf::LinkConstSharedPtr & link,
183183
const std::string & material_name,
184184
const Ogre::Entity * entity);
185185
Ogre::MaterialPtr getMaterialForLink(
186186
const urdf::LinkConstSharedPtr & link, std::string material_name = "");
187+
Ogre::MaterialPtr getMaterialForVisual(const urdf::VisualSharedPtr & visual);
188+
void getMaterialForVisualizable(Ogre::Entity * entity, const urdf::VisualSharedPtr & visual);
189+
void getMaterialForVisualizable(
190+
Ogre::Entity * /* entity */,
191+
const urdf::CollisionSharedPtr & /* collision */ ) {};
187192
urdf::VisualSharedPtr getVisualWithMaterial(
188193
const urdf::LinkConstSharedPtr & link, const std::string & material_name) const;
189194
void loadMaterialFromTexture(
@@ -212,8 +217,10 @@ private Q_SLOTS:
212217
T link_visual_element = vector_element;
213218
if (link_visual_element && link_visual_element->geometry) {
214219
Ogre::Entity * mesh = createEntityForGeometryElement(
215-
link, *link_visual_element->geometry, link_visual_element->origin, "", scene_node);
220+
link, *link_visual_element->geometry, link_visual_element->origin, scene_node);
216221
if (mesh) {
222+
getMaterialForVisualizable(mesh, link_visual_element);
223+
assignMaterialsToEntities(link, "", mesh);
217224
meshes_vector.push_back(mesh);
218225
valid_visualizable_found = true;
219226
}
@@ -222,8 +229,10 @@ private Q_SLOTS:
222229

223230
if (!valid_visualizable_found && visualizable_element && visualizable_element->geometry) {
224231
Ogre::Entity * mesh = createEntityForGeometryElement(
225-
link, *visualizable_element->geometry, visualizable_element->origin, "", scene_node);
232+
link, *visualizable_element->geometry, visualizable_element->origin, scene_node);
226233
if (mesh) {
234+
getMaterialForVisualizable(mesh, visualizable_element);
235+
assignMaterialsToEntities(link, "", mesh);
227236
meshes_vector.push_back(mesh);
228237
}
229238
}

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
@@ -595,7 +595,6 @@ Ogre::Entity * RobotLink::createEntityForGeometryElement(
595595
const urdf::LinkConstSharedPtr & link,
596596
const urdf::Geometry & geom,
597597
const urdf::Pose & origin,
598-
const std::string material_name,
599598
Ogre::SceneNode * scene_node)
600599
{
601600
Ogre::Entity * entity = nullptr; // default in case nothing works.
@@ -700,7 +699,6 @@ Ogre::Entity * RobotLink::createEntityForGeometryElement(
700699
offset_node->setPosition(offset_position);
701700
offset_node->setOrientation(offset_orientation);
702701

703-
assignMaterialsToEntities(link, material_name, entity);
704702
}
705703
return entity;
706704
}
@@ -757,14 +755,19 @@ Ogre::MaterialPtr RobotLink::getMaterialForLink(
757755
return Ogre::MaterialManager::getSingleton().getByName("RVIZ/ShadedRed");
758756
}
759757

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

763768
auto material_for_link =
764769
rviz_rendering::MaterialManager::createMaterialWithShadowsAndLighting(link_material_name);
765770

766-
urdf::VisualSharedPtr visual = getVisualWithMaterial(link, material_name);
767-
768771
if (visual->material->texture_filename.empty()) {
769772
const urdf::Color & color = visual->material->color;
770773
material_for_link->getTechnique(0)->setAmbient(color.r * 0.5f, color.g * 0.5f, color.b * 0.5f);
@@ -778,14 +781,27 @@ Ogre::MaterialPtr RobotLink::getMaterialForLink(
778781
return material_for_link;
779782
}
780783

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

0 commit comments

Comments
 (0)