From 44c8ef890d6aede13c258186a28f3f9ef4becee6 Mon Sep 17 00:00:00 2001 From: Sam Haves Date: Fri, 19 Dec 2025 09:38:03 -0800 Subject: [PATCH] When building with USD enabled, add functionality that automatically registers the mujoco USD plugins. PiperOrigin-RevId: 846767370 Change-Id: Ieedbe127353623c11150551c1409d340dbc57421 --- src/experimental/usd/utils.cc | 64 ++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/experimental/usd/utils.cc b/src/experimental/usd/utils.cc index 0dc66353..f25d900a 100644 --- a/src/experimental/usd/utils.cc +++ b/src/experimental/usd/utils.cc @@ -12,8 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include +#include +#if defined(_WIN32) || defined(__CYGWIN__) +#include +#else +#include +#endif +#include + +#include #include #include @@ -42,3 +51,56 @@ pxr::SdfPath GetUsdPrimPathUserValue(mjsElement* element) { } // namespace usd } // namespace mujoco + +namespace { +//Automatically register USD plugins when the library is loaded. +//This avoids the need for users to manually set PXR_PLUGINPATH_NAME. +[[maybe_unused]] +bool RegisterMujocoUsdPlugins() { + std::string plugin_path; + +#if defined(_WIN32) || defined(__CYGWIN__) + HMODULE hModule = NULL; + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCTSTR)&mujoco::usd::SetUsdPrimPathUserValue, + &hModule)) { + char path[MAX_PATH]; + if (GetModuleFileName(hModule, path, MAX_PATH)) { + std::string lib_path(path); + // Remove filename to get directory + size_t last_slash = lib_path.find_last_of("\\/"); + if (last_slash != std::string::npos) { + plugin_path = lib_path.substr(0, last_slash); + } + } + } +#else + Dl_info info; + if (dladdr((void*)&mujoco::usd::SetUsdPrimPathUserValue, &info)) { + std::string lib_path(info.dli_fname); + // Remove filename to get directory + size_t last_slash = lib_path.find_last_of('/'); + if (last_slash != std::string::npos) { + plugin_path = lib_path.substr(0, last_slash); + } + } +#endif + + if (!plugin_path.empty()) { +#if defined(_WIN32) || defined(__CYGWIN__) + std::string full_path = + plugin_path + "\\" + "mujoco-usd-resources" + "\\**\\plugInfo.json"; +#else + std::string full_path = + plugin_path + "/" + "mujoco-usd-resources" + "/**/plugInfo.json"; +#endif + pxr::PlugRegistry::GetInstance().RegisterPlugins(full_path); + } + return true; +} + +// Force registration at library load time. +bool registered = RegisterMujocoUsdPlugins(); + +} // namespace