diff --git a/CMakeLists.txt b/CMakeLists.txt index 4581d6fe..3dfee902 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,9 +41,12 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") option(MUJOCO_BUILD_EXAMPLES "Build samples for MuJoCo" ON) option(MUJOCO_BUILD_SIMULATE "Build simulate library for MuJoCo" ON) +option(MUJOCO_BUILD_STUDIO "Build studio library for MuJoCo" OFF) option(MUJOCO_BUILD_TESTS "Build tests for MuJoCo" ON) option(MUJOCO_TEST_PYTHON_UTIL "Build and test utility libraries for Python bindings" ON) option(MUJOCO_WITH_USD "Build with OpenUSD" OFF) +option(MUJOCO_USE_FILAMENT "Use filament rendering" OFF) +option(MUJOCO_USE_FILAMENT_VULKAN "Use vulkan backend for filament rendering" OFF) # Option to provide a path to an existing USD build directory or to Houdini HFS directory. set(USD_DIR "" CACHE PATH "Path to an existing USD build directory.") @@ -112,9 +115,20 @@ add_subdirectory(plugin/sdf) add_subdirectory(src/engine) add_subdirectory(src/user) add_subdirectory(src/xml) -add_subdirectory(src/render) add_subdirectory(src/thread) -add_subdirectory(src/ui) + +if(MUJOCO_USE_FILAMENT) + # Note that, by default, the "src/render" and "src/ui" code is added directly + # into the "mujoco" target. However, "mujoco::filament" is a separate, + # explicit target. Therefore, if you want to use MuJoCo with Filament, you + # will need to explicitly add the "mujoco::filament" target as a link + # dependency in your project. + add_subdirectory(src/experimental/filament) +else() + add_subdirectory(src/render) + add_subdirectory(src/ui) +endif() + target_compile_definitions(mujoco PRIVATE _GNU_SOURCE CCD_STATIC_DEFINE MUJOCO_DLL_EXPORTS -DMC_IMPLEM_ENABLE) if(MUJOCO_ENABLE_AVX_INTRINSICS) @@ -198,6 +212,11 @@ if(MUJOCO_BUILD_SIMULATE) add_subdirectory(simulate) endif() +if(MUJOCO_BUILD_STUDIO) + add_subdirectory(src/experimental/toolbox) + add_subdirectory(src/experimental/studio) +endif() + if(MUJOCO_BUILD_EXAMPLES) add_subdirectory(sample) endif() diff --git a/src/experimental/filament/CMakeLists.txt b/src/experimental/filament/CMakeLists.txt new file mode 100644 index 00000000..0d286b8a --- /dev/null +++ b/src/experimental/filament/CMakeLists.txt @@ -0,0 +1,136 @@ +# 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 +# +# 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. + +cmake_minimum_required(VERSION 3.16) + +set(MUJOCO_FILAMENT_TARGET_NAME mujoco_filament) + +add_library(${MUJOCO_FILAMENT_TARGET_NAME} STATIC) + +target_sources(${MUJOCO_FILAMENT_TARGET_NAME} + PUBLIC + stubs.cc + render_context_filament.h + render_context_filament.cc + filament/buffer_util.cc + filament/buffer_util.h + filament/builtins.cc + filament/builtins.h + filament/color_grading_options.cc + filament/color_grading_options.h + filament/drawable.cc + filament/drawable.h + filament/filament_context.cc + filament/filament_context.h + filament/geom_util.cc + filament/geom_util.h + filament/gui_view.cc + filament/gui_view.h + filament/imgui_editor.cc + filament/imgui_editor.h + filament/light.cc + filament/light.h + filament/material.cc + filament/material.h + filament/math_util.h + filament/model_util.cc + filament/model_util.h + filament/object_manager.cc + filament/object_manager.h + filament/renderables.cc + filament/renderables.h + filament/scene_view.cc + filament/scene_view.h + filament/texture_util.cc + filament/texture_util.h + filament/vertex_util.cc + filament/vertex_util.h +) +target_include_directories(${MUJOCO_FILAMENT_TARGET_NAME} + PUBLIC + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/src +) + +include(third_party_deps/dear_imgui) +include(third_party_deps/filament) +target_link_libraries(${MUJOCO_FILAMENT_TARGET_NAME} + dear_imgui + filament + image # provided by filament + ktxreader # provided by filament +) + +add_library(mujoco::filament ALIAS ${MUJOCO_FILAMENT_TARGET_NAME}) + +# The "mujoco::filament" library needs access to some assets (e.g. filament +# material shaders) in order to do rendering. As such, you must also include +# the assets under MUJOCO_FILAMENT_ASSETS_DIR in your project. As part of +# the filament library configuration, you will provide a function that the +# library will use to load these assets. +set(ASSETS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/assets") +set(OUTPUT_ASSETS_DIR "${CMAKE_CURRENT_BINARY_DIR}/assets") +file(MAKE_DIRECTORY ${OUTPUT_ASSETS_DIR}) +file(COPY + "${ASSETS_DIR}/ibl.ktx" + DESTINATION ${OUTPUT_ASSETS_DIR} +) + +set(MATC_EXECUTABLE matc) +set(MATERIAL_FILES + pbr.mat + pbr_packed.mat + phong_2d_fade.mat + phong_2d.mat + phong_2d_uv_fade.mat + phong_2d_uv.mat + phong_color_fade.mat + phong_color.mat + phong_cube_fade.mat + phong_cube.mat + unlit_depth.mat + unlit_line.mat + unlit_segmentation.mat + unlit_ui.mat +) + +foreach(MATERIAL_FILE ${MATERIAL_FILES}) + get_filename_component(MATERIAL_NAME ${MATERIAL_FILE} NAME_WE) + set(INPUT_FILE "${ASSETS_DIR}/${MATERIAL_FILE}") + set(OUTPUT_FILE "${OUTPUT_ASSETS_DIR}/${MATERIAL_NAME}.filamat") + + add_custom_command( + OUTPUT ${OUTPUT_FILE} + COMMAND ${MATC_EXECUTABLE} + --platform=all + --api=vulkan + --api=opengl + --variant-filter skinning + --optimize-size + --output ${OUTPUT_FILE} + ${INPUT_FILE} + DEPENDS ${INPUT_FILE} + DEPENDS matc + COMMENT "Compiling ${MATERIAL_FILE}" + ) + + list(APPEND MUJOCO_FILAMENT_ASSET_FILES ${OUTPUT_FILE}) +endforeach() + +list(APPEND MUJOCO_FILAMENT_ASSET_FILES "${OUTPUT_ASSETS_DIR}/ibl.ktx") + +add_custom_target(mujoco_filament_assets DEPENDS ${MUJOCO_FILAMENT_ASSET_FILES}) +add_dependencies(${MUJOCO_FILAMENT_TARGET_NAME} mujoco_filament_assets) + +set(MUJOCO_FILAMENT_ASSETS_DIR ${OUTPUT_ASSETS_DIR}) diff --git a/src/experimental/studio/CMakeLists.txt b/src/experimental/studio/CMakeLists.txt new file mode 100644 index 00000000..79e5baa7 --- /dev/null +++ b/src/experimental/studio/CMakeLists.txt @@ -0,0 +1,75 @@ +# 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 +# +# 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. + +cmake_minimum_required(VERSION 3.16) + +# Determine the render configuration and dependencies based options. +if(MUJOCO_USE_FILAMENT AND MUJOCO_USE_FILAMENT_VULKAN) + set(MUJOCO_STUDIO_RENDER_CONFIG "USE_FILAMENT_VULKAN") + set(MUJOCO_STUDIO_RENDER_DEPS "mujoco::filament") +elseif(MUJOCO_USE_FILAMENT) + set(MUJOCO_STUDIO_RENDER_CONFIG "USE_FILAMENT_OPENGL") + set(MUJOCO_STUDIO_RENDER_DEPS "mujoco::filament") +else() + set(MUJOCO_STUDIO_RENDER_CONFIG "USE_CLASSIC_OPENGL") +endif() + +set(MUJOCO_STUDIO_TARGET_NAME mujoco_studio) + +add_executable(${MUJOCO_STUDIO_TARGET_NAME}) + +target_sources(${MUJOCO_STUDIO_TARGET_NAME} + PRIVATE + app.cc + app.h + main.cc +) + +target_include_directories(${MUJOCO_STUDIO_TARGET_NAME} + PUBLIC + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/src +) + +target_compile_definitions(${MUJOCO_STUDIO_TARGET_NAME} + PRIVATE + -D${MUJOCO_STUDIO_RENDER_CONFIG} +) + +include(third_party_deps/dear_imgui) +include(third_party_deps/implot) +target_link_libraries(${MUJOCO_STUDIO_TARGET_NAME} + PRIVATE + ${MUJOCO_STUDIO_RENDER_DEPS} + absl::flags + dear_imgui + dear_imgui_OpenGL3 + dear_imgui_SDL2 + implot + mujoco::mujoco + mujoco::toolbox +) + +# Filament backend requires additional files to be copied into an "assets" folder. +if(MUJOCO_USE_FILAMENT) + add_custom_command( + TARGET ${MUJOCO_STUDIO_TARGET_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + -E create_symlink + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../src/experimental/filament/assets + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/assets + COMMENT "Copying Filament assets to build directory" + ) +endif() diff --git a/src/experimental/toolbox/CMakeLists.txt b/src/experimental/toolbox/CMakeLists.txt new file mode 100644 index 00000000..908e12c0 --- /dev/null +++ b/src/experimental/toolbox/CMakeLists.txt @@ -0,0 +1,56 @@ +# 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 +# +# 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. + +cmake_minimum_required(VERSION 3.16) + +set(MUJOCO_TOOLBOX_TARGET_NAME mujoco_toolbox) + +add_library(${MUJOCO_TOOLBOX_TARGET_NAME} STATIC) + +target_sources(${MUJOCO_TOOLBOX_TARGET_NAME} + PUBLIC + helpers.cc + helpers.h + imgui_widgets.cc + imgui_widgets.h + interaction.cc + interaction.h + physics.cc + physics.h + renderer.cc + renderer.h + step_control.cc + step_control.h + window.cc + window.h +) +target_include_directories(${MUJOCO_TOOLBOX_TARGET_NAME} + PUBLIC + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/src +) + +include(third_party_deps/dear_imgui) +include(third_party_deps/implot) +include(third_party_deps/sdl2) +include(third_party_deps/libwebp) + +target_link_libraries(${MUJOCO_TOOLBOX_TARGET_NAME} + dear_imgui + implot + webp + SDL2::SDL2-static +) + +add_library(mujoco::toolbox ALIAS ${MUJOCO_TOOLBOX_TARGET_NAME})