Skip to content

Commit 28fb778

Browse files
committed
support different materials for individual visuals
alternative implementation for ros-visualization#1079
1 parent e906f82 commit 28fb778

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

src/rviz/robot/robot_link.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -438,29 +438,32 @@ void RobotLink::updateVisibility()
438438
}
439439
}
440440

441-
Ogre::MaterialPtr RobotLink::getMaterialForLink( const urdf::LinkConstSharedPtr& link)
441+
Ogre::MaterialPtr RobotLink::getMaterialForLink( const urdf::LinkConstSharedPtr& link, urdf::MaterialConstSharedPtr material )
442442
{
443443
Ogre::MaterialPtr mat = Ogre::MaterialPtr(new Ogre::Material(nullptr, "robot link material", 0, ROS_PACKAGE_NAME));
444444

445-
if (!link->visual || !link->visual->material)
445+
if (!material && link->visual && link->visual->material)
446+
material = link->visual->material; // fallback to visual's material
447+
448+
if (!material)
446449
{
447450
// clone default material (for modification by link)
448451
*mat = *Ogre::MaterialManager::getSingleton().getByName("RVIZ/ShadedRed");
449452
return mat;
450453
}
451454

452455
mat->getTechnique(0)->setLightingEnabled(true);
453-
if (link->visual->material->texture_filename.empty())
456+
if (material->texture_filename.empty())
454457
{
455-
const urdf::Color& col = link->visual->material->color;
458+
const urdf::Color& col = material->color;
456459
mat->getTechnique(0)->setAmbient(col.r * 0.5, col.g * 0.5, col.b * 0.5);
457460
mat->getTechnique(0)->setDiffuse(col.r, col.g, col.b, col.a);
458461

459462
material_alpha_ = col.a;
460463
}
461464
else
462465
{
463-
std::string filename = link->visual->material->texture_filename;
466+
std::string filename = material->texture_filename;
464467
if (!Ogre::TextureManager::getSingleton().resourceExists(filename))
465468
{
466469
resource_retriever::Retriever retriever;
@@ -505,7 +508,7 @@ Ogre::MaterialPtr RobotLink::getMaterialForLink( const urdf::LinkConstSharedPtr&
505508
return mat;
506509
}
507510

508-
void RobotLink::createEntityForGeometryElement(const urdf::LinkConstSharedPtr& link, const urdf::Geometry& geom, const urdf::Pose& origin, Ogre::SceneNode* scene_node, Ogre::Entity*& entity)
511+
void RobotLink::createEntityForGeometryElement(const urdf::LinkConstSharedPtr& link, const urdf::Geometry& geom, const urdf::MaterialSharedPtr& material, const urdf::Pose& origin, Ogre::SceneNode* scene_node, Ogre::Entity*& entity)
509512
{
510513
entity = NULL; // default in case nothing works.
511514
Ogre::SceneNode* offset_node = scene_node->createChildSceneNode();
@@ -602,9 +605,10 @@ void RobotLink::createEntityForGeometryElement(const urdf::LinkConstSharedPtr& l
602605
offset_node->setPosition(offset_position);
603606
offset_node->setOrientation(offset_orientation);
604607

605-
if (default_material_.isNull())
608+
if (default_material_.isNull() || material)
606609
{
607-
default_material_ = getMaterialForLink(link);
610+
// latest used material becomes the default for this link
611+
default_material_ = getMaterialForLink(link, material);
608612
}
609613

610614
for (uint32_t i = 0; i < entity->getNumSubEntities(); ++i)
@@ -638,7 +642,7 @@ void RobotLink::createCollision(const urdf::LinkConstSharedPtr& link)
638642
if( collision && collision->geometry )
639643
{
640644
Ogre::Entity* collision_mesh = NULL;
641-
createEntityForGeometryElement( link, *collision->geometry, collision->origin, collision_node_, collision_mesh );
645+
createEntityForGeometryElement( link, *collision->geometry, urdf::MaterialSharedPtr(), collision->origin, collision_node_, collision_mesh );
642646
if( collision_mesh )
643647
{
644648
collision_meshes_.push_back( collision_mesh );
@@ -656,7 +660,7 @@ void RobotLink::createCollision(const urdf::LinkConstSharedPtr& link)
656660
if( collision && collision->geometry )
657661
{
658662
Ogre::Entity* collision_mesh = NULL;
659-
createEntityForGeometryElement( link, *collision->geometry, collision->origin, collision_node_, collision_mesh );
663+
createEntityForGeometryElement( link, *collision->geometry, urdf::MaterialSharedPtr(), collision->origin, collision_node_, collision_mesh );
660664
if( collision_mesh )
661665
{
662666
collision_meshes_.push_back( collision_mesh );
@@ -669,7 +673,7 @@ void RobotLink::createCollision(const urdf::LinkConstSharedPtr& link)
669673
if( !valid_collision_found && link->collision && link->collision->geometry )
670674
{
671675
Ogre::Entity* collision_mesh = NULL;
672-
createEntityForGeometryElement( link, *link->collision->geometry, link->collision->origin, collision_node_, collision_mesh );
676+
createEntityForGeometryElement( link, *link->collision->geometry, urdf::MaterialSharedPtr(), link->collision->origin, collision_node_, collision_mesh );
673677
if( collision_mesh )
674678
{
675679
collision_meshes_.push_back( collision_mesh );
@@ -695,7 +699,7 @@ void RobotLink::createVisual(const urdf::LinkConstSharedPtr& link )
695699
if( visual && visual->geometry )
696700
{
697701
Ogre::Entity* visual_mesh = NULL;
698-
createEntityForGeometryElement( link, *visual->geometry, visual->origin, visual_node_, visual_mesh );
702+
createEntityForGeometryElement( link, *visual->geometry, visual->material, visual->origin, visual_node_, visual_mesh );
699703
if( visual_mesh )
700704
{
701705
visual_meshes_.push_back( visual_mesh );
@@ -713,7 +717,7 @@ void RobotLink::createVisual(const urdf::LinkConstSharedPtr& link )
713717
if( visual && visual->geometry )
714718
{
715719
Ogre::Entity* visual_mesh = NULL;
716-
createEntityForGeometryElement( link, *visual->geometry, visual->origin, visual_node_, visual_mesh );
720+
createEntityForGeometryElement( link, *visual->geometry, visual->material, visual->origin, visual_node_, visual_mesh );
717721
if( visual_mesh )
718722
{
719723
visual_meshes_.push_back( visual_mesh );
@@ -726,7 +730,7 @@ void RobotLink::createVisual(const urdf::LinkConstSharedPtr& link )
726730
if( !valid_visual_found && link->visual && link->visual->geometry )
727731
{
728732
Ogre::Entity* visual_mesh = NULL;
729-
createEntityForGeometryElement( link, *link->visual->geometry, link->visual->origin, visual_node_, visual_mesh );
733+
createEntityForGeometryElement( link, *link->visual->geometry, link->visual->material, link->visual->origin, visual_node_, visual_mesh );
730734
if( visual_mesh )
731735
{
732736
visual_meshes_.push_back( visual_mesh );

src/rviz/robot/robot_link.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,12 @@ private Q_SLOTS:
155155
private:
156156
void setRenderQueueGroup( Ogre::uint8 group );
157157
bool getEnabled() const;
158-
void createEntityForGeometryElement( const urdf::LinkConstSharedPtr& link, const urdf::Geometry& geom, const urdf::Pose& origin, Ogre::SceneNode* scene_node, Ogre::Entity*& entity );
158+
void createEntityForGeometryElement( const urdf::LinkConstSharedPtr& link, const urdf::Geometry& geom, const urdf::MaterialSharedPtr& material, const urdf::Pose& origin, Ogre::SceneNode* scene_node, Ogre::Entity*& entity );
159159

160160
void createVisual( const urdf::LinkConstSharedPtr& link);
161161
void createCollision( const urdf::LinkConstSharedPtr& link);
162162
void createSelection();
163-
Ogre::MaterialPtr getMaterialForLink( const urdf::LinkConstSharedPtr& link );
163+
Ogre::MaterialPtr getMaterialForLink( const urdf::LinkConstSharedPtr& link , urdf::MaterialConstSharedPtr material );
164164

165165

166166
protected:

0 commit comments

Comments
 (0)