Last active
March 15, 2016 10:57
-
-
Save jherico/cbf5aaa7a679f739fff2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define GLEW_STATIC | |
#include <GL/glew.h> | |
#define OVR_OS_WIN32 | |
#include <OVR_CAPI_GL.h> | |
#include <SDL.h> | |
#include <iostream> | |
#undef main | |
int _tmain() { | |
return 0; | |
} | |
int main(int argc, char** argv) { | |
SDL_Init(SDL_INIT_VIDEO); | |
SDL_Window* window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL); | |
SDL_GLContext context = SDL_GL_CreateContext(window); | |
//Initialize GLEW | |
glewExperimental = GL_TRUE; | |
glewInit(); | |
// Initialize Oculus context | |
ovrResult result = ovr_Initialize(nullptr); | |
if (OVR_FAILURE(result)) { | |
std::cout << "ERROR: Failed to initialize libOVR" << std::endl; | |
SDL_Quit(); | |
return -1; | |
} | |
// Connect to the Oculus headset | |
ovrSession hmd; | |
ovrGraphicsLuid luid; | |
result = ovr_Create(&hmd, &luid); | |
if (OVR_FAILURE(result)) { | |
std::cout << "ERROR: Oculus Rift not detected" << std::endl; | |
SDL_Quit(); | |
return 0; | |
} | |
ovrHmdDesc desc = ovr_GetHmdDesc(hmd); | |
std::cout << "Found " << desc.ProductName << "connected Rift device" << std::endl; | |
ovrSizei recommenedTex0Size = ovr_GetFovTextureSize(hmd, ovrEyeType(0), desc.DefaultEyeFov[0], 1.0f); | |
ovrSizei bufferSize; | |
bufferSize.w = recommenedTex0Size.w * 2; | |
bufferSize.h = recommenedTex0Size.h; | |
std::cout << "Buffer Size: " << bufferSize.w << ", " << bufferSize.h << std::endl; | |
// Generate FBO for oculus | |
GLuint oculusFbo = 0; | |
glGenFramebuffers(1, &oculusFbo); | |
// Create swap texture | |
ovrSwapTextureSet* pTextureSet = nullptr; | |
if (ovr_CreateSwapTextureSetGL(hmd, GL_SRGB8_ALPHA8, bufferSize.w, bufferSize.h, &pTextureSet) == ovrSuccess) { | |
ovrGLTexture* tex = (ovrGLTexture*)&pTextureSet->Textures[0]; | |
glBindTexture(GL_TEXTURE_2D, tex->OGL.TexId); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
} | |
// Create ovrLayerHeader | |
ovrEyeRenderDesc eyeRenderDesc[2]; | |
eyeRenderDesc[0] = ovr_GetRenderDesc(hmd, ovrEye_Left, desc.DefaultEyeFov[0]); | |
eyeRenderDesc[1] = ovr_GetRenderDesc(hmd, ovrEye_Right, desc.DefaultEyeFov[1]); | |
ovrLayerEyeFov layer; | |
memset(&layer, 0, sizeof(ovrLayerEyeFov)); | |
layer.Header.Type = ovrLayerType_EyeFov; | |
layer.Header.Flags = ovrLayerFlag_TextureOriginAtBottomLeft; | |
layer.ColorTexture[0] = pTextureSet; | |
layer.ColorTexture[1] = nullptr; | |
layer.Fov[0] = eyeRenderDesc[0].Fov; | |
layer.Fov[1] = eyeRenderDesc[1].Fov; | |
layer.Viewport[1].Pos.x = recommenedTex0Size.w; | |
layer.Viewport[0].Size = recommenedTex0Size; | |
layer.Viewport[1].Size = recommenedTex0Size; | |
ovrLayerHeader* layers = &layer.Header; | |
SDL_Event windowEvent; | |
glEnable(GL_SCISSOR_TEST); | |
unsigned int textureIndex = 0; | |
while (true) { | |
if (SDL_PollEvent(&windowEvent)) { | |
if (windowEvent.type == SDL_QUIT) break; | |
} | |
ovrTrackingState tracking = ovr_GetTrackingState(hmd, 0, true); | |
layer.RenderPose[0] = tracking.HeadPose.ThePose; | |
layer.RenderPose[1] = tracking.HeadPose.ThePose; | |
ovrGLTexture* tex = (ovrGLTexture*)(&(pTextureSet->Textures[pTextureSet->CurrentIndex])); | |
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, oculusFbo); | |
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex->OGL.TexId, 0); | |
glScissor(0, 0, bufferSize.w / 2, bufferSize.h); | |
glClearColor(1.0f, 0, 0, 1.0f); | |
glClear(GL_COLOR_BUFFER_BIT); | |
glScissor(bufferSize.w / 2, 0, bufferSize.w / 2, bufferSize.h); | |
glClearColor(0, 0, 1.0f, 1.0f); | |
glClear(GL_COLOR_BUFFER_BIT); | |
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); | |
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); | |
ovr_SubmitFrame(hmd, 0, nullptr, &layers, 1); | |
pTextureSet->CurrentIndex = (pTextureSet->CurrentIndex + 1) % pTextureSet->TextureCount; | |
} | |
SDL_GL_DeleteContext(context); | |
SDL_Quit(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment