Add mj_loadUSD function. Change simulate to use that instead of manual spec compilation.
PiperOrigin-RevId: 780608874 Change-Id: I333238c756fe76b371518a7cdf9452b93da3540a
This commit is contained in:
committed by
Copybara-Service
parent
e507e31922
commit
14972d2490
@@ -16,7 +16,6 @@
|
||||
# Plugin target names (used for library and plugInfo.json)
|
||||
set(MJCF_PLUGIN_TARGET_NAME usdMjcf)
|
||||
set(MJC_PHYSICS_PLUGIN_TARGET_NAME mjcPhysics)
|
||||
set(MJ_USD_TARGET_NAME mj_usd)
|
||||
|
||||
# Installation directory for USD plugins
|
||||
set(MJ_USD_INSTALL_DIR_LIB ${CMAKE_INSTALL_LIBDIR}/mujocoUsd)
|
||||
@@ -187,14 +186,12 @@ set_target_properties(${MJC_PHYSICS_PLUGIN_TARGET_NAME} PROPERTIES
|
||||
${DEFAULT_CXX_VISIBILITY_PROPS}
|
||||
)
|
||||
target_include_directories(${MJC_PHYSICS_PLUGIN_TARGET_NAME} PUBLIC
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/mjcPhysics"
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../../include>
|
||||
)
|
||||
|
||||
## mj_usd
|
||||
|
||||
add_library(${MJ_USD_TARGET_NAME} SHARED)
|
||||
add_library(mujoco::usd ALIAS ${MJ_USD_TARGET_NAME})
|
||||
target_sources(${MJ_USD_TARGET_NAME} PRIVATE
|
||||
target_sources(mujoco PRIVATE
|
||||
kinematic_tree.cc
|
||||
kinematic_tree.h
|
||||
layer_sink.cc
|
||||
@@ -212,8 +209,6 @@ if (USD_DIR)
|
||||
|
||||
target_link_libraries(${MJC_PHYSICS_PLUGIN_TARGET_NAME} PRIVATE
|
||||
${OPENUSD_CORE_LIBS}
|
||||
mujoco
|
||||
tinyxml2
|
||||
)
|
||||
|
||||
target_link_libraries(${MJCF_PLUGIN_TARGET_NAME} PRIVATE
|
||||
@@ -223,10 +218,8 @@ if (USD_DIR)
|
||||
${MJC_PHYSICS_PLUGIN_TARGET_NAME}
|
||||
)
|
||||
|
||||
target_link_libraries(${MJ_USD_TARGET_NAME} PUBLIC
|
||||
target_link_libraries(mujoco PUBLIC
|
||||
${OPENUSD_CORE_LIBS}
|
||||
mujoco
|
||||
tinyxml2
|
||||
${MJC_PHYSICS_PLUGIN_TARGET_NAME}
|
||||
)
|
||||
elseif (HOUDINI_HFS_DIR)
|
||||
@@ -237,11 +230,9 @@ elseif (HOUDINI_HFS_DIR)
|
||||
# so we need to manually link all the required libraries.
|
||||
configure_houdini_target(${MJC_PHYSICS_PLUGIN_TARGET_NAME} PRIVATE PRIVATE)
|
||||
configure_houdini_target(${MJCF_PLUGIN_TARGET_NAME} PRIVATE PRIVATE)
|
||||
configure_houdini_target(${MJ_USD_TARGET_NAME} PUBLIC PUBLIC)
|
||||
|
||||
# Re-add inter-plugin dependencies after Houdini-specific linking
|
||||
target_link_libraries(${MJCF_PLUGIN_TARGET_NAME} PRIVATE ${MJC_PHYSICS_PLUGIN_TARGET_NAME})
|
||||
target_link_libraries(${MJ_USD_TARGET_NAME} PUBLIC ${MJC_PHYSICS_PLUGIN_TARGET_NAME})
|
||||
|
||||
endif()
|
||||
|
||||
@@ -272,6 +263,6 @@ install(FILES
|
||||
install(TARGETS
|
||||
${MJCF_PLUGIN_TARGET_NAME}
|
||||
${MJC_PHYSICS_PLUGIN_TARGET_NAME}
|
||||
${MJ_USD_TARGET_NAME}
|
||||
EXPORT ${PROJECT_NAME}
|
||||
LIBRARY DESTINATION ${MJ_USD_INSTALL_DIR_LIB}
|
||||
)
|
||||
|
||||
@@ -41,8 +41,7 @@
|
||||
|
||||
PXR_NAMESPACE_OPEN_SCOPE
|
||||
TF_DEFINE_PRIVATE_TOKENS(_layer_sink_tokens,
|
||||
((xformOpTransform,
|
||||
"xformOp:transform:mujoco"))(Xform));
|
||||
((xformOpTransform, "xformOp:transform:mujoco")));
|
||||
PXR_NAMESPACE_CLOSE_SCOPE
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
#include "xml/xml.h"
|
||||
#include "xml/xml_native_reader.h"
|
||||
#include "xml/xml_util.h"
|
||||
#if defined(mjUSEUSD)
|
||||
#include <mujoco/experimental/usd/usd.h>
|
||||
#include <pxr/usd/usd/stage.h>
|
||||
#endif
|
||||
|
||||
//---------------------------------- Globals -------------------------------------------------------
|
||||
|
||||
@@ -126,7 +130,36 @@ mjModel* mj_loadXML(const char* filename, const mjVFS* vfs,
|
||||
return m;
|
||||
}
|
||||
|
||||
#if defined(mjUSEUSD)
|
||||
// parse USD file, compile it, and return low-level model.
|
||||
// if vfs is not NULL, look up files in vfs before reading from disk
|
||||
// error can be NULL; otherwise assumed to have size error_sz
|
||||
mjModel* mj_loadUSD(const char* filename, const mjVFS* vfs, char* error, int error_sz) {
|
||||
auto stage = pxr::UsdStage::Open(filename);
|
||||
|
||||
if (stage == nullptr) {
|
||||
mjCopyError(error, "Failed to load USD stage from file.", error_sz);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Parse USD into mjSpec.
|
||||
std::unique_ptr<mjSpec, std::function<void(mjSpec*)> > spec(
|
||||
mj_parseUSDStage(stage),
|
||||
[](mjSpec* s) {
|
||||
mj_deleteSpec(s);
|
||||
});
|
||||
|
||||
// Compile new model.
|
||||
mjModel* m = mj_compile(spec.get(), vfs);
|
||||
if (!m) {
|
||||
mjCopyError(error, mjs_getError(spec.get()), error_sz);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GetGlobalModel().Set(spec.release());
|
||||
return m;
|
||||
}
|
||||
#endif
|
||||
|
||||
// update XML data structures with info from low-level model, save as MJCF
|
||||
// returns 1 if successful, 0 otherwise
|
||||
|
||||
Reference in New Issue
Block a user