From 2fde67be724babf83f085b0e444e0e4f744825e0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 12:40:03 -0700 Subject: [PATCH 1/9] Fix for deferred lighting with 3DTV (/Oculus, although I haven't tested that yet). --- interface/src/MetavoxelSystem.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 892efe7211..b84b6f97d4 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -181,6 +181,15 @@ void MetavoxelSystem::render() { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryNormalTextureID()); + // get the viewport side (left, right, both) + int viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + const int VIEWPORT_X_INDEX = 0; + const int VIEWPORT_WIDTH_INDEX = 2; + QSize widgetSize = Application::getInstance()->getGLWidget()->getDeviceSize(); + float sMin = viewport[VIEWPORT_X_INDEX] / (float)widgetSize.width(); + float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)widgetSize.width(); + if (Menu::getInstance()->getShadowsEnabled()) { glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryDepthTextureID()); @@ -210,10 +219,13 @@ void MetavoxelSystem::render() { program->setUniformValue(locations->nearLocation, nearVal); program->setUniformValue(locations->depthScale, (farVal - nearVal) / farVal); float nearScale = -1.0f / nearVal; - program->setUniformValue(locations->depthTexCoordOffset, left * nearScale, bottom * nearScale); - program->setUniformValue(locations->depthTexCoordScale, (right - left) * nearScale, (top - bottom) * nearScale); + float sScale = 1.0f / sWidth; + float depthTexCoordScaleS = (right - left) * nearScale * sScale; + program->setUniformValue(locations->depthTexCoordOffset, left * nearScale - sMin * depthTexCoordScaleS, + bottom * nearScale); + program->setUniformValue(locations->depthTexCoordScale, depthTexCoordScaleS, (top - bottom) * nearScale); - renderFullscreenQuad(); + renderFullscreenQuad(sMin, sMin + sWidth); program->release(); @@ -226,7 +238,7 @@ void MetavoxelSystem::render() { } else { _directionalLight.bind(); - renderFullscreenQuad(); + renderFullscreenQuad(sMin, sMin + sWidth); _directionalLight.release(); } @@ -245,7 +257,7 @@ void MetavoxelSystem::render() { glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - renderFullscreenQuad(); + renderFullscreenQuad(sMin, sMin + sWidth); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); From c5ad603321e5fda4e09d2bdd7c8be9c66216a80b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 12:47:46 -0700 Subject: [PATCH 2/9] Fix for glow disabled in 3D TV mode. --- interface/src/devices/TV3DManager.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 2ce78b7ac1..005f7133f0 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -93,8 +93,6 @@ void TV3DManager::display(Camera& whichCamera) { int portalW = Application::getInstance()->getGLWidget()->getDeviceWidth() / 2; int portalH = Application::getInstance()->getGLWidget()->getDeviceHeight(); - const bool glowEnabled = Menu::getInstance()->isOptionChecked(MenuOption::EnableGlowEffect); - ApplicationOverlay& applicationOverlay = Application::getInstance()->getApplicationOverlay(); // We only need to render the overlays to a texture once, then we just render the texture as a quad @@ -102,9 +100,7 @@ void TV3DManager::display(Camera& whichCamera) { applicationOverlay.renderOverlay(true); const bool displayOverlays = Menu::getInstance()->isOptionChecked(MenuOption::UserInterface); - if (glowEnabled) { - Application::getInstance()->getGlowEffect()->prepare(); - } + Application::getInstance()->getGlowEffect()->prepare(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -168,7 +164,5 @@ void TV3DManager::display(Camera& whichCamera) { glViewport(0, 0, Application::getInstance()->getGLWidget()->getDeviceWidth(), Application::getInstance()->getGLWidget()->getDeviceHeight()); - if (glowEnabled) { - Application::getInstance()->getGlowEffect()->render(); - } + Application::getInstance()->getGlowEffect()->render(); } From 2cba7b37bf0688ffa391c8554bcb33615cb21698 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 13:51:14 -0700 Subject: [PATCH 3/9] Attempting to fix 3DTV/Oculus deferred lighting/ambient occlusion. --- interface/src/Application.cpp | 7 +++++++ interface/src/devices/OculusManager.cpp | 17 +++++++++++++++++ interface/src/devices/OculusManager.h | 4 ++++ interface/src/devices/TV3DManager.cpp | 16 +++++++++++++++- interface/src/devices/TV3DManager.h | 5 +++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7c7c455d1d..f781c9765d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2971,7 +2971,14 @@ void Application::getProjectionMatrix(glm::dmat4* projectionMatrix) { void Application::computeOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const { + // allow 3DTV/Oculus to override parameters from camera _viewFrustum.computeOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + if (OculusManager::isConnected()) { + OculusManager::overrideOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + + } else if (TV3DManager::isConnected()) { + TV3DManager::overrideOffAxisFrustum(left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + } } glm::vec2 Application::getScaledScreenPoint(glm::vec2 projectedPoint) { diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index bc6dc842ce..e46f2f3182 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -53,6 +53,7 @@ unsigned int OculusManager::_frameIndex = 0; bool OculusManager::_frameTimingActive = false; bool OculusManager::_programInitialized = false; Camera* OculusManager::_camera = NULL; +int OculusManager::_activeEyeIndex = -1; #endif @@ -330,6 +331,8 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p //Render each eye into an fbo for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) { + _activeEyeIndex = eyeIndex; + #if defined(__APPLE__) || defined(_WIN32) ovrEyeType eye = _ovrHmd->EyeRenderOrder[eyeIndex]; #else @@ -363,6 +366,7 @@ void OculusManager::display(const glm::quat &bodyOrientation, const glm::vec3 &p Application::getInstance()->displaySide(*_camera); applicationOverlay.displayOverlayTextureOculus(*_camera); + _activeEyeIndex = -1; } //Wait till time-warp to reduce latency @@ -528,3 +532,16 @@ QSize OculusManager::getRenderTargetSize() { return QSize(100, 100); #endif } + +void OculusManager::overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, + float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) { +#ifdef HAVE_LIBOVR + if (_activeEyeIndex != -1) { + float extent = nearVal * glm::tan(_eyeRenderDesc[_activeEyeIndex].Fov / 2.0f); + right = extent; + left = -extent; + top = extent; + bottom = -extent; + } +#endif +} diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h index 3959ea1ab7..d8e55647b4 100644 --- a/interface/src/devices/OculusManager.h +++ b/interface/src/devices/OculusManager.h @@ -43,6 +43,9 @@ public: static glm::vec3 getRelativePosition(); static QSize getRenderTargetSize(); + static void overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, + float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane); + private: #ifdef HAVE_LIBOVR static void generateDistortionMesh(); @@ -92,6 +95,7 @@ private: static bool _frameTimingActive; static bool _programInitialized; static Camera* _camera; + static int _activeEyeIndex; #endif }; diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 005f7133f0..e8644c00d0 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -25,6 +25,7 @@ int TV3DManager::_screenHeight = 1; double TV3DManager::_aspect = 1.0; eyeFrustum TV3DManager::_leftEye; eyeFrustum TV3DManager::_rightEye; +eyeFrustum* TV3DManager::_activeEye = NULL; bool TV3DManager::isConnected() { @@ -111,7 +112,7 @@ void TV3DManager::display(Camera& whichCamera) { glPushMatrix(); { - + _activeEye = &_leftEye; glMatrixMode(GL_PROJECTION); glLoadIdentity(); // reset projection matrix glFrustum(_leftEye.left, _leftEye.right, _leftEye.bottom, _leftEye.top, nearZ, farZ); // set left view frustum @@ -128,6 +129,7 @@ void TV3DManager::display(Camera& whichCamera) { if (displayOverlays) { applicationOverlay.displayOverlayTexture3DTV(whichCamera, _aspect, fov); } + _activeEye = NULL; } glPopMatrix(); glDisable(GL_SCISSOR_TEST); @@ -140,6 +142,7 @@ void TV3DManager::display(Camera& whichCamera) { glScissor(portalX, portalY, portalW, portalH); glPushMatrix(); { + _activeEye = &_rightEye; glMatrixMode(GL_PROJECTION); glLoadIdentity(); // reset projection matrix glFrustum(_rightEye.left, _rightEye.right, _rightEye.bottom, _rightEye.top, nearZ, farZ); // set left view frustum @@ -156,6 +159,7 @@ void TV3DManager::display(Camera& whichCamera) { if (displayOverlays) { applicationOverlay.displayOverlayTexture3DTV(whichCamera, _aspect, fov); } + _activeEye = NULL; } glPopMatrix(); glDisable(GL_SCISSOR_TEST); @@ -166,3 +170,13 @@ void TV3DManager::display(Camera& whichCamera) { Application::getInstance()->getGlowEffect()->render(); } + +void TV3DManager::overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, + float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) { + if (_activeEye) { + left = _activeEye->left; + right = _activeEye->right; + bottom = _activeEye->bottom; + top = _activeEye->top; + } +} diff --git a/interface/src/devices/TV3DManager.h b/interface/src/devices/TV3DManager.h index 91a78e9bce..2b2b9e0aa1 100644 --- a/interface/src/devices/TV3DManager.h +++ b/interface/src/devices/TV3DManager.h @@ -14,6 +14,8 @@ #include +#include + class Camera; struct eyeFrustum { @@ -32,6 +34,8 @@ public: static bool isConnected(); static void configureCamera(Camera& camera, int screenWidth, int screenHeight); static void display(Camera& whichCamera); + static void overrideOffAxisFrustum(float& left, float& right, float& bottom, float& top, float& nearVal, + float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane); private: static void setFrustum(Camera& whichCamera); static int _screenWidth; @@ -39,6 +43,7 @@ private: static double _aspect; static eyeFrustum _leftEye; static eyeFrustum _rightEye; + static eyeFrustum* _activeEye; }; #endif // hifi_TV3DManager_h From 600f36aa64769ccf40d7912a3b450878430d925d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 14:14:02 -0700 Subject: [PATCH 4/9] Fix for Oculus API. --- interface/src/devices/OculusManager.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index e46f2f3182..5e4daa3d22 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -537,11 +537,11 @@ void OculusManager::overrideOffAxisFrustum(float& left, float& right, float& bot float& farVal, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) { #ifdef HAVE_LIBOVR if (_activeEyeIndex != -1) { - float extent = nearVal * glm::tan(_eyeRenderDesc[_activeEyeIndex].Fov / 2.0f); - right = extent; - left = -extent; - top = extent; - bottom = -extent; + const ovrFovPort& port = _eyeFov[_activeEyeIndex]; + right = nearVal * port.RightTan; + left = -nearVal * port.LeftTan; + top = nearVal * port.TopTan; + bottom = -nearVal * port.BottomTan; } #endif } From b328304da40de24b3990b6e24338d77018e1ff2b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 14:15:00 -0700 Subject: [PATCH 5/9] Up/down, not top/bottom. --- interface/src/devices/OculusManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 5e4daa3d22..c47ff2c38b 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -540,8 +540,8 @@ void OculusManager::overrideOffAxisFrustum(float& left, float& right, float& bot const ovrFovPort& port = _eyeFov[_activeEyeIndex]; right = nearVal * port.RightTan; left = -nearVal * port.LeftTan; - top = nearVal * port.TopTan; - bottom = -nearVal * port.BottomTan; + top = nearVal * port.UpTan; + bottom = -nearVal * port.DownTan; } #endif } From 34ccc2ab7bb1d3c3f3c1187388368344f08470af Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 15:13:07 -0700 Subject: [PATCH 6/9] Use the FBO dimensions, which may differ from the widget dimensions (as with the Oculus). --- interface/src/MetavoxelSystem.cpp | 5 ++--- interface/src/renderer/AmbientOcclusionEffect.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index b84b6f97d4..2d27398f4b 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -186,9 +186,8 @@ void MetavoxelSystem::render() { glGetIntegerv(GL_VIEWPORT, viewport); const int VIEWPORT_X_INDEX = 0; const int VIEWPORT_WIDTH_INDEX = 2; - QSize widgetSize = Application::getInstance()->getGLWidget()->getDeviceSize(); - float sMin = viewport[VIEWPORT_X_INDEX] / (float)widgetSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)widgetSize.width(); + float sMin = viewport[VIEWPORT_X_INDEX] / (float)primaryFBO->width(); + float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)primaryFBO->width(); if (Menu::getInstance()->getShadowsEnabled()) { glActiveTexture(GL_TEXTURE2); diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index a4977e5e01..f1c1538800 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -116,9 +116,9 @@ void AmbientOcclusionEffect::render() { glGetIntegerv(GL_VIEWPORT, viewport); const int VIEWPORT_X_INDEX = 0; const int VIEWPORT_WIDTH_INDEX = 2; - QSize widgetSize = Application::getInstance()->getGLWidget()->getDeviceSize(); - float sMin = viewport[VIEWPORT_X_INDEX] / (float)widgetSize.width(); - float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)widgetSize.width(); + QOpenGLFramebufferObject* primaryFBO = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject(); + float sMin = viewport[VIEWPORT_X_INDEX] / (float)primaryFBO->width(); + float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)primaryFBO->width(); _occlusionProgram->bind(); _occlusionProgram->setUniformValue(_nearLocation, nearVal); @@ -126,7 +126,7 @@ void AmbientOcclusionEffect::render() { _occlusionProgram->setUniformValue(_leftBottomLocation, left, bottom); _occlusionProgram->setUniformValue(_rightTopLocation, right, top); _occlusionProgram->setUniformValue(_noiseScaleLocation, viewport[VIEWPORT_WIDTH_INDEX] / (float)ROTATION_WIDTH, - widgetSize.height() / (float)ROTATION_HEIGHT); + primaryFBO->height() / (float)ROTATION_HEIGHT); _occlusionProgram->setUniformValue(_texCoordOffsetLocation, sMin, 0.0f); _occlusionProgram->setUniformValue(_texCoordScaleLocation, sWidth, 1.0f); @@ -148,7 +148,7 @@ void AmbientOcclusionEffect::render() { glBindTexture(GL_TEXTURE_2D, freeFBO->texture()); _blurProgram->bind(); - _blurProgram->setUniformValue(_blurScaleLocation, 1.0f / widgetSize.width(), 1.0f / widgetSize.height()); + _blurProgram->setUniformValue(_blurScaleLocation, 1.0f / primaryFBO->width(), 1.0f / primaryFBO->height()); renderFullscreenQuad(sMin, sMin + sWidth); From fe249ef3486cf781a357d12d593952918893d3da Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 15:51:10 -0700 Subject: [PATCH 7/9] Make sure the frustum that we use for culling contains the current camera information. --- interface/src/Application.cpp | 3 +++ interface/src/Application.h | 2 ++ interface/src/MetavoxelSystem.cpp | 12 ++++++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b5826fbcda..273b66e4dc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2724,6 +2724,9 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide()"); // transform by eye offset + // load the view frustum + loadViewFrustum(whichCamera, _displayViewFrustum); + // flip x if in mirror mode (also requires reversing winding order for backface culling) if (whichCamera.getMode() == CAMERA_MODE_MIRROR) { glScalef(-1.0f, 1.0f, 1.0f); diff --git a/interface/src/Application.h b/interface/src/Application.h index f48d88d7a4..fbcc67cf80 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -192,6 +192,7 @@ public: const AudioReflector* getAudioReflector() const { return &_audioReflector; } Camera* getCamera() { return &_myCamera; } ViewFrustum* getViewFrustum() { return &_viewFrustum; } + ViewFrustum* getDisplayViewFrustum() { return &_displayViewFrustum; } ViewFrustum* getShadowViewFrustum() { return &_shadowViewFrustum; } VoxelImporter* getVoxelImporter() { return &_voxelImporter; } VoxelSystem* getVoxels() { return &_voxels; } @@ -486,6 +487,7 @@ private: ViewFrustum _viewFrustum; // current state of view frustum, perspective, orientation, etc. ViewFrustum _lastQueriedViewFrustum; /// last view frustum used to query octree servers (voxels, particles) + ViewFrustum _displayViewFrustum; ViewFrustum _shadowViewFrustum; quint64 _lastQueriedTime; diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 2d27398f4b..903e443cda 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -133,7 +133,7 @@ const GLenum COLOR_NORMAL_DRAW_BUFFERS[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTA void MetavoxelSystem::render() { // update the frustum - ViewFrustum* viewFrustum = Application::getInstance()->getViewFrustum(); + ViewFrustum* viewFrustum = Application::getInstance()->getDisplayViewFrustum(); _frustum.set(viewFrustum->getFarTopLeft(), viewFrustum->getFarTopRight(), viewFrustum->getFarBottomLeft(), viewFrustum->getFarBottomRight(), viewFrustum->getNearTopLeft(), viewFrustum->getNearTopRight(), viewFrustum->getNearBottomLeft(), viewFrustum->getNearBottomRight()); @@ -2187,7 +2187,7 @@ private: SpannerRenderVisitor::SpannerRenderVisitor(const MetavoxelLOD& lod) : SpannerVisitor(QVector() << AttributeRegistry::getInstance()->getSpannersAttribute(), QVector(), QVector(), QVector(), - lod, encodeOrder(Application::getInstance()->getViewFrustum()->getDirection())), + lod, encodeOrder(Application::getInstance()->getDisplayViewFrustum()->getDirection())), _containmentDepth(INT_MAX) { } @@ -2223,7 +2223,7 @@ private: BufferRenderVisitor::BufferRenderVisitor(const AttributePointer& attribute) : MetavoxelVisitor(QVector() << attribute), - _order(encodeOrder(Application::getInstance()->getViewFrustum()->getDirection())), + _order(encodeOrder(Application::getInstance()->getDisplayViewFrustum()->getDirection())), _containmentDepth(INT_MAX) { } @@ -2257,12 +2257,12 @@ void DefaultMetavoxelRendererImplementation::render(MetavoxelData& data, Metavox float viewportWidth = viewport[VIEWPORT_WIDTH_INDEX]; float viewportHeight = viewport[VIEWPORT_HEIGHT_INDEX]; float viewportDiagonal = sqrtf(viewportWidth * viewportWidth + viewportHeight * viewportHeight); - float worldDiagonal = glm::distance(Application::getInstance()->getViewFrustum()->getNearBottomLeft(), - Application::getInstance()->getViewFrustum()->getNearTopRight()); + float worldDiagonal = glm::distance(Application::getInstance()->getDisplayViewFrustum()->getNearBottomLeft(), + Application::getInstance()->getDisplayViewFrustum()->getNearTopRight()); _pointProgram.bind(); _pointProgram.setUniformValue(_pointScaleLocation, viewportDiagonal * - Application::getInstance()->getViewFrustum()->getNearClip() / worldDiagonal); + Application::getInstance()->getDisplayViewFrustum()->getNearClip() / worldDiagonal); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); From 590c8042f82eb28bc80c7c44b8599ef0eeb04fdf Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 16:36:32 -0700 Subject: [PATCH 8/9] Attempting to fix a bug in the Oculus overlay. --- interface/src/ui/ApplicationOverlay.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 20ed1d9d58..b7c7c15e13 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -803,24 +803,27 @@ void ApplicationOverlay::renderPointersOculus(const glm::vec3& eyePos) { float newVTop = 1.0 - (mouseY - reticleSize) / widgetHeight; // Project our position onto the hemisphere using the UV coordinates - float lX = sin((newULeft - 0.5f) * _textureFov); - float rX = sin((newURight - 0.5f) * _textureFov); - float bY = sin((newVBottom - 0.5f) * _textureFov); - float tY = sin((newVTop - 0.5f) * _textureFov); + float radius = _oculusuiRadius * application->getAvatar()->getScale(); + float radius2 = radius * radius; + + float lX = radius * sin((newULeft - 0.5f) * _textureFov); + float rX = radius * sin((newURight - 0.5f) * _textureFov); + float bY = radius * sin((newVBottom - 0.5f) * _textureFov); + float tY = radius * sin((newVTop - 0.5f) * _textureFov); float dist; //Bottom Left dist = sqrt(lX * lX + bY * bY); - float blZ = sqrt(1.0f - dist * dist); + float blZ = sqrt(radius2 - dist * dist); //Top Left dist = sqrt(lX * lX + tY * tY); - float tlZ = sqrt(1.0f - dist * dist); + float tlZ = sqrt(radius2 - dist * dist); //Bottom Right dist = sqrt(rX * rX + bY * bY); - float brZ = sqrt(1.0f - dist * dist); + float brZ = sqrt(radius2 - dist * dist); //Top Right dist = sqrt(rX * rX + tY * tY); - float trZ = sqrt(1.0f - dist * dist); + float trZ = sqrt(radius2 - dist * dist); glBegin(GL_QUADS); From 146a6526bee8f9b40811aac047204f3f8b779b83 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 10 Sep 2014 17:02:04 -0700 Subject: [PATCH 9/9] Fix for Oculus mouse pointer. --- interface/src/ui/ApplicationOverlay.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index b7c7c15e13..df7c2d2289 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -414,7 +414,7 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { renderTexturedHemisphere(); - renderPointersOculus(whichCamera.getPosition()); + renderPointersOculus(myAvatar->getHead()->getEyePosition()); glDepthMask(GL_TRUE); glBindTexture(GL_TEXTURE_2D, 0); @@ -803,27 +803,24 @@ void ApplicationOverlay::renderPointersOculus(const glm::vec3& eyePos) { float newVTop = 1.0 - (mouseY - reticleSize) / widgetHeight; // Project our position onto the hemisphere using the UV coordinates - float radius = _oculusuiRadius * application->getAvatar()->getScale(); - float radius2 = radius * radius; - - float lX = radius * sin((newULeft - 0.5f) * _textureFov); - float rX = radius * sin((newURight - 0.5f) * _textureFov); - float bY = radius * sin((newVBottom - 0.5f) * _textureFov); - float tY = radius * sin((newVTop - 0.5f) * _textureFov); + float lX = sin((newULeft - 0.5f) * _textureFov); + float rX = sin((newURight - 0.5f) * _textureFov); + float bY = sin((newVBottom - 0.5f) * _textureFov); + float tY = sin((newVTop - 0.5f) * _textureFov); float dist; //Bottom Left dist = sqrt(lX * lX + bY * bY); - float blZ = sqrt(radius2 - dist * dist); + float blZ = sqrt(1.0f - dist * dist); //Top Left dist = sqrt(lX * lX + tY * tY); - float tlZ = sqrt(radius2 - dist * dist); + float tlZ = sqrt(1.0f - dist * dist); //Bottom Right dist = sqrt(rX * rX + bY * bY); - float brZ = sqrt(radius2 - dist * dist); + float brZ = sqrt(1.0f - dist * dist); //Top Right dist = sqrt(rX * rX + tY * tY); - float trZ = sqrt(radius2 - dist * dist); + float trZ = sqrt(1.0f - dist * dist); glBegin(GL_QUADS);