diff --git a/python/mujoco/CMakeLists.txt b/python/mujoco/CMakeLists.txt index 469ba9b4..2e7a5ea6 100644 --- a/python/mujoco/CMakeLists.txt +++ b/python/mujoco/CMakeLists.txt @@ -150,6 +150,7 @@ if(NOT TARGET mujoco::platform) foreach(dep_lib IN ITEMS mujoco_filament dear_imgui + dear_imgui_stdlib implot filament backend @@ -178,7 +179,12 @@ if(NOT TARGET mujoco::platform) ) find_library(DEP_PATH_${dep_lib} ${dep_lib} HINTS ${MUJOCO_LIBRARY_DIR}) if(DEP_PATH_${dep_lib}) - list(APPEND PLATFORM_DEPS "${DEP_PATH_${dep_lib}}") + add_library(mujoco::dep::${dep_lib} STATIC IMPORTED GLOBAL) + set_target_properties(mujoco::dep::${dep_lib} PROPERTIES + IMPORTED_LOCATION "${DEP_PATH_${dep_lib}}" + INTERFACE_INCLUDE_DIRECTORIES "${MUJOCO_INCLUDE}" + ) + list(APPEND PLATFORM_DEPS mujoco::dep::${dep_lib}) endif() endforeach() @@ -524,6 +530,8 @@ target_link_libraries( structs_header ) +add_subdirectory(experimental/studio) + set(LIBRARIES_FOR_WHEEL "$" "$" @@ -538,6 +546,12 @@ set(LIBRARIES_FOR_WHEEL "$" ) +if(MUJOCO_STUDIO_TARGETS) + foreach(target IN LISTS MUJOCO_STUDIO_TARGETS) + list(APPEND LIBRARIES_FOR_WHEEL "$") + endforeach() +endif() + if(APPLE) add_executable(mjpython mjpython/mjpython.mm) target_include_directories(mjpython PRIVATE "${Python3_INCLUDE_DIRS}") @@ -573,6 +587,9 @@ if(MUJOCO_PYTHON_MAKE_WHEEL) _structs mujoco ) + if(MUJOCO_STUDIO_TARGETS) + add_dependencies(wheel ${MUJOCO_STUDIO_TARGETS}) + endif() if(APPLE) add_dependencies(wheel mjpython) endif() diff --git a/python/mujoco/experimental/studio/CMakeLists.txt b/python/mujoco/experimental/studio/CMakeLists.txt new file mode 100644 index 00000000..14f46473 --- /dev/null +++ b/python/mujoco/experimental/studio/CMakeLists.txt @@ -0,0 +1,70 @@ +# Copyright 2026 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 +# +# https://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. + +if(NOT TARGET mujoco::platform) + message(WARNING "mujoco::platform target not found. experimental/studio bindings will not be built.") + return() +endif() + +mujoco_pybind11_module(parser parser.cc) +target_link_libraries(parser PRIVATE mujoco::platform structs_header structs_wrappers) + +mujoco_pybind11_module(native_viewer_cc native_viewer.cc) +target_link_libraries(native_viewer_cc PRIVATE + mujoco::platform + structs_header +) + +mujoco_pybind11_module(renderer renderer.cc) +target_link_libraries(renderer PRIVATE mujoco::platform structs_header) + +mujoco_pybind11_module(ux ux.cc) +target_link_libraries(ux PRIVATE + mujoco::platform + structs_header +) + +mujoco_pybind11_module(sim sim.cc) +target_link_libraries(sim PRIVATE mujoco::platform structs_header) + +set(MUJOCO_STUDIO_TARGETS + parser + native_viewer_cc + renderer + ux + sim + PARENT_SCOPE +) + +# dear_imgui bindings +mujoco_pybind11_module(dear_imgui ../dear_imgui/dear_imgui.cc) +target_link_libraries(dear_imgui PRIVATE + mujoco::dep::dear_imgui + mujoco::dep::dear_imgui_stdlib +) +target_include_directories(dear_imgui PRIVATE ../dear_imgui) +set_target_properties(dear_imgui PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../dear_imgui" +) + +# implot bindings +mujoco_pybind11_module(implot ../implot/implot.cc) +target_link_libraries(implot PRIVATE + mujoco::dep::implot + mujoco::dep::dear_imgui +) +target_include_directories(implot PRIVATE ../dear_imgui) +set_target_properties(implot PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../implot" +) diff --git a/python/setup.py b/python/setup.py index b6f83749..a35ff32e 100644 --- a/python/setup.py +++ b/python/setup.py @@ -382,6 +382,15 @@ setuptools.setup( CMakeExtension('mujoco._simulate'), CMakeExtension('mujoco._specs'), CMakeExtension('mujoco._structs'), + # Studio extensions + CMakeExtension('mujoco.experimental.studio.parser'), + CMakeExtension('mujoco.experimental.studio.native_viewer_cc'), + CMakeExtension('mujoco.experimental.studio.renderer'), + CMakeExtension('mujoco.experimental.studio.ux'), + CMakeExtension('mujoco.experimental.studio.sim'), + # ImGui/ImPlot extensions + CMakeExtension('mujoco.experimental.dear_imgui.dear_imgui'), + CMakeExtension('mujoco.experimental.implot.implot'), ], scripts=['mujoco/mjpython/mjpython.py'] if platform.system() == 'Darwin'