diff --git a/plugin/usd_decoder/usd_decoder.cc b/plugin/usd_decoder/usd_decoder.cc index ebf2bb5d..0d4e400d 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 @@ -2248,6 +2249,20 @@ void ParseMjcPhysicsKeyframe(mjSpec* spec, } } +void ParseUsdFilteredPairsAPI(mjSpec* spec, const pxr::UsdPrim& prim) { + if (!prim.HasAPI()) { + return; + } + auto filtered_pairs_api = pxr::UsdPhysicsFilteredPairsAPI(prim); + pxr::SdfPathVector filtered_bodies; + filtered_pairs_api.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, @@ -2268,6 +2283,8 @@ mjsBody* ParseUsdPhysicsRigidbody( body->element, kUsdPrimPathKey, usd_primpath, [](const void* data) { delete static_cast(data); }); + ParseUsdFilteredPairsAPI(spec, prim); + return body; }