From b54e77a6670ad1ec264a0d3565d57f4d5b800ef6 Mon Sep 17 00:00:00 2001 From: Christoph Haag Date: Fri, 30 Oct 2020 23:29:24 +0000 Subject: [PATCH] fix openmw non-vr build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ../apps/openmw/mwphysics/movementsolver.cpp: In static member function ‘static void MWPhysics::MovementSolver::move(MWPhysics::ActorFrameData&, float, const btCollisionWorld*, MWPhysics::WorldFrameData&)’: ../apps/openmw/mwphysics/movementsolver.cpp:98:52: error: ‘getPlayer’ is not a member of ‘MWMechanics’ 98 | const bool isPlayer = (ptr == MWMechanics::getPlayer()); | ^~~~~~~~~ --- .gitlab-ci.yml | 2 +- apps/openmw/CMakeLists.txt | 8 +++- apps/openmw/mwphysics/movementsolver.cpp | 2 +- apps/openmw/mwvr/openxractionset.cpp | 5 ++ apps/openmw/mwvr/openxrdebug.cpp | 10 ++++ apps/openmw/mwvr/openxrmanagerimpl.cpp | 58 ++++++++++++++++++++++-- apps/openmw/mwvr/openxrswapchainimpl.cpp | 14 +++++- apps/openmw/mwvr/openxrswapchainimpl.hpp | 4 +- apps/openmw/mwvr/vrgui.cpp | 4 +- apps/openmw/mwvr/vrsession.hpp | 1 + apps/openmw/mwvr/vrviewer.cpp | 1 + apps/openmw/mwvr/vrviewer.hpp | 2 +- 12 files changed, 99 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 426d944ef..3c7787dd3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,7 +13,7 @@ stages: before_script: - export APT_CACHE_DIR=`pwd`/apt-cache && mkdir -pv $APT_CACHE_DIR - apt-get update -yq - - apt-get -o dir::cache::archives="$APT_CACHE_DIR" install -y cmake build-essential libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-iostreams-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libsdl2-dev libqt5opengl5-dev libopenal-dev libopenscenegraph-dev libunshield-dev libtinyxml-dev libmygui-dev libbullet-dev liblz4-dev ccache git clang + - apt-get -o dir::cache::archives="$APT_CACHE_DIR" install -y cmake build-essential libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-iostreams-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libsdl2-dev libqt5opengl5-dev libopenal-dev libopenscenegraph-dev libunshield-dev libtinyxml-dev libmygui-dev libbullet-dev liblz4-dev ccache git clang libxcb-glx0-dev libx11-dev stage: build script: - export CCACHE_BASEDIR="`pwd`" diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 8fb2adf30..583c4db5c 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -276,7 +276,13 @@ if(BUILD_OPENMW_VR) target_include_directories(openmw_vr PRIVATE ${openxr_SOURCE_DIR}/include) # Preprocessor variable used to control code paths to vr code - target_compile_options(openmw_vr PUBLIC -DUSE_OPENXR -DXR_USE_GRAPHICS_API_OPENGL -DXR_USE_PLATFORM_WIN32) + if (WIN32) + target_compile_options(openmw_vr PUBLIC -DUSE_OPENXR -DXR_USE_GRAPHICS_API_OPENGL -DXR_USE_PLATFORM_WIN32) + elseif(UNIX) + target_compile_options(openmw_vr PUBLIC -DUSE_OPENXR -DXR_USE_GRAPHICS_API_OPENGL -DXR_USE_PLATFORM_XLIB) + find_package(X11 REQUIRED) + target_link_libraries(openmw_vr ${X11_LIBRARIES}) + endif() target_link_libraries(openmw_vr ${OPENMW_LINK_TARGETS}) if(APPLE) add_custom_command(TARGET openmw_vr diff --git a/apps/openmw/mwphysics/movementsolver.cpp b/apps/openmw/mwphysics/movementsolver.cpp index f4511ba57..4aad448c4 100644 --- a/apps/openmw/mwphysics/movementsolver.cpp +++ b/apps/openmw/mwphysics/movementsolver.cpp @@ -20,8 +20,8 @@ #include "../mwvr/vrenvironment.hpp" #include "../mwrender/renderingmanager.hpp" #include "../mwworld/player.hpp" -#include "../mwmechanics/actorutil.hpp" #endif +#include "../mwmechanics/actorutil.hpp" #include "actor.hpp" #include "collisiontype.hpp" diff --git a/apps/openmw/mwvr/openxractionset.cpp b/apps/openmw/mwvr/openxractionset.cpp index a02be8a4c..92dab2d15 100644 --- a/apps/openmw/mwvr/openxractionset.cpp +++ b/apps/openmw/mwvr/openxractionset.cpp @@ -12,6 +12,11 @@ #include +// TODO: should implement actual safe strcpy +#ifdef __linux__ +#define strcpy_s(dst, src) int(strcpy(dst, src) != nullptr) +#endif + namespace MWVR { diff --git a/apps/openmw/mwvr/openxrdebug.cpp b/apps/openmw/mwvr/openxrdebug.cpp index ca9c5e099..f4050d18f 100644 --- a/apps/openmw/mwvr/openxrdebug.cpp +++ b/apps/openmw/mwvr/openxrdebug.cpp @@ -3,9 +3,19 @@ #include "vrenvironment.hpp" // The OpenXR SDK's platform headers assume we've included these windows headers +#ifdef _WIN32 #include #include +#elif __linux__ +#include +#include +#undef None + +#else +#error Unsupported platform +#endif + #include #include #include diff --git a/apps/openmw/mwvr/openxrmanagerimpl.cpp b/apps/openmw/mwvr/openxrmanagerimpl.cpp index 51db454de..a554be985 100644 --- a/apps/openmw/mwvr/openxrmanagerimpl.cpp +++ b/apps/openmw/mwvr/openxrmanagerimpl.cpp @@ -16,10 +16,20 @@ #include "../mwworld/player.hpp" #include "../mwworld/esmstore.hpp" -// The OpenXR SDK's platform headers assume we've included these windows headers +// The OpenXR SDK's platform headers assume we've included platform headers +#ifdef _WIN32 #include #include +#elif __linux__ +#include +#include +#undef None + +#else +#error Unsupported platform +#endif + #include #include #include @@ -111,8 +121,8 @@ namespace MWVR } } +#ifdef _WIN32 { // Create Session - // TODO: Platform dependent auto DC = wglGetCurrentDC(); auto GLRC = wglGetCurrentContext(); auto XRGLRC = wglCreateContext(DC); @@ -133,6 +143,38 @@ namespace MWVR CHECK_XRCMD(xrCreateSession(mInstance, &createInfo, &mSession)); assert(mSession); } +#elif __linux__ + { // Create Session + Display* xDisplay = XOpenDisplay(NULL); + GLXContext glxContext = glXGetCurrentContext(); + GLXDrawable glxDrawable = glXGetCurrentDrawable(); + + // TODO: runtimes don't actually care (yet) + GLXFBConfig glxFBConfig = 0; + uint32_t visualid = 0; + + XrGraphicsBindingOpenGLXlibKHR graphicsBindings; + graphicsBindings.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR; + graphicsBindings.next = nullptr; + graphicsBindings.xDisplay = xDisplay; + graphicsBindings.glxContext = glxContext; + graphicsBindings.glxDrawable = glxDrawable; + graphicsBindings.glxFBConfig = glxFBConfig; + graphicsBindings.visualid = visualid; + + if (!graphicsBindings.glxContext) + Log(Debug::Warning) << "Missing glxContext"; + + if (!graphicsBindings.glxDrawable) + Log(Debug::Warning) << "Missing glxDrawable"; + + XrSessionCreateInfo createInfo{ XR_TYPE_SESSION_CREATE_INFO }; + createInfo.next = &graphicsBindings; + createInfo.systemId = mSystemId; + CHECK_XRCMD(xrCreateSession(mInstance, &createInfo, &mSession)); + assert(mSession); + } +#endif LogInstanceInfo(); LogReferenceSpaces(); @@ -187,7 +229,11 @@ namespace MWVR if (XR_FAILED(res)) { std::stringstream ss; +#ifdef _WIN32 ss << sourceLocation << ": OpenXR[Error: " << to_string(res) << "][Thread: " << std::this_thread::get_id() << "][DC: " << wglGetCurrentDC() << "][GLRC: " << wglGetCurrentContext() << "]: " << originator; +#elif __linux__ + ss << sourceLocation << ": OpenXR[Error: " << to_string(res) << "][Thread: " << std::this_thread::get_id() << "][glxContext: " << glXGetCurrentContext() << "][glxDrawable: " << glXGetCurrentDrawable() << "]: " << originator; +#endif Log(Debug::Error) << ss.str(); if (res == XR_ERROR_TIME_INVALID) Log(Debug::Error) << "Breakpoint"; @@ -196,7 +242,11 @@ namespace MWVR } else if (res != XR_SUCCESS || sLogAllXrCalls) { +#ifdef _WIN32 Log(Debug::Verbose) << sourceLocation << ": OpenXR[" << to_string(res) << "][" << std::this_thread::get_id() << "][" << wglGetCurrentDC() << "][" << wglGetCurrentContext() << "]: " << originator; +#elif __linux__ + Log(Debug::Verbose) << sourceLocation << ": OpenXR[" << to_string(res) << "][" << std::this_thread::get_id() << "][" << glXGetCurrentContext() << "][" << glXGetCurrentDrawable() << "]: " << originator; +#endif } return res; @@ -728,7 +778,7 @@ namespace MWVR if (result != XR_EVENT_UNAVAILABLE) CHECK_XRRESULT(result, "xrPollEvent"); - return nullptr; + return false; } void OpenXRManagerImpl::popEvent() @@ -862,7 +912,7 @@ namespace MWVR XrQuaternionf toXR(osg::Quat quat) { - return XrQuaternionf{ quat.x(), quat.z(), -quat.y(), quat.w() }; + return XrQuaternionf{ static_cast(quat.x()), static_cast(quat.z()), static_cast(-quat.y()), static_cast(quat.w()) }; } } diff --git a/apps/openmw/mwvr/openxrswapchainimpl.cpp b/apps/openmw/mwvr/openxrswapchainimpl.cpp index 6ba17078d..c6e34f7fb 100644 --- a/apps/openmw/mwvr/openxrswapchainimpl.cpp +++ b/apps/openmw/mwvr/openxrswapchainimpl.cpp @@ -5,9 +5,19 @@ #include +#ifdef _WIN32 #include #include +#elif __linux__ +#include +#include +#undef None + +#else +#error Unsupported platform +#endif + #include #include #include @@ -15,7 +25,9 @@ namespace MWVR { OpenXRSwapchainImpl::OpenXRSwapchainImpl(osg::ref_ptr state, SwapchainConfig config) - : mWidth(config.selectedWidth) + : mSwapchainColorBuffers() + , mSwapchainDepthBuffers() + , mWidth(config.selectedWidth) , mHeight(config.selectedHeight) , mSamples(config.selectedSamples) { diff --git a/apps/openmw/mwvr/openxrswapchainimpl.hpp b/apps/openmw/mwvr/openxrswapchainimpl.hpp index 45a6b9d55..9353d7b22 100644 --- a/apps/openmw/mwvr/openxrswapchainimpl.hpp +++ b/apps/openmw/mwvr/openxrswapchainimpl.hpp @@ -43,8 +43,8 @@ namespace MWVR private: XrSwapchain mSwapchain = XR_NULL_HANDLE; XrSwapchain mSwapchainDepth = XR_NULL_HANDLE; - std::vector mSwapchainColorBuffers{}; - std::vector mSwapchainDepthBuffers{}; + std::vector mSwapchainColorBuffers; + std::vector mSwapchainDepthBuffers; XrSwapchainSubImage mSubImage{}; XrSwapchainSubImage mSubImageDepth{}; int32_t mWidth = -1; diff --git a/apps/openmw/mwvr/vrgui.cpp b/apps/openmw/mwvr/vrgui.cpp index f9aaf4a07..f043ebf45 100644 --- a/apps/openmw/mwvr/vrgui.cpp +++ b/apps/openmw/mwvr/vrgui.cpp @@ -1,5 +1,7 @@ #include "vrgui.hpp" +#include + #include "vrenvironment.hpp" #include "vrsession.hpp" #include "openxrmanagerimpl.hpp" @@ -50,7 +52,7 @@ namespace MWVR // When making a circle of a given radius of equally wide planes separated by a given angle, what is the width static osg::Vec2 radiusAngleWidth(float radius, float angleRadian) { - const float width = std::fabs(2.f * radius * std::tanf(angleRadian / 2.f)); + const float width = std::fabs(2.f * radius * tanf(angleRadian / 2.f)); return osg::Vec2(width, width); } diff --git a/apps/openmw/mwvr/vrsession.hpp b/apps/openmw/mwvr/vrsession.hpp index 34dfeb60a..5f47287c1 100644 --- a/apps/openmw/mwvr/vrsession.hpp +++ b/apps/openmw/mwvr/vrsession.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include diff --git a/apps/openmw/mwvr/vrviewer.cpp b/apps/openmw/mwvr/vrviewer.cpp index 8f204957b..26aa879b7 100644 --- a/apps/openmw/mwvr/vrviewer.cpp +++ b/apps/openmw/mwvr/vrviewer.cpp @@ -36,6 +36,7 @@ namespace MWVR VRViewer::VRViewer( osg::ref_ptr viewer) : mViewer(viewer) + , mViews() , mPreDraw(new PredrawCallback(this)) , mPostDraw(new PostdrawCallback(this)) , mVrShadow() diff --git a/apps/openmw/mwvr/vrviewer.hpp b/apps/openmw/mwvr/vrviewer.hpp index 3bc7ce1ee..d414a16e6 100644 --- a/apps/openmw/mwvr/vrviewer.hpp +++ b/apps/openmw/mwvr/vrviewer.hpp @@ -87,7 +87,7 @@ namespace MWVR private: osg::ref_ptr mViewer = nullptr; - std::map > mViews{}; + std::map > mViews; std::map > mCameras{}; osg::ref_ptr mPreDraw{ nullptr }; osg::ref_ptr mPostDraw{ nullptr };