NOTE: While most of the milestone 1 goals are there, a few smaller features and improvements are still to be done. Big picture of this milestone: Initial, OpenXR-based virtual reality support for users and foundation for advanced use cases. Maniphest Task: https://developer.blender.org/T71347 The tasks contains more information about this milestone. To be clear: This is not a feature rich VR implementation, it's focused on the initial scene inspection use case. We intentionally focused on that, further features like controller support are part of the next milestone. - How to use? Instructions on how to use this are here: https://wiki.blender.org/wiki/User:Severin/GSoC-2019/How_to_Test These will be updated and moved to a more official place (likely the manual) soon. Currently Windows Mixed Reality and Oculus devices are usable. Valve/HTC headsets don't support the OpenXR standard yet and hence, do not work with this implementation. --------------- This is the C-side implementation of the features added for initial VR support as per milestone 1. A "VR Scene Inspection" Add-on will be committed separately, to expose the VR functionality in the UI. It also adds some further features for milestone 1, namely a landmarking system (stored view locations in the VR space) Main additions/features: * Support for rendering viewports to an HMD, with good performance. * Option to sync the VR view perspective with a fully interactive, regular 3D View (VR-Mirror). * Option to disable positional tracking. Keeps the current position (calculated based on the VR eye center pose) when enabled while a VR session is running. * Some regular viewport settings for the VR view * RNA/Python-API to query and set VR session state information. * WM-XR: Layer tying Ghost-XR to the Blender specific APIs/data * wmSurface API: drawable, non-window container (manages Ghost-OpenGL and GPU context) * DNA/RNA for management of VR session settings * `--debug-xr` and `--debug-xr-time` commandline options * Utility batch & config file for using the Oculus runtime on Windows. * Most VR data is runtime only. The exception is user settings which are saved to files (`XrSessionSettings`). * VR support can be disabled through the `WITH_XR_OPENXR` compiler flag. For architecture and code documentation, see https://wiki.blender.org/wiki/Source/Interface/XR. --------------- A few thank you's: * A huge shoutout to Ray Molenkamp for his help during the project - it would have not been that successful without him! * Sebastian Koenig and Simeon Conzendorf for testing and feedback! * The reviewers, especially Brecht Van Lommel! * Dalai Felinto for pushing and managing me to get this done ;) * The OpenXR working group for providing an open standard. I think we're the first bigger application to adopt OpenXR. Congratulations to them and ourselves :) This project started as a Google Summer of Code 2019 project - "Core Support of Virtual Reality Headsets through OpenXR" (see https://wiki.blender.org/wiki/User:Severin/GSoC-2019/). Some further information, including ideas for further improvements can be found in the final GSoC report: https://wiki.blender.org/wiki/User:Severin/GSoC-2019/Final_Report Differential Revisions: D6193, D7098 Reviewed by: Brecht Van Lommel, Jeroen Bakker
410 lines
8.4 KiB
CMake
410 lines
8.4 KiB
CMake
# ***** BEGIN GPL LICENSE BLOCK *****
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# The Original Code is Copyright (C) 2006, Blender Foundation
|
|
# All rights reserved.
|
|
# ***** END GPL LICENSE BLOCK *****
|
|
|
|
set(INC
|
|
.
|
|
../glew-mx
|
|
../string
|
|
../../source/blender/imbuf
|
|
../../source/blender/makesdna
|
|
)
|
|
|
|
set(INC_SYS
|
|
${GLEW_INCLUDE_PATH}
|
|
)
|
|
|
|
set(SRC
|
|
intern/GHOST_Buttons.cpp
|
|
intern/GHOST_C-api.cpp
|
|
intern/GHOST_CallbackEventConsumer.cpp
|
|
intern/GHOST_Context.cpp
|
|
intern/GHOST_ContextNone.cpp
|
|
intern/GHOST_DisplayManager.cpp
|
|
intern/GHOST_EventManager.cpp
|
|
intern/GHOST_ISystem.cpp
|
|
intern/GHOST_ISystemPaths.cpp
|
|
intern/GHOST_ModifierKeys.cpp
|
|
intern/GHOST_Path-api.cpp
|
|
intern/GHOST_Rect.cpp
|
|
intern/GHOST_System.cpp
|
|
intern/GHOST_TimerManager.cpp
|
|
intern/GHOST_Window.cpp
|
|
intern/GHOST_WindowManager.cpp
|
|
|
|
GHOST_C-api.h
|
|
GHOST_IContext.h
|
|
GHOST_IEvent.h
|
|
GHOST_IEventConsumer.h
|
|
GHOST_ISystem.h
|
|
GHOST_ISystemPaths.h
|
|
GHOST_ITimerTask.h
|
|
GHOST_IWindow.h
|
|
GHOST_Path-api.h
|
|
GHOST_Rect.h
|
|
GHOST_Types.h
|
|
|
|
intern/GHOST_Buttons.h
|
|
intern/GHOST_CallbackEventConsumer.h
|
|
intern/GHOST_Context.h
|
|
intern/GHOST_ContextNone.h
|
|
intern/GHOST_Debug.h
|
|
intern/GHOST_DisplayManager.h
|
|
intern/GHOST_Event.h
|
|
intern/GHOST_EventButton.h
|
|
intern/GHOST_EventCursor.h
|
|
intern/GHOST_EventDragnDrop.h
|
|
intern/GHOST_EventKey.h
|
|
intern/GHOST_EventManager.h
|
|
intern/GHOST_EventString.h
|
|
intern/GHOST_EventTrackpad.h
|
|
intern/GHOST_EventWheel.h
|
|
intern/GHOST_ModifierKeys.h
|
|
intern/GHOST_System.h
|
|
intern/GHOST_SystemPaths.h
|
|
intern/GHOST_TimerManager.h
|
|
intern/GHOST_TimerTask.h
|
|
intern/GHOST_Window.h
|
|
intern/GHOST_WindowManager.h
|
|
)
|
|
|
|
set(LIB
|
|
bf_intern_glew_mx
|
|
bf_intern_string
|
|
${GLEW_LIBRARY}
|
|
)
|
|
|
|
if(WITH_GHOST_DEBUG)
|
|
list(APPEND SRC
|
|
intern/GHOST_EventPrinter.cpp
|
|
|
|
intern/GHOST_EventPrinter.h
|
|
)
|
|
add_definitions(-DWITH_GHOST_DEBUG)
|
|
endif()
|
|
|
|
if(WITH_INPUT_NDOF)
|
|
add_definitions(-DWITH_INPUT_NDOF)
|
|
|
|
list(APPEND SRC
|
|
intern/GHOST_NDOFManager.cpp
|
|
|
|
intern/GHOST_EventNDOF.h
|
|
intern/GHOST_NDOFManager.h
|
|
)
|
|
|
|
list(APPEND INC_SYS
|
|
${NDOF_INCLUDE_DIRS}
|
|
)
|
|
list(APPEND LIB
|
|
${NDOF_LIBRARIES}
|
|
)
|
|
endif()
|
|
|
|
if(WITH_HEADLESS OR WITH_GHOST_SDL)
|
|
if(WITH_HEADLESS)
|
|
list(APPEND SRC
|
|
intern/GHOST_DisplayManagerNULL.h
|
|
intern/GHOST_SystemNULL.h
|
|
intern/GHOST_WindowNULL.h
|
|
)
|
|
add_definitions(-DWITH_HEADLESS)
|
|
else()
|
|
list(APPEND SRC
|
|
intern/GHOST_ContextSDL.cpp
|
|
intern/GHOST_DisplayManagerSDL.cpp
|
|
intern/GHOST_SystemSDL.cpp
|
|
intern/GHOST_WindowSDL.cpp
|
|
|
|
intern/GHOST_ContextSDL.h
|
|
intern/GHOST_DisplayManagerSDL.h
|
|
intern/GHOST_SystemSDL.h
|
|
intern/GHOST_WindowSDL.h
|
|
)
|
|
add_definitions(-DWITH_GHOST_SDL)
|
|
endif()
|
|
|
|
if(NOT WITH_HEADLESS)
|
|
list(APPEND INC_SYS
|
|
${SDL_INCLUDE_DIR}
|
|
)
|
|
if(NOT WITH_SDL_DYNLOAD)
|
|
list(APPEND LIB
|
|
${SDL_LIBRARY}
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
elseif(APPLE AND NOT WITH_X11)
|
|
list(APPEND SRC
|
|
intern/GHOST_DisplayManagerCocoa.mm
|
|
intern/GHOST_SystemCocoa.mm
|
|
intern/GHOST_WindowCocoa.mm
|
|
|
|
intern/GHOST_DisplayManagerCocoa.h
|
|
intern/GHOST_SystemCocoa.h
|
|
intern/GHOST_WindowCocoa.h
|
|
intern/GHOST_WindowViewCocoa.h
|
|
)
|
|
|
|
if(NOT WITH_GL_EGL)
|
|
list(APPEND SRC
|
|
intern/GHOST_ContextCGL.mm
|
|
|
|
intern/GHOST_ContextCGL.h
|
|
)
|
|
endif()
|
|
|
|
if(WITH_INPUT_NDOF)
|
|
list(APPEND SRC
|
|
intern/GHOST_NDOFManagerCocoa.mm
|
|
|
|
intern/GHOST_NDOFManagerCocoa.h
|
|
)
|
|
endif()
|
|
|
|
elseif(WITH_X11)
|
|
list(APPEND INC_SYS
|
|
${X11_X11_INCLUDE_PATH}
|
|
)
|
|
|
|
list(APPEND SRC
|
|
intern/GHOST_DisplayManagerX11.cpp
|
|
intern/GHOST_SystemX11.cpp
|
|
intern/GHOST_TaskbarX11.cpp
|
|
intern/GHOST_WindowX11.cpp
|
|
|
|
intern/GHOST_DisplayManagerX11.h
|
|
intern/GHOST_IconX11.h
|
|
intern/GHOST_SystemX11.h
|
|
intern/GHOST_TaskbarX11.h
|
|
intern/GHOST_WindowX11.h
|
|
)
|
|
|
|
if(NOT WITH_GL_EGL)
|
|
list(APPEND SRC
|
|
intern/GHOST_ContextGLX.cpp
|
|
|
|
intern/GHOST_ContextGLX.h
|
|
)
|
|
endif()
|
|
|
|
if(WITH_GHOST_XDND)
|
|
add_definitions(-DWITH_XDND)
|
|
|
|
list(APPEND LIB
|
|
extern_xdnd
|
|
)
|
|
|
|
list(APPEND INC
|
|
../../extern/xdnd
|
|
)
|
|
|
|
list(APPEND SRC
|
|
intern/GHOST_DropTargetX11.cpp
|
|
|
|
intern/GHOST_DropTargetX11.h
|
|
)
|
|
endif()
|
|
|
|
if(X11_XF86keysym_INCLUDE_PATH)
|
|
add_definitions(-DWITH_XF86KEYSYM)
|
|
list(APPEND INC_SYS
|
|
${X11_XF86keysym_INCLUDE_PATH}
|
|
)
|
|
endif()
|
|
|
|
if(WITH_X11_XF86VMODE)
|
|
add_definitions(-DWITH_X11_XF86VMODE)
|
|
list(APPEND INC_SYS
|
|
${X11_xf86vmode_INCLUDE_PATH}
|
|
)
|
|
endif()
|
|
|
|
if(WITH_X11_XFIXES)
|
|
add_definitions(-DWITH_X11_XFIXES)
|
|
list(APPEND INC_SYS
|
|
${X11_Xfixes_INCLUDE_PATH}
|
|
)
|
|
endif()
|
|
|
|
if(WITH_X11_ALPHA)
|
|
add_definitions(-DWITH_X11_ALPHA)
|
|
endif()
|
|
|
|
if(WITH_INPUT_NDOF)
|
|
list(APPEND SRC
|
|
intern/GHOST_NDOFManagerUnix.cpp
|
|
|
|
intern/GHOST_NDOFManagerUnix.h
|
|
)
|
|
endif()
|
|
|
|
if(NOT WITH_INSTALL_PORTABLE)
|
|
add_definitions(-DPREFIX="${CMAKE_INSTALL_PREFIX}")
|
|
endif()
|
|
|
|
if(WITH_X11_XINPUT)
|
|
add_definitions(-DWITH_X11_XINPUT)
|
|
list(APPEND INC_SYS
|
|
${X11_Xinput_INCLUDE_PATH}
|
|
)
|
|
endif()
|
|
|
|
add_definitions(-DWITH_X11)
|
|
|
|
elseif(WIN32)
|
|
# # Warnings as errors, this is too strict!
|
|
# if(MSVC)
|
|
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
|
|
# endif()
|
|
|
|
list(APPEND INC_SYS
|
|
${WINTAB_INC}
|
|
)
|
|
|
|
list(APPEND SRC
|
|
intern/GHOST_ContextD3D.cpp
|
|
intern/GHOST_DisplayManagerWin32.cpp
|
|
intern/GHOST_DropTargetWin32.cpp
|
|
intern/GHOST_SystemWin32.cpp
|
|
intern/GHOST_WindowWin32.cpp
|
|
|
|
intern/GHOST_ContextD3D.h
|
|
intern/GHOST_DisplayManagerWin32.h
|
|
intern/GHOST_DropTargetWin32.h
|
|
intern/GHOST_SystemWin32.h
|
|
intern/GHOST_TaskbarWin32.h
|
|
intern/GHOST_WindowWin32.h
|
|
)
|
|
|
|
if(NOT WITH_GL_EGL)
|
|
list(APPEND SRC
|
|
intern/GHOST_ContextWGL.cpp
|
|
|
|
intern/GHOST_ContextWGL.h
|
|
)
|
|
endif()
|
|
|
|
if(WITH_INPUT_IME)
|
|
add_definitions(-DWITH_INPUT_IME)
|
|
|
|
list(APPEND SRC
|
|
intern/GHOST_ImeWin32.cpp
|
|
|
|
intern/GHOST_ImeWin32.h
|
|
)
|
|
endif()
|
|
|
|
if(WITH_INPUT_NDOF)
|
|
list(APPEND SRC
|
|
intern/GHOST_NDOFManagerWin32.cpp
|
|
|
|
intern/GHOST_NDOFManagerWin32.h
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(WITH_GL_EGL AND NOT (WITH_HEADLESS OR WITH_GHOST_SDL))
|
|
list(APPEND SRC
|
|
intern/GHOST_ContextEGL.cpp
|
|
|
|
intern/GHOST_ContextEGL.h
|
|
)
|
|
endif()
|
|
|
|
if(APPLE)
|
|
list(APPEND SRC
|
|
intern/GHOST_SystemPathsCocoa.h
|
|
intern/GHOST_SystemPathsCocoa.mm
|
|
)
|
|
|
|
elseif(UNIX)
|
|
list(APPEND SRC
|
|
intern/GHOST_SystemPathsUnix.cpp
|
|
intern/GHOST_SystemPathsUnix.h
|
|
)
|
|
|
|
if(NOT WITH_INSTALL_PORTABLE)
|
|
add_definitions(-DPREFIX="${CMAKE_INSTALL_PREFIX}")
|
|
endif()
|
|
|
|
elseif(WIN32)
|
|
list(APPEND SRC
|
|
intern/GHOST_SystemPathsWin32.cpp
|
|
intern/GHOST_SystemPathsWin32.h
|
|
)
|
|
|
|
list(APPEND INC
|
|
../utfconv
|
|
)
|
|
|
|
endif()
|
|
|
|
if(WITH_XR_OPENXR)
|
|
list(APPEND SRC
|
|
intern/GHOST_Xr.cpp
|
|
intern/GHOST_XrContext.cpp
|
|
intern/GHOST_XrEvent.cpp
|
|
intern/GHOST_XrGraphicsBinding.cpp
|
|
intern/GHOST_XrSession.cpp
|
|
intern/GHOST_XrSwapchain.cpp
|
|
|
|
GHOST_IXrContext.h
|
|
intern/GHOST_IXrGraphicsBinding.h
|
|
intern/GHOST_Xr_intern.h
|
|
intern/GHOST_Xr_openxr_includes.h
|
|
intern/GHOST_XrContext.h
|
|
intern/GHOST_XrSession.h
|
|
intern/GHOST_XrSwapchain.h
|
|
)
|
|
list(APPEND INC_SYS
|
|
${XR_OPENXR_SDK_INCLUDE_DIR}
|
|
)
|
|
list(APPEND LIB
|
|
${XR_OPENXR_SDK_LIBRARIES}
|
|
)
|
|
|
|
set(XR_PLATFORM_DEFINES -DXR_USE_GRAPHICS_API_OPENGL)
|
|
|
|
# Add compiler defines as required by the OpenXR specification.
|
|
if(WIN32)
|
|
list(APPEND XR_PLATFORM_DEFINES
|
|
-DXR_USE_PLATFORM_WIN32
|
|
-DXR_USE_GRAPHICS_API_D3D11
|
|
)
|
|
list(APPEND LIB
|
|
shlwapi
|
|
)
|
|
elseif(UNIX AND NOT APPLE)
|
|
list(APPEND XR_PLATFORM_DEFINES
|
|
-DXR_OS_LINUX
|
|
-DXR_USE_PLATFORM_XLIB
|
|
)
|
|
endif()
|
|
|
|
add_definitions(-DWITH_XR_OPENXR ${XR_PLATFORM_DEFINES})
|
|
|
|
unset(XR_PLATFORM_DEFINES)
|
|
endif()
|
|
|
|
add_definitions(${GL_DEFINITIONS})
|
|
|
|
blender_add_lib(bf_intern_ghost "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
|