Working on functional overlays

This commit is contained in:
Brad Davis 2015-06-11 02:20:51 -07:00
parent ac0fc5d974
commit ef52035300
4 changed files with 53 additions and 48 deletions

View file

@ -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()) {

View file

@ -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();

View file

@ -12,6 +12,7 @@
#include "InterfaceConfig.h"
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <GlowEffect.h>
#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<float>(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

View file

@ -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<GeometryCache>();
gpu::Batch batch;
//DependencyManager::get<DeferredLightingEffect>()->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<GeometryCache>()->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<GeometryCache>()->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();