diff --git a/plugin/usd_decoder/usd_decoder.cc b/plugin/usd_decoder/usd_decoder.cc index 015e9bd7..8d45bd5d 100644 --- a/plugin/usd_decoder/usd_decoder.cc +++ b/plugin/usd_decoder/usd_decoder.cc @@ -67,6 +67,7 @@ #include #include #include +#include #include #include #include @@ -2247,6 +2248,16 @@ void ParseMjcPhysicsKeyframe(mjSpec* spec, } } +void ParseUsdFilteredPairsAPI(mjSpec* spec, const pxr::UsdPrim& prim) { + pxr::SdfPathVector filtered_bodies; + pxr::UsdPhysicsFilteredPairsAPI(prim).GetFilteredPairsRel().GetTargets(&filtered_bodies); + for (const auto& filtered_body : filtered_bodies) { + mjsExclude* exclude = mjs_addExclude(spec); + mjs_setString(exclude->bodyname1, prim.GetPath().GetAsString().c_str()); + mjs_setString(exclude->bodyname2, filtered_body.GetAsString().c_str()); + } +} + mjsBody* ParseUsdPhysicsRigidbody( mjSpec* spec, const pxr::UsdPhysicsRigidBodyAPI& rigidbody_api, const pxr::UsdPrim& parent_prim, mjsBody* parent, @@ -2267,6 +2278,10 @@ mjsBody* ParseUsdPhysicsRigidbody( body->element, kUsdPrimPathKey, usd_primpath, [](const void* data) { delete static_cast(data); }); + if (prim.HasAPI()) { + ParseUsdFilteredPairsAPI(spec, prim); + } + return body; }