@@ -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 );
0 commit comments