diff --git a/include/ACGL/HardwareSupport/RiftSdk.hh b/include/ACGL/HardwareSupport/RiftSdk.hh index 79e6f8c8bd69337476d60b48d50e8cba994706d1..d1892a25ff28e2451a57deda0082b48ccc9bfd6a 100644 --- a/include/ACGL/HardwareSupport/RiftSdk.hh +++ b/include/ACGL/HardwareSupport/RiftSdk.hh @@ -45,7 +45,13 @@ #include #include + +#ifdef ACGL_COMPILE_WITH_GLFW #include +#endif +#ifdef ACGL_COMPILE_WITH_QT +#include +#endif #include namespace ACGL{ @@ -72,6 +78,11 @@ namespace OVR{ ACGL::OpenGL::ConstSharedTexture2D _rightTexture, ovrGLTexture _eyeRenderDesc[2]); + // alternative with two (size) identical gl textures: + void generateEyeTextureDescription(GLuint _leftTexture, + GLuint _rightTexture, glm::uvec2 _size, + ovrGLTexture _eyeRenderDesc[2]); + // the Rift SDK needs to know our window, this function hides the window system/OS specifics: // it's limited to OpenGL / no multisampling back buffers, if more flexibility is needed, // write your own similar function. @@ -79,7 +90,13 @@ namespace OVR{ #ifdef ACGL_COMPILE_WITH_GLFW bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uvec2 _renderTagetSize, GLFWwindow *_window); #endif +#ifdef ACGL_COMPILE_WITH_QT + bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uvec2 _renderTagetSize, QWidget *_window); +#endif + // assumed that _cfg has already set the OS specific fields! + bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uvec2 _renderTagetSize, ovrGLConfig _cfg); + // after calling this the warning might still be presented for a few more seconds: // returns true if the warning is still displayed. Can be called multiple times. bool deactivateHealthWarning(ovrHmd _hmd); diff --git a/include/ACGL/HardwareSupport/SimpleRiftController.hh b/include/ACGL/HardwareSupport/SimpleRiftController.hh index 39fd8c0b0e0fd5ab1f8d273c9611751ca2261994..faaf0df1902fe8608fd5fe43e27a99c6c08f7f86 100644 --- a/include/ACGL/HardwareSupport/SimpleRiftController.hh +++ b/include/ACGL/HardwareSupport/SimpleRiftController.hh @@ -227,7 +227,6 @@ ACGL_SMARTPOINTER_TYPEDEFS(SimpleRiftController) #include #include #include -//#include #include @@ -264,9 +263,15 @@ namespace ACGL{ // if _outputViewportSize is 0, use mOutputViewportSize (set previously by setOutputViewportSize() ); void configureRendering(ACGL::OpenGL::ConstSharedTexture2D _leftTexture, ACGL::OpenGL::ConstSharedTexture2D _rightTexture ); + void configureRendering(GLuint _leftTexture, GLuint _rightTexture, glm::uvec2 _size ); void renderDistorted(); +#ifdef ACGL_COMPILE_WITH_GLFW void setGLFWWindow(GLFWwindow *_window) { mGLFWWindow = _window; } +#endif +#ifdef ACGL_COMPILE_WITH_QT + void setQWidget( QWidget *_qwidget ) { mQWidget = _qwidget; } +#endif bool getSuccessfulConnected() { return (mHMD != NULL); } @@ -274,6 +279,7 @@ namespace ACGL{ void recenterPose() { ovrHmd_RecenterPose(mHMD); } private: + void configureRendering(); ACGL::Scene::SharedOculusRiftCamera mCamera; ACGL::Scene::SharedGenericCamera mNormalCamera; ovrHmd mHMD; @@ -281,8 +287,12 @@ namespace ACGL{ bool mRenderingConfigured; ovrGLTexture mGLTexture[2]; +#ifdef ACGL_COMPILE_WITH_GLFW GLFWwindow *mGLFWWindow; - +#endif +#ifdef ACGL_COMPILE_WITH_QT + QWidget *mQWidget; +#endif int mNextExpectedEyeNumber; }; diff --git a/include/ACGL/Scene/OculusRiftCamera.hh b/include/ACGL/Scene/OculusRiftCamera.hh index 6cbf776faa1350d92a991201b674574291eb2d00..d3300a7178eaf065f137d9f7ddb364e9b782d313 100644 --- a/include/ACGL/Scene/OculusRiftCamera.hh +++ b/include/ACGL/Scene/OculusRiftCamera.hh @@ -65,7 +65,7 @@ private: ACGL_SMARTPOINTER_TYPEDEFS(OculusRiftCamera) } } -#else +#elif ACGL_RIFT_SDK_VERSION >= 40 // SDK 0.4 or later: #include diff --git a/include/ACGL/Utils/MemoryMappedFile.hh b/include/ACGL/Utils/MemoryMappedFile.hh index b1514e2088c1eae5bc4ff529d28d82fdcbb9b9a2..40734aa39e2a3544c9f5e1d90652d36b0188b12f 100644 --- a/include/ACGL/Utils/MemoryMappedFile.hh +++ b/include/ACGL/Utils/MemoryMappedFile.hh @@ -40,9 +40,9 @@ namespace ACGL{ private: #ifdef _WIN32 - MemoryMappedFileWinImpl* mpMMFileImpl = nullptr; + MemoryMappedFileWinImpl* mpMMFileImpl; #else - MemoryMappedFilePosixImpl* mpMMFileImpl = nullptr; + MemoryMappedFilePosixImpl* mpMMFileImpl; #endif public: diff --git a/src/ACGL/HardwareSupport/RiftSdk.cc b/src/ACGL/HardwareSupport/RiftSdk.cc index b5d3b0d8b16df2af55bc3e90ea68adab0f958842..6ae09c0cd7ca3d9e0c242596d0e566edafcc8aab 100644 --- a/src/ACGL/HardwareSupport/RiftSdk.cc +++ b/src/ACGL/HardwareSupport/RiftSdk.cc @@ -14,6 +14,9 @@ #include #include #endif +#ifdef ACGL_COMPILE_WITH_QT +#include +#endif #include using namespace std; @@ -135,21 +138,28 @@ void generateEyeTextureDescription(ACGL::OpenGL::ConstSharedTexture2D _leftTextu _eyeRenderDesc[1].OGL.TexId = _rightTexture->getObjectName(); } +void generateEyeTextureDescription(GLuint _leftTexture, GLuint _rightTexture, glm::uvec2 _size, ovrGLTexture _eyeRenderDesc[2]) +{ + // same for both eyes: + for (int eyeIndex = 0; eyeIndex < 2; ++eyeIndex) { + _eyeRenderDesc[eyeIndex].OGL.Header.API = ovrRenderAPI_OpenGL; + _eyeRenderDesc[eyeIndex].OGL.Header.RenderViewport.Pos.x = 0; + _eyeRenderDesc[eyeIndex].OGL.Header.RenderViewport.Pos.y = 0; + _eyeRenderDesc[eyeIndex].OGL.Header.RenderViewport.Size.w = _size.x; + _eyeRenderDesc[eyeIndex].OGL.Header.RenderViewport.Size.h = _size.y; + _eyeRenderDesc[eyeIndex].OGL.Header.TextureSize.w = _size.x; + _eyeRenderDesc[eyeIndex].OGL.Header.TextureSize.h = _size.y; + } + _eyeRenderDesc[0].OGL.TexId = _leftTexture; + _eyeRenderDesc[1].OGL.TexId = _rightTexture; +} + + #ifdef ACGL_COMPILE_WITH_GLFW bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uvec2 _renderTagetSize, GLFWwindow *_window) { - if (!_hmd) return false; - - // Update ovr Rendering configuration ovrGLConfig cfg; - cfg.OGL.Header.API = ovrRenderAPI_OpenGL; - cfg.OGL.Header.RTSize.w = _renderTagetSize.x; - cfg.OGL.Header.RTSize.h = _renderTagetSize.y; - cfg.OGL.Header.Multisample = 0; - #ifdef OVR_OS_WIN32 - //debug() << "configure Windows specifics" << std::endl; - cfg.OGL.Window = glfwGetWin32Window(_window); cfg.OGL.DC = GetDC(cfg.OGL.Window); #endif @@ -159,6 +169,39 @@ bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uv #ifdef OVR_OS_LINUX debug() << "configure Linux specifics: TODO" << std::endl; #endif + return configureRendering(_hmd, _eyeRenderDesc, _renderTagetSize, cfg); +} +#endif + +#ifdef ACGL_COMPILE_WITH_QT +bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uvec2 _renderTagetSize, QWidget *_window) +{ + ovrGLConfig cfg; +#ifdef OVR_OS_WIN32 + cfg.OGL.Window = (HWND) _window->winId(); + cfg.OGL.DC = GetDC(cfg.OGL.Window); +#endif +#ifdef OVR_OS_MAC + debug() << "configure Mac specifics: TODO" << std::endl; +#endif +#ifdef OVR_OS_LINUX + debug() << "configure Linux specifics: TODO" << std::endl; +#endif + return configureRendering(_hmd, _eyeRenderDesc, _renderTagetSize, cfg); +} +#endif + + +bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uvec2 _renderTagetSize, ovrGLConfig _cfg) +{ + if (!_hmd) return false; + + // Update ovr Rendering configuration + _cfg.OGL.Header.API = ovrRenderAPI_OpenGL; + _cfg.OGL.Header.RTSize.w = _renderTagetSize.x; + _cfg.OGL.Header.RTSize.h = _renderTagetSize.y; + _cfg.OGL.Header.Multisample = 0; + // OS specifics are already set in _cfg! //debug() << "call ovrHmd_ConfigureRendering():" << std::endl; //printDistortionCaps(_hmd->DistortionCaps); @@ -167,11 +210,11 @@ bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uv distortionCaps ^= ovrDistortionCap_SRGB; #ifdef OVR_OS_WIN32 - ovrHmd_AttachToWindow(_hmd, cfg.OGL.Window, nullptr, nullptr); + ovrHmd_AttachToWindow(_hmd, _cfg.OGL.Window, nullptr, nullptr); #endif //printDistortionCaps(distortionCaps); - ovrBool ok = ovrHmd_ConfigureRendering(_hmd, (ovrRenderAPIConfig*)&cfg, distortionCaps, _hmd->DefaultEyeFov, _eyeRenderDesc); + ovrBool ok = ovrHmd_ConfigureRendering(_hmd, (ovrRenderAPIConfig*)&_cfg, distortionCaps, _hmd->DefaultEyeFov, _eyeRenderDesc); if (ok) { bool riftIsUsingExtendedDesktop = (bool)(_hmd->HmdCaps & ovrHmdCap_ExtendDesktop); //debug() << "OVR Rendering configured" << std::endl; @@ -182,7 +225,7 @@ bool configureRendering(ovrHmd _hmd, ovrEyeRenderDesc _eyeRenderDesc[2], glm::uv return (bool)ok; } -#endif + bool deactivateHealthWarning(ovrHmd _hmd) { diff --git a/src/ACGL/HardwareSupport/SimpleRiftController.cc b/src/ACGL/HardwareSupport/SimpleRiftController.cc index 33d54fa81422b3ff77946343546023eb929f6cc8..5388cdec5ca026f143c0b51bcce98808279a158b 100644 --- a/src/ACGL/HardwareSupport/SimpleRiftController.cc +++ b/src/ACGL/HardwareSupport/SimpleRiftController.cc @@ -749,10 +749,12 @@ using namespace ACGL::OpenGL; using namespace std; -SimpleRiftController::SimpleRiftController(uint32_t _riftnumber) : mRenderingConfigured(false), mGLFWWindow(NULL), mNextExpectedEyeNumber(0) { +SimpleRiftController::SimpleRiftController(uint32_t _riftnumber) : mRenderingConfigured(false), mNextExpectedEyeNumber(0) { +#ifdef ACGL_COMPILE_WITH_GLFW + mGLFWWindow = NULL; +#endif OVR::initSDK(); mHMD = OVR::createHMD(_riftnumber); - OVR::deactivateHealthWarning(mHMD); mCamera = SharedOculusRiftCamera(new OculusRiftCamera()); mCamera->connectWithRift(mHMD); @@ -768,19 +770,35 @@ SimpleRiftController::~SimpleRiftController() { OVR::shutdownSDK(); } +void SimpleRiftController::configureRendering(GLuint _leftTexture, GLuint _rightTexture, glm::uvec2 _size ) { + // mGLTexture will be set: + ACGL::HardwareSupport::OVR::generateEyeTextureDescription(_leftTexture, _rightTexture, _size, mGLTexture); + configureRendering(); +} + void SimpleRiftController::configureRendering(ACGL::OpenGL::ConstSharedTexture2D _leftTexture, ACGL::OpenGL::ConstSharedTexture2D _rightTexture) { - if (!mHMD) return; + // mGLTexture will be set: + ACGL::HardwareSupport::OVR::generateEyeTextureDescription(_leftTexture, _rightTexture, mGLTexture); + configureRendering(); +} - assert(mGLFWWindow && "call setGLFWWindow first!"); +void SimpleRiftController::configureRendering() { + if (!mHMD) return; int width, height; +#ifdef ACGL_COMPILE_WITH_GLFW + assert(mGLFWWindow && "call setGLFWWindow first!"); glfwGetWindowSize(mGLFWWindow, &width, &height); - // mEyeRenderDesc will be set by this: ACGL::HardwareSupport::OVR::configureRendering(mHMD, mCamera->mEyeRenderDesc, glm::uvec2(width,height), mGLFWWindow); - - // mEyeTexture will be set: - ACGL::HardwareSupport::OVR::generateEyeTextureDescription(_leftTexture, _rightTexture, mGLTexture); +#elif ACGL_COMPILE_WITH_QT + assert(mQWidget && "call setQWidget first!"); + width = mQWidget->size().width(); + height = mQWidget->size().height(); + ACGL::HardwareSupport::OVR::configureRendering(mHMD, mCamera->mEyeRenderDesc, glm::uvec2(width,height), mQWidget); +#else + assert(0 && "can't configure SDK rendering as no OS Window is provided!"); +#endif mRenderingConfigured = true; } @@ -796,7 +814,7 @@ void SimpleRiftController::renderDistorted() { } glm::uvec2 SimpleRiftController::getPhysicalScreenResolution() { - return glm::uvec2(1920, 1080); // TODO! + return glm::uvec2( mHMD->Resolution.w, mHMD->Resolution.h ); } GenericCamera::Eye SimpleRiftController::updateCameraEye(int _eyeNumber) @@ -811,7 +829,7 @@ GenericCamera::Eye SimpleRiftController::updateCameraEye(int _eyeNumber) if (_eyeNumber == 0) { // has to be called at the beginning of the frame, one reason why the eye order is important! OVR::beginFrame(mHMD); - OVR::deactivateHealthWarning(mHMD); + OVR::deactivateHealthWarning(mHMD); // just quit this asap -> apps should also call this as this might not stay here } return mCamera->setPoseForEyeFromRift(_eyeNumber); diff --git a/src/ACGL/OpenGL/Data/TextureData.cc b/src/ACGL/OpenGL/Data/TextureData.cc index c8e3109a366d181eb07d714d42c3d6cff08022cc..3a09d2a73f647bdfaba20f3a8a58dfb161712004 100644 --- a/src/ACGL/OpenGL/Data/TextureData.cc +++ b/src/ACGL/OpenGL/Data/TextureData.cc @@ -316,30 +316,30 @@ glm::vec4 convertTexelNumChannels(glm::vec4 _texel, GLsizei _from, GLsizei _to) } else if (_from == 1) { switch (_to) { - case 2: return {_texel.r, 1.0, 0.0, 0.0}; - case 3: return {_texel.r, _texel.r, _texel.r, 0.0}; - case 4: return {_texel.r, _texel.r, _texel.r, 1.0}; + case 2: return glm::vec4( _texel.r, 1.0, 0.0, 0.0 ); + case 3: return glm::vec4( _texel.r, _texel.r, _texel.r, 0.0 ); + case 4: return glm::vec4( _texel.r, _texel.r, _texel.r, 1.0 ); } } else if (_from == 2) { switch (_to) { - case 1: return {_texel.r, 0.0, 0.0, 0.0}; - case 3: return {_texel.r, _texel.r, _texel.r, _texel.g}; - case 4: return {_texel.r, _texel.r, _texel.r, _texel.g}; + case 1: return glm::vec4( _texel.r, 0.0, 0.0, 0.0 ); + case 3: return glm::vec4( _texel.r, _texel.r, _texel.r, _texel.g ); + case 4: return glm::vec4( _texel.r, _texel.r, _texel.r, _texel.g ); } } else if (_from == 3) { switch (_to) { - case 1: return {grayscaleMixdown(_texel.r, _texel.g, _texel.b), 0.0, 0.0, 0.0}; - case 2: return {grayscaleMixdown(_texel.r, _texel.g, _texel.b), 1.0, 0.0, 0.0}; - case 4: return {_texel.r, _texel.r, _texel.r, 1.0}; + case 1: return glm::vec4( grayscaleMixdown(_texel.r, _texel.g, _texel.b), 0.0, 0.0, 0.0 ); + case 2: return glm::vec4( grayscaleMixdown(_texel.r, _texel.g, _texel.b), 1.0, 0.0, 0.0 ); + case 4: return glm::vec4( _texel.r, _texel.r, _texel.r, 1.0 ); } } else if (_from == 4) { switch (_to) { - case 1: return {grayscaleMixdown(_texel.r, _texel.g, _texel.b), 0.0, 0.0, 0.0}; - case 2: return {grayscaleMixdown(_texel.r, _texel.g, _texel.b), 1.0, 0.0, 0.0}; - case 3: return {_texel.r, _texel.r, _texel.r, 0.0}; + case 1: return glm::vec4( grayscaleMixdown(_texel.r, _texel.g, _texel.b), 0.0, 0.0, 0.0 ); + case 2: return glm::vec4( grayscaleMixdown(_texel.r, _texel.g, _texel.b), 1.0, 0.0, 0.0 ); + case 3: return glm::vec4( _texel.r, _texel.r, _texel.r, 0.0 ); } } return _texel; @@ -367,8 +367,8 @@ void convertTextureData(const SharedTextureData& _from, const SharedTextureData& // Transfer pixels for (GLsizei y = 0; y < _to->getHeight(); ++y) { for (GLsizei x = 0; x < _to->getWidth(); ++x) { - auto texel = convertTexelNumChannels(_from->getTexel({x, y}), _from->getNumberOfChannels(), _to->getNumberOfChannels()); - _to->setTexel({x, y}, texel); + auto texel = convertTexelNumChannels(_from->getTexel(glm::uvec2(x, y)), _from->getNumberOfChannels(), _to->getNumberOfChannels()); + _to->setTexel(glm::uvec2(x, y), texel); } } } diff --git a/src/ACGL/Scene/OculusRiftCamera.cc b/src/ACGL/Scene/OculusRiftCamera.cc index 5a4296871b36bc2a01285bcfaea73f28f5f9b3fd..37537e551139fcc972fce3393a79a9dec59025a9 100644 --- a/src/ACGL/Scene/OculusRiftCamera.cc +++ b/src/ACGL/Scene/OculusRiftCamera.cc @@ -142,7 +142,7 @@ glm::uvec2 OculusRiftCamera::getViewportSize() const } } -#else +#elif ACGL_RIFT_SDK_VERSION >= 40 // 0.4 version: namespace ACGL{ @@ -190,26 +190,26 @@ GenericCamera::Eye OculusRiftCamera::setPoseForEyeFromRift(int _eyeNumber) if (eyeType == ovrEye_Right) eye = GenericCamera::EYE_RIGHT; // pose: - glm::quat rotation{ eyePose.Orientation.w, eyePose.Orientation.x, eyePose.Orientation.y, eyePose.Orientation.z }; - glm::vec3 translation{ eyePose.Position.x, eyePose.Position.y, eyePose.Position.z }; + glm::quat rotation( eyePose.Orientation.w, eyePose.Orientation.x, eyePose.Orientation.y, eyePose.Orientation.z ); + glm::vec3 translation( eyePose.Position.x, eyePose.Position.y, eyePose.Position.z ); //std::cout << glm::to_string(translation) << std::endl; // projection: ovrMatrix4f ovrp = ovrMatrix4f_Projection(mEyeRenderDesc[_eyeNumber].Fov, getNearClippingPlane(), getFarClippingPlane(), true); - glm::mat4 projection{ + glm::mat4 projection( ovrp.M[0][0], ovrp.M[1][0], ovrp.M[2][0], ovrp.M[3][0], ovrp.M[0][1], ovrp.M[1][1], ovrp.M[2][1], ovrp.M[3][1], ovrp.M[0][2], ovrp.M[1][2], ovrp.M[2][2], ovrp.M[3][2], ovrp.M[0][3], ovrp.M[1][3], ovrp.M[2][3], ovrp.M[3][3] - }; + ); mProjectionMatrix = projection; - glm::vec3 eyeOffset{ mEyeRenderDesc[_eyeNumber].ViewAdjust.x, mEyeRenderDesc[_eyeNumber].ViewAdjust.y, mEyeRenderDesc[_eyeNumber].ViewAdjust.z }; + glm::vec3 eyeOffset( mEyeRenderDesc[_eyeNumber].ViewAdjust.x, mEyeRenderDesc[_eyeNumber].ViewAdjust.y, mEyeRenderDesc[_eyeNumber].ViewAdjust.z ); glm::vec4 basePosition = glm::vec4(MoveableObject::getPosition(), 1.0); - mEyePosition = glm::vec3{ glm::inverse(getViewMatrix()) * basePosition }; + mEyePosition = glm::vec3( glm::inverse(getViewMatrix()) * basePosition ); mViewMatrix = glm::translate(eyeOffset) * glm::inverse( glm::translate(translation) * glm::mat4_cast(rotation) ) * MoveableObject::getModelMatrix(); diff --git a/src/ACGL/Utils/MemoryMappedFile.cc b/src/ACGL/Utils/MemoryMappedFile.cc index 8fb5b22183382213c5074f43d5f5ca8dbd54c7ec..879a752b97a1bc4181ef329eeb6295d232752c5b 100644 --- a/src/ACGL/Utils/MemoryMappedFile.cc +++ b/src/ACGL/Utils/MemoryMappedFile.cc @@ -25,7 +25,7 @@ ACGL::Utils::MemoryMappedFile::MemoryMappedFile( accessMode _accessMode, shareMode _shareMode, size_t _length, - off_t _offset) + off_t _offset) : mpMMFileImpl(NULL) { #ifdef _WIN32 mpMMFileImpl = new MemoryMappedFileWinImpl(_fileName, _accessMode, _shareMode, _length, _offset);