diff --git a/src/experimental/usd/utils.cc b/src/experimental/usd/utils.cc new file mode 100644 index 00000000..220c4178 --- /dev/null +++ b/src/experimental/usd/utils.cc @@ -0,0 +1,44 @@ +// Copyright 2025 DeepMind Technologies Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "third_party/mujoco/src/experimental/usd/utils.h" + +#include +#include + +namespace mujoco { +namespace usd { + +constexpr const char* kUsdPrimPathKey = "usd_primpath"; + +void SetUsdPrimPathUserValue(mjsElement* element, + const pxr::SdfPath& prim_path) { + // The value is a pointer to a newly allocated SdfPath, which will be deleted + // when the mjsElement is deleted. + const pxr::SdfPath* usd_primpath = new pxr::SdfPath(prim_path); + mjs_setUserValueWithCleanup( + element, kUsdPrimPathKey, usd_primpath, + [](const void* data) { delete static_cast(data); }); +} + +pxr::SdfPath GetUsdPrimPathUserValue(mjsElement* element) { + const void* user_data = mjs_getUserValue(element, kUsdPrimPathKey); + if (user_data) { + return *static_cast(user_data); + } + return pxr::SdfPath(); +} + +} // namespace usd +} // namespace mujoco diff --git a/src/experimental/usd/utils.h b/src/experimental/usd/utils.h new file mode 100644 index 00000000..f3dcd4b5 --- /dev/null +++ b/src/experimental/usd/utils.h @@ -0,0 +1,35 @@ +// Copyright 2025 DeepMind Technologies Limited +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef MUJOCO_SRC_EXPERIMENTAL_USD_UTILS_H_ +#define MUJOCO_SRC_EXPERIMENTAL_USD_UTILS_H_ + +#include +#include + +namespace mujoco { +namespace usd { + +// Sets a user value on an mjsElement with the key "usd_primpath". +void SetUsdPrimPathUserValue(mjsElement* element, + const pxr::SdfPath& prim_path); + +// Gets the user value associated with the key "usd_primpath" from an +// mjsElement. Returns empty pxr::SdfPath() if the value is not found. +pxr::SdfPath GetUsdPrimPathUserValue(mjsElement* element); + +} // namespace usd +} // namespace mujoco + +#endif // MUJOCO_SRC_EXPERIMENTAL_USD_UTILS_H_