From ef520353008fb10205bcd8034b8d14d745966934 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 11 Jun 2015 02:20:51 -0700 Subject: [PATCH] Working on functional overlays --- interface/src/Application.cpp | 3 +- interface/src/devices/OculusManager.cpp | 38 +++++++++++----------- interface/src/devices/TV3DManager.cpp | 18 +++++------ interface/src/ui/ApplicationOverlay.cpp | 42 ++++++++++++++----------- 4 files changed, 53 insertions(+), 48 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9d5c43b7cf..a93b0186aa 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -941,6 +941,7 @@ void Application::paintGL() { glPushMatrix(); glLoadIdentity(); displaySide(&renderArgs, _myCamera); + _applicationOverlay.displayOverlayTexture(&renderArgs); glPopMatrix(); if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { @@ -957,8 +958,6 @@ void Application::paintGL() { 0, 0, _glWidget->getDeviceSize().width(), _glWidget->getDeviceSize().height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); - - _applicationOverlay.displayOverlayTexture(&renderArgs); } if (!OculusManager::isConnected() || OculusManager::allowSwap()) { diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 77263935f6..2ee62c85f3 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -615,6 +615,7 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const renderArgs->_renderSide = RenderArgs::MONO; qApp->displaySide(renderArgs, *_camera, false); + qApp->getApplicationOverlay().displayOverlayTextureHmd(renderArgs, *_camera); }); _activeEye = ovrEye_Count; @@ -629,28 +630,27 @@ void OculusManager::display(QGLWidget * glCanvas, RenderArgs* renderArgs, const glBindFramebuffer(GL_FRAMEBUFFER, 0); } - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); - //Render each eye into an fbo - for_each_eye(_ovrHmd, [&](ovrEyeType eye) { - _activeEye = eye; - // Update our camera to what the application camera is doing - _camera->setRotation(toGlm(eyeRenderPose[eye].Orientation)); - _camera->setPosition(toGlm(eyeRenderPose[eye].Position)); - configureCamera(*_camera); - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(glm::value_ptr(_camera->getProjection())); + //glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); + ////Render each eye into an fbo + //for_each_eye(_ovrHmd, [&](ovrEyeType eye) { + // _activeEye = eye; + // // Update our camera to what the application camera is doing + // _camera->setRotation(toGlm(eyeRenderPose[eye].Orientation)); + // _camera->setPosition(toGlm(eyeRenderPose[eye].Position)); + // configureCamera(*_camera); + // glMatrixMode(GL_PROJECTION); + // glLoadMatrixf(glm::value_ptr(_camera->getProjection())); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + // glMatrixMode(GL_MODELVIEW); + // glLoadIdentity(); - ovrRecti & vp = _eyeTextures[eye].Header.RenderViewport; - vp.Size.h = _recommendedTexSize.h * _offscreenRenderScale; - vp.Size.w = _recommendedTexSize.w * _offscreenRenderScale; + // ovrRecti & vp = _eyeTextures[eye].Header.RenderViewport; + // vp.Size.h = _recommendedTexSize.h * _offscreenRenderScale; + // vp.Size.w = _recommendedTexSize.w * _offscreenRenderScale; - glViewport(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); - qApp->getApplicationOverlay().displayOverlayTextureHmd(renderArgs, *_camera); - }); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + // glViewport(vp.Pos.x, vp.Pos.y, vp.Size.w, vp.Size.h); + //}); + //glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glPopMatrix(); diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index c14e589389..b0a2ff7e3b 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -12,6 +12,7 @@ #include "InterfaceConfig.h" #include +#include #include #include "gpu/GLBackend.h" @@ -106,21 +107,20 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { _activeEye = &eye; glViewport(portalX, portalY, portalW, portalH); glScissor(portalX, portalY, portalW, portalH); + + glm::mat4 projection = glm::frustum(eye.left, eye.right, eye.bottom, eye.top, nearZ, farZ); + float fov = atan(1.0f / projection[1][1]); + projection = glm::translate(projection, vec3(eye.modelTranslation, 0, 0)); + eyeCamera.setProjection(projection); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); // reset projection matrix - glFrustum(eye.left, eye.right, eye.bottom, eye.top, nearZ, farZ); // set left view frustum - GLfloat p[4][4]; - // Really? - glGetFloatv(GL_PROJECTION_MATRIX, &(p[0][0])); - float cotangent = p[1][1]; - GLfloat fov = atan(1.0f / cotangent); - glTranslatef(eye.modelTranslation, 0.0, 0.0); // translate to cancel parallax - + glLoadMatrixf(glm::value_ptr(projection)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); renderArgs->_renderSide = RenderArgs::MONO; qApp->displaySide(renderArgs, eyeCamera, false); - qApp->getApplicationOverlay().displayOverlayTextureStereo(renderArgs, whichCamera, _aspect, fov); + qApp->getApplicationOverlay().displayOverlayTexture(renderArgs); _activeEye = NULL; }, [&]{ // render right side view diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 4be47e342a..b4824e96a3 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -312,7 +312,6 @@ void ApplicationOverlay::displayOverlayTexture(RenderArgs* renderArgs) { renderArgs->_context->syncCache(); - glViewport(0, 0, qApp->getDeviceSize().width(), qApp->getDeviceSize().height()); gpu::Batch batch; Transform model; @@ -356,9 +355,10 @@ void ApplicationOverlay::displayOverlayTextureHmd(RenderArgs* renderArgs, Camera return; } + renderArgs->_context->syncCache(); + auto geometryCache = DependencyManager::get(); gpu::Batch batch; - //DependencyManager::get()->bindSimpleProgram(batch, true); batch.setPipeline(getDrawPipeline()); batch._glDisable(GL_DEPTH_TEST); batch._glBindTexture(GL_TEXTURE_2D, _framebufferObject->texture()); @@ -367,19 +367,23 @@ void ApplicationOverlay::displayOverlayTextureHmd(RenderArgs* renderArgs, Camera batch.setProjectionTransform(whichCamera.getProjection()); batch.setViewTransform(Transform()); - Transform model; - model.setTranslation(vec3(0.0f, 0.0f, -2.0f)); - batch.setModelTransform(model); + Transform mv; + mv.setTranslation(vec3(0.0f, 0.0f, -1.0f)); + mv.preRotate(glm::inverse(qApp->getCamera()->getHmdRotation())); + mv.setScale(vec3(1.0f, 1.0f / aspect(qApp->getCanvasSize()), 1.0f)); + batch.setModelTransform(mv); + // FIXME doesn't work - drawSphereSection(batch); + // drawSphereSection(batch); // works... geometryCache->renderUnitQuad(batch, vec4(vec3(1), _alpha)); + // sort of works, renders a semi-transparent red quad + // geometryCache->renderSolidCube(batch, 1.0f, vec4(1)); + renderArgs->_context->render(batch); - // batch.setUniformTexture(0, gpu::TexturePointer()); - // geometryCache->renderSolidCube(batch, 0.5f, vec4(1)); /* // The camera here contains only the head pose relative to the avatar position @@ -427,8 +431,9 @@ void ApplicationOverlay::displayOverlayTextureHmd(RenderArgs* renderArgs, Camera */ } +/* // Draws the FBO texture for 3DTV. -void ApplicationOverlay::displayOverlayTextureStereo(RenderArgs* renderArgs, Camera& whichCamera, float aspectRatio, float fov) { +void ApplicationOverlay::displayOverlayTextureStereo(Camera& whichCamera, float aspectRatio, float fov) { if (_alpha == 0.0f) { return; } @@ -473,15 +478,15 @@ void ApplicationOverlay::displayOverlayTextureStereo(RenderArgs* renderArgs, Cam GLfloat y = -halfQuadHeight; glDisable(GL_DEPTH_TEST); - //with_each_texture(_framebufferObject->texture(), _newUiTexture, [&] { - // DependencyManager::get()->renderQuad(glm::vec3(x, y + quadHeight, -distance), - // glm::vec3(x + quadWidth, y + quadHeight, -distance), - // glm::vec3(x + quadWidth, y, -distance), - // glm::vec3(x, y, -distance), - // glm::vec2(0.0f, 1.0f), glm::vec2(1.0f, 1.0f), - // glm::vec2(1.0f, 0.0f), glm::vec2(0.0f, 0.0f), - // overlayColor); - //}); + with_each_texture(_overlays.getTexture(), _newUiTexture, [&] { + DependencyManager::get()->renderQuad(glm::vec3(x, y + quadHeight, -distance), + glm::vec3(x + quadWidth, y + quadHeight, -distance), + glm::vec3(x + quadWidth, y, -distance), + glm::vec3(x, y, -distance), + glm::vec2(0.0f, 1.0f), glm::vec2(1.0f, 1.0f), + glm::vec2(1.0f, 0.0f), glm::vec2(0.0f, 0.0f), + overlayColor); + }); if (!_crosshairTexture) { _crosshairTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + @@ -521,6 +526,7 @@ void ApplicationOverlay::displayOverlayTextureStereo(RenderArgs* renderArgs, Cam glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); glEnable(GL_LIGHTING); } +*/ void ApplicationOverlay::computeHmdPickRay(glm::vec2 cursorPos, glm::vec3& origin, glm::vec3& direction) const { cursorPos *= qApp->getCanvasSize();