@@ -628,6 +628,7 @@ def __init__(
628628 self ._visual_material : List [Dict [str , VisualMaterialInst ]] = [
629629 {} for _ in range (len (entities ))
630630 ]
631+ self .is_shared_visual_material = False
631632
632633 # Stores mimic information for joints.
633634 self ._mimic_info = entities [0 ].get_mimic_info ()
@@ -1582,24 +1583,38 @@ def set_visual_material(
15821583 mat : VisualMaterial ,
15831584 env_ids : Sequence [int ] | None = None ,
15841585 link_names : List [str ] | None = None ,
1586+ shared : bool = False ,
15851587 ) -> None :
15861588 """Set visual material for the rigid object.
15871589
15881590 Args:
15891591 mat (VisualMaterial): The material to set.
15901592 env_ids (Sequence[int] | None, optional): Environment indices. If None, then all indices are used.
15911593 link_names (List[str] | None, optional): List of link names to apply the material to. If None, applies to all links.
1594+ shared (bool, optional): Whether to share the material instance across links and environments. Defaults to False.
15921595 """
15931596 local_env_ids = self ._all_indices if env_ids is None else env_ids
15941597 link_names = self .link_names if link_names is None else link_names
15951598
1596- for i , env_idx in enumerate (local_env_ids ):
1599+ if shared :
1600+ if len (local_env_ids ) != self .num_instances :
1601+ logger .log_error (f"Cannot share material instance for partial env_ids." )
1602+
15971603 for link_name in link_names :
1598- mat_inst = mat .create_instance (
1599- f"{ mat .uid } _{ self .uid } _{ link_name } _{ env_idx } "
1600- )
1601- self ._entities [env_idx ].set_material (link_name , mat_inst .mat )
1602- self ._visual_material [env_idx ][link_name ] = mat_inst
1604+ mat_inst = mat .create_instance (f"{ mat .uid } _{ self .uid } _{ link_name } " )
1605+ for i , env_idx in enumerate (local_env_ids ):
1606+ self ._entities [env_idx ].set_material (link_name , mat_inst .mat )
1607+ self ._visual_material [env_idx ][link_name ] = mat_inst
1608+ self .is_shared_visual_material = True
1609+ else :
1610+ for i , env_idx in enumerate (local_env_ids ):
1611+ for link_name in link_names :
1612+ mat_inst = mat .create_instance (
1613+ f"{ mat .uid } _{ self .uid } _{ link_name } _{ env_idx } "
1614+ )
1615+ self ._entities [env_idx ].set_material (link_name , mat_inst .mat )
1616+ self ._visual_material [env_idx ][link_name ] = mat_inst
1617+ self .is_shared_visual_material = False
16031618
16041619 def get_visual_material_inst (
16051620 self ,
0 commit comments