Initial commit: OpenXR simulator runtime, compositor, configurator, docs
This commit is contained in:
+144
@@ -0,0 +1,144 @@
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
project(openxr_simulator VERSION 0.1.0 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
||||
endif()
|
||||
|
||||
option(XRSIM_BUILD_COMPOSITOR "Build the GLFW + Dear ImGui display window" ON)
|
||||
|
||||
find_package(Vulkan REQUIRED)
|
||||
|
||||
include(FetchContent)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# GLFW
|
||||
# ---------------------------------------------------------------------------
|
||||
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
|
||||
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||
set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)
|
||||
FetchContent_Declare(
|
||||
glfw
|
||||
GIT_REPOSITORY https://github.com/glfw/glfw.git
|
||||
GIT_TAG 3.4
|
||||
)
|
||||
FetchContent_MakeAvailable(glfw)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Dear ImGui (docking branch, matches the engine's 1.91.4-docking)
|
||||
# ---------------------------------------------------------------------------
|
||||
FetchContent_Declare(
|
||||
imgui
|
||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||
GIT_TAG v1.91.4-docking
|
||||
)
|
||||
# imgui has no CMakeLists.txt, so this only downloads it.
|
||||
FetchContent_MakeAvailable(imgui)
|
||||
|
||||
add_library(imgui STATIC
|
||||
${imgui_SOURCE_DIR}/imgui.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_draw.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_tables.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_widgets.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_demo.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_vulkan.cpp
|
||||
${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp
|
||||
)
|
||||
target_include_directories(imgui SYSTEM PUBLIC
|
||||
${imgui_SOURCE_DIR}
|
||||
${imgui_SOURCE_DIR}/backends
|
||||
)
|
||||
target_link_libraries(imgui PUBLIC glfw Vulkan::Vulkan)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# JSON dependency + shared runtime config
|
||||
# ---------------------------------------------------------------------------
|
||||
FetchContent_Declare(
|
||||
json
|
||||
GIT_REPOSITORY https://github.com/nlohmann/json.git
|
||||
GIT_TAG v3.11.3
|
||||
)
|
||||
FetchContent_MakeAvailable(json)
|
||||
|
||||
add_library(xrsim_config STATIC src/Config.cpp)
|
||||
target_include_directories(xrsim_config PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||
target_link_libraries(xrsim_config PUBLIC nlohmann_json::nlohmann_json)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# OpenXR simulator runtime
|
||||
# ---------------------------------------------------------------------------
|
||||
add_library(openxr_simulator SHARED
|
||||
src/Negotiation.cpp
|
||||
src/Runtime.cpp
|
||||
)
|
||||
|
||||
if(XRSIM_BUILD_COMPOSITOR)
|
||||
target_sources(openxr_simulator PRIVATE src/Compositor.cpp)
|
||||
target_link_libraries(openxr_simulator PRIVATE imgui)
|
||||
else()
|
||||
target_sources(openxr_simulator PRIVATE src/CompositorStub.cpp)
|
||||
endif()
|
||||
|
||||
target_include_directories(openxr_simulator
|
||||
PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/third_party
|
||||
)
|
||||
|
||||
target_compile_definitions(openxr_simulator
|
||||
PRIVATE
|
||||
XR_USE_PLATFORM_WIN32
|
||||
XR_USE_GRAPHICS_API_VULKAN
|
||||
XR_NO_PROTOTYPES
|
||||
)
|
||||
|
||||
target_link_libraries(openxr_simulator PRIVATE Vulkan::Vulkan xrsim_config)
|
||||
|
||||
if(MINGW)
|
||||
# Statically link the GCC runtime (libstdc++/libgcc/libwinpthread) into the DLL so the OpenXR
|
||||
# loader can load it when the app is launched from Explorer (no MinGW bin on PATH).
|
||||
target_link_options(openxr_simulator PRIVATE -static-libgcc -static-libstdc++ -static)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
target_compile_options(openxr_simulator PRIVATE /W4)
|
||||
else()
|
||||
# Vulkan structs are routinely zero-initialized with `{ VK_STRUCTURE_TYPE_... }`.
|
||||
target_compile_options(openxr_simulator PRIVATE -Wall -Wextra -Wno-missing-field-initializers)
|
||||
endif()
|
||||
|
||||
set_target_properties(openxr_simulator PROPERTIES
|
||||
PREFIX ""
|
||||
OUTPUT_NAME "openxr_simulator"
|
||||
)
|
||||
|
||||
# Runtime manifest consumed by the OpenXR loader (via XR_RUNTIME_JSON or registry).
|
||||
set(SIM_RUNTIME_NAME "OpenXR Simulator")
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/manifest/openxr_simulator.json.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/openxr_simulator.json
|
||||
@ONLY
|
||||
)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Configurator application (edits openxr_simulator_config.json)
|
||||
# ---------------------------------------------------------------------------
|
||||
if(XRSIM_BUILD_COMPOSITOR)
|
||||
find_package(OpenGL REQUIRED)
|
||||
|
||||
add_executable(openxr_simulator_configurator WIN32 tools/configurator/ConfiguratorMain.cpp)
|
||||
target_link_libraries(openxr_simulator_configurator PRIVATE xrsim_config imgui glfw OpenGL::GL)
|
||||
|
||||
if(MINGW)
|
||||
target_link_options(
|
||||
openxr_simulator_configurator PRIVATE -static-libgcc -static-libstdc++ -static
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
Reference in New Issue
Block a user