diff --git a/src/experimental/usd/usd_to_mjspec.cc b/src/experimental/usd/usd_to_mjspec.cc index 0e9e5ebf..d1c48ceb 100644 --- a/src/experimental/usd/usd_to_mjspec.cc +++ b/src/experimental/usd/usd_to_mjspec.cc @@ -49,6 +49,8 @@ #include #include #include +#include +#include #include #include #include @@ -742,6 +744,32 @@ void ParseUsdPhysicsCollider(mjSpec* spec, ParseMjcPhysicsCollisionAPI(geom, pxr::MjcPhysicsCollisionAPI(prim)); } + // Convert displayColor and displayOpacity to rgba. + // We want to support primvar inheritance, hence FindPrimvarWithInheritance. + pxr::UsdGeomPrimvarsAPI primvarsAPI(prim); + pxr::UsdGeomPrimvar displayColorPrimvar = + primvarsAPI.FindPrimvarWithInheritance( + pxr::UsdGeomTokens->primvarsDisplayColor); + pxr::UsdGeomPrimvar displayOpacityPrimvar = + primvarsAPI.FindPrimvarWithInheritance( + pxr::UsdGeomTokens->primvarsDisplayOpacity); + if (displayColorPrimvar.HasAuthoredValue()) { + pxr::VtArray display_color; + displayColorPrimvar.Get(&display_color); + if (!display_color.empty()) { + geom->rgba[0] = display_color[0][0]; + geom->rgba[1] = display_color[0][1]; + geom->rgba[2] = display_color[0][2]; + } + } + if (displayOpacityPrimvar.HasAuthoredValue()) { + pxr::VtArray display_opacity; + displayOpacityPrimvar.Get(&display_opacity); + if (!display_opacity.empty()) { + geom->rgba[3] = display_opacity[0]; + } + } + SetLocalPoseFromPrim(prim, parent_prim, geom, xform_cache); if (!MaybeParseGeomPrimitive(prim, geom, xform_cache)) {