Working on 0.6

This commit is contained in:
Brad Davis 2015-06-07 18:25:16 -07:00
parent 6a60da2a6c
commit de268c47b3
3 changed files with 98 additions and 84 deletions

View file

@ -1860,8 +1860,7 @@ void Application::setEnableVRMode(bool enableVRMode) {
// attempt to reconnect the Oculus manager - it's possible this was a workaround // attempt to reconnect the Oculus manager - it's possible this was a workaround
// for the sixense crash // for the sixense crash
OculusManager::disconnect(); OculusManager::disconnect();
_glWidget->makeCurrent(); OculusManager::connect(_glWidget->context()->contextHandle());
OculusManager::connect();
} }
OculusManager::recalibrate(); OculusManager::recalibrate();
} else { } else {

View file

@ -25,6 +25,7 @@
#include <avatar/AvatarManager.h> #include <avatar/AvatarManager.h>
#include <avatar/MyAvatar.h> #include <avatar/MyAvatar.h>
#include <GlowEffect.h> #include <GlowEffect.h>
#include <GlWindow.h>
#include <gpu/GLBackend.h> #include <gpu/GLBackend.h>
#include <OglplusHelpers.h> #include <OglplusHelpers.h>
#include <PathUtils.h> #include <PathUtils.h>
@ -177,6 +178,7 @@ ovrLayerEyeFov OculusManager::_sceneLayer;
#else #else
ovrTexture OculusManager::_eyeTextures[ovrEye_Count]; ovrTexture OculusManager::_eyeTextures[ovrEye_Count];
GlWindow* OculusManager::_outputWindow{ nullptr };
#endif #endif
@ -197,12 +199,12 @@ float OculusManager::CALIBRATION_DELTA_MINIMUM_LENGTH = 0.02f;
float OculusManager::CALIBRATION_DELTA_MINIMUM_ANGLE = 5.0f * RADIANS_PER_DEGREE; float OculusManager::CALIBRATION_DELTA_MINIMUM_ANGLE = 5.0f * RADIANS_PER_DEGREE;
float OculusManager::CALIBRATION_ZERO_MAXIMUM_LENGTH = 0.01f; float OculusManager::CALIBRATION_ZERO_MAXIMUM_LENGTH = 0.01f;
float OculusManager::CALIBRATION_ZERO_MAXIMUM_ANGLE = 2.0f * RADIANS_PER_DEGREE; float OculusManager::CALIBRATION_ZERO_MAXIMUM_ANGLE = 2.0f * RADIANS_PER_DEGREE;
quint64 OculusManager::CALIBRATION_ZERO_HOLD_TIME = 3000000; // usec uint64_t OculusManager::CALIBRATION_ZERO_HOLD_TIME = 3000000; // usec
float OculusManager::CALIBRATION_MESSAGE_DISTANCE = 2.5f; float OculusManager::CALIBRATION_MESSAGE_DISTANCE = 2.5f;
OculusManager::CalibrationState OculusManager::_calibrationState; OculusManager::CalibrationState OculusManager::_calibrationState;
glm::vec3 OculusManager::_calibrationPosition; glm::vec3 OculusManager::_calibrationPosition;
glm::quat OculusManager::_calibrationOrientation; glm::quat OculusManager::_calibrationOrientation;
quint64 OculusManager::_calibrationStartTime; uint64_t OculusManager::_calibrationStartTime;
int OculusManager::_calibrationMessage = 0; int OculusManager::_calibrationMessage = 0;
glm::vec3 OculusManager::_eyePositions[ovrEye_Count]; glm::vec3 OculusManager::_eyePositions[ovrEye_Count];
// TODO expose this as a developer toggle // TODO expose this as a developer toggle
@ -218,13 +220,15 @@ void OculusManager::init() {
void OculusManager::deinit() { void OculusManager::deinit() {
} }
void OculusManager::connect() { void OculusManager::connect(QOpenGLContext* shareContext) {
qCDebug(interfaceapp) << "Oculus SDK" << OVR_VERSION_STRING; qCDebug(interfaceapp) << "Oculus SDK" << OVR_VERSION_STRING;
ovrInitParams initParams; memset(&initParams, 0, sizeof(initParams)); ovrInitParams initParams; memset(&initParams, 0, sizeof(initParams));
#ifdef DEBUG #ifdef DEBUG
//initParams.Flags |= ovrInit_Debug; initParams.Flags |= ovrInit_Debug;
#endif #endif
ovr_Initialize(&initParams); ovr_Initialize(&initParams);
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -246,89 +250,97 @@ void OculusManager::connect() {
} }
#endif #endif
_isConnected = false;
// we're definitely not in "VR mode" so tell the menu that
Menu::getInstance()->getActionForOption(MenuOption::EnableVRMode)->setChecked(false);
#endif #endif
if (!_ovrHmd) {
_isConnected = false;
// we're definitely not in "VR mode" so tell the menu that
Menu::getInstance()->getActionForOption(MenuOption::EnableVRMode)->setChecked(false);
ovr_Shutdown();
return;
}
_calibrationState = UNCALIBRATED; _calibrationState = UNCALIBRATED;
if (!_isConnected) { if (!_isConnected) {
UserActivityLogger::getInstance().connectedDevice("hmd", "oculus"); UserActivityLogger::getInstance().connectedDevice("hmd", "oculus");
} }
_isConnected = true; _isConnected = true;
for_each_eye([&](ovrEyeType eye) { for_each_eye([&](ovrEyeType eye) {
_eyeFov[eye] = _ovrHmd->DefaultEyeFov[eye]; _eyeFov[eye] = _ovrHmd->DefaultEyeFov[eye];
}); });
_recommendedTexSize = ovrHmd_GetFovTextureSize(_ovrHmd, ovrEye_Left, _eyeFov[ovrEye_Left], 1.0f); _recommendedTexSize = ovrHmd_GetFovTextureSize(_ovrHmd, ovrEye_Left, _eyeFov[ovrEye_Left], 1.0f);
_renderTargetSize = { _recommendedTexSize.w * 2, _recommendedTexSize.h }; _renderTargetSize = { _recommendedTexSize.w * 2, _recommendedTexSize.h };
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
_mirrorFbo = new MirrorFramebufferWrapper(_ovrHmd); _mirrorFbo = new MirrorFramebufferWrapper(_ovrHmd);
_swapFbo = new SwapFramebufferWrapper(_ovrHmd); _swapFbo = new SwapFramebufferWrapper(_ovrHmd);
_swapFbo->Init(toGlm(_renderTargetSize)); _swapFbo->Init(toGlm(_renderTargetSize));
_sceneLayer.ColorTexture[0] = _swapFbo->color; _sceneLayer.ColorTexture[0] = _swapFbo->color;
_sceneLayer.ColorTexture[1] = nullptr; _sceneLayer.ColorTexture[1] = nullptr;
_sceneLayer.Viewport[0].Pos = { 0, 0 }; _sceneLayer.Viewport[0].Pos = { 0, 0 };
_sceneLayer.Viewport[0].Size = _recommendedTexSize; _sceneLayer.Viewport[0].Size = _recommendedTexSize;
_sceneLayer.Viewport[1].Pos = { _recommendedTexSize.w, 0 }; _sceneLayer.Viewport[1].Pos = { _recommendedTexSize.w, 0 };
_sceneLayer.Viewport[1].Size = _recommendedTexSize; _sceneLayer.Viewport[1].Size = _recommendedTexSize;
_sceneLayer.Header.Type = ovrLayerType_EyeFov; _sceneLayer.Header.Type = ovrLayerType_EyeFov;
_sceneLayer.Header.Flags = ovrLayerFlag_TextureOriginAtBottomLeft; _sceneLayer.Header.Flags = ovrLayerFlag_TextureOriginAtBottomLeft;
for_each_eye([&](ovrEyeType eye) { for_each_eye([&](ovrEyeType eye) {
_eyeViewports[eye] = _sceneLayer.Viewport[eye]; _eyeViewports[eye] = _sceneLayer.Viewport[eye];
_sceneLayer.Fov[eye] = _eyeFov[eye]; _sceneLayer.Fov[eye] = _eyeFov[eye];
}); });
#else #else
ovrGLConfig cfg; _outputWindow = new GlWindow(shareContext);
memset(&cfg, 0, sizeof(cfg)); _outputWindow->show();
cfg.OGL.Header.API = ovrRenderAPI_OpenGL; _outputWindow->setFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
cfg.OGL.Header.BackBufferSize = _ovrHmd->Resolution; _outputWindow->resize(_ovrHmd->Resolution.w, _ovrHmd->Resolution.h);
cfg.OGL.Header.Multisample = 1; // _outputWindow->setPosition(_ovrHmd->Position.x, _ovrHmd->Position.y);
_outputWindow->makeCurrent();
int distortionCaps = 0 ovrGLConfig cfg;
| ovrDistortionCap_Vignette memset(&cfg, 0, sizeof(cfg));
| ovrDistortionCap_Overdrive cfg.OGL.Header.API = ovrRenderAPI_OpenGL;
| ovrDistortionCap_TimeWarp; cfg.OGL.Header.BackBufferSize = _ovrHmd->Resolution;
cfg.OGL.Header.Multisample = 0;
int configResult = ovrHmd_ConfigureRendering(_ovrHmd, &cfg.Config, int distortionCaps = 0
distortionCaps, _eyeFov, _eyeRenderDesc); | ovrDistortionCap_Vignette
assert(configResult); | ovrDistortionCap_Overdrive
| ovrDistortionCap_TimeWarp;
int configResult = ovrHmd_ConfigureRendering(_ovrHmd, &cfg.Config,
distortionCaps, _eyeFov, _eyeRenderDesc);
assert(configResult);
for_each_eye([&](ovrEyeType eye) { for_each_eye([&](ovrEyeType eye) {
//Get texture size //Get texture size
_eyeTextures[eye].Header.API = ovrRenderAPI_OpenGL; _eyeTextures[eye].Header.API = ovrRenderAPI_OpenGL;
_eyeTextures[eye].Header.TextureSize = _renderTargetSize; _eyeTextures[eye].Header.TextureSize = _renderTargetSize;
_eyeTextures[eye].Header.RenderViewport.Pos = { 0, 0 }; _eyeTextures[eye].Header.RenderViewport.Pos = { 0, 0 };
_eyeTextures[eye].Header.RenderViewport.Size = _renderTargetSize; _eyeTextures[eye].Header.RenderViewport.Size = _renderTargetSize;
_eyeTextures[eye].Header.RenderViewport.Size.w /= 2; _eyeTextures[eye].Header.RenderViewport.Size.w /= 2;
}); });
_eyeTextures[ovrEye_Right].Header.RenderViewport.Pos.x = _recommendedTexSize.w; _eyeTextures[ovrEye_Right].Header.RenderViewport.Pos.x = _recommendedTexSize.w;
for_each_eye([&](ovrEyeType eye) { for_each_eye([&](ovrEyeType eye) {
_eyeViewports[eye] = _eyeTextures[eye].Header.RenderViewport; _eyeViewports[eye] = _eyeTextures[eye].Header.RenderViewport;
}); });
#endif #endif
ovrHmd_SetEnabledCaps(_ovrHmd, ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction); ovrHmd_SetEnabledCaps(_ovrHmd,
ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction);
ovrHmd_ConfigureTracking(_ovrHmd, ovrTrackingCap_Orientation | ovrTrackingCap_Position | ovrHmd_ConfigureTracking(_ovrHmd,
ovrTrackingCap_MagYawCorrection, ovrTrackingCap_Orientation | ovrTrackingCap_Position | ovrTrackingCap_MagYawCorrection,
ovrTrackingCap_Orientation); ovrTrackingCap_Orientation);
if (!_camera) { if (!_camera) {
_camera = new Camera; _camera = new Camera;
configureCamera(*_camera); // no need to use screen dimensions; they're ignored configureCamera(*_camera); // no need to use screen dimensions; they're ignored
}
} else {
_isConnected = false;
// we're definitely not in "VR mode" so tell the menu that
Menu::getInstance()->getActionForOption(MenuOption::EnableVRMode)->setChecked(false);
} }
} }
@ -460,7 +472,6 @@ void OculusManager::calibrate(glm::vec3 position, glm::quat orientation) {
break; break;
default: default:
break; break;
} }
} }
@ -713,19 +724,20 @@ void OculusManager::display(QGLWidget * glCanvas, const glm::quat &bodyOrientati
glEyeTexture.OGL.TexId = textureId; glEyeTexture.OGL.TexId = textureId;
}); });
_outputWindow->makeCurrent();
// restore our normal viewport // restore our normal viewport
glViewport(0, 0, deviceSize.width(), deviceSize.height());
ovrHmd_EndFrame(_ovrHmd, eyeRenderPose, _eyeTextures); ovrHmd_EndFrame(_ovrHmd, eyeRenderPose, _eyeTextures);
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //auto outputSize = _outputWindow->size();
// auto srcFboSize = finalFbo->getSize(); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// glBindFramebuffer(GL_READ_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo)); //auto srcFboSize = finalFbo->getSize();
// glBlitFramebuffer( //glBindFramebuffer(GL_READ_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(finalFbo));
// 0, 0, srcFboSize.x, srcFboSize.y, //glBlitFramebuffer(
// 0, 0, deviceSize.width(), deviceSize.height(), // 0, 0, srcFboSize.x, srcFboSize.y,
// GL_COLOR_BUFFER_BIT, GL_NEAREST); // 0, 0, outputSize.width(), outputSize.height(),
// glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); // GL_COLOR_BUFFER_BIT, GL_NEAREST);
// glCanvas->swapBuffers(); //glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
//glCanvas->swapBuffers();
#endif #endif

View file

@ -20,7 +20,9 @@
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
class QOpenGLContext;
class Camera; class Camera;
class GlWindow;
class PalmData; class PalmData;
class Text3DOverlay; class Text3DOverlay;
@ -35,7 +37,7 @@ class OculusManager {
public: public:
static void init(); static void init();
static void deinit(); static void deinit();
static void connect(); static void connect(QOpenGLContext* shareContext);
static void disconnect(); static void disconnect();
static bool isConnected(); static bool isConnected();
static void recalibrate(); static void recalibrate();
@ -113,6 +115,7 @@ private:
static ovrLayerEyeFov _sceneLayer; static ovrLayerEyeFov _sceneLayer;
#else #else
static ovrTexture _eyeTextures[ovrEye_Count]; static ovrTexture _eyeTextures[ovrEye_Count];
static GlWindow* _outputWindow;
#endif #endif
}; };