daily pastebin goal
81%
SHARE
TWEET

Oculus Rift SDL2 OpenGL Demo

a guest Jul 26th, 2014 1,177 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define GLEW_STATIC
  2. #include "GL/glew.h"
  3. // Uncomment your platform
  4. #define OVR_OS_WIN32
  5. //#define OVR_OS_MAC
  6. //#define OVR_OS_LINUX
  7. #include "OVR_CAPI_GL.h"
  8. #include "Kernel/OVR_Math.h"
  9. #include "SDL.h"
  10. #include "SDL_syswm.h"
  11.  
  12. using namespace OVR;
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16.         SDL_Init(SDL_INIT_VIDEO);
  17.  
  18.         int x = SDL_WINDOWPOS_CENTERED;
  19.         int y = SDL_WINDOWPOS_CENTERED;
  20.         Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN;
  21.  
  22.         bool debug = false;
  23.  
  24.         ovr_Initialize();
  25.  
  26.         ovrHmd hmd = ovrHmd_Create(0);
  27.  
  28.         if (hmd == NULL)
  29.         {
  30.                 hmd = ovrHmd_CreateDebug(ovrHmd_DK1);
  31.  
  32.                 debug = true;
  33.         }
  34.  
  35.         if (debug == false)
  36.         {
  37.                 x = hmd->WindowsPos.x;
  38.                 y = hmd->WindowsPos.y;
  39.                 flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
  40.         }
  41.  
  42.         int w = hmd->Resolution.w;
  43.         int h = hmd->Resolution.h;
  44.  
  45.         SDL_Window *window = SDL_CreateWindow("Oculus Rift SDL2 OpenGL Demo", x, y, w, h, flags);
  46.  
  47.         SDL_GLContext context = SDL_GL_CreateContext(window);
  48.  
  49.         glewExperimental = GL_TRUE;
  50.  
  51.         glewInit();
  52.  
  53.         Sizei recommendedTex0Size = ovrHmd_GetFovTextureSize(hmd, ovrEye_Left, hmd->DefaultEyeFov[0], 1.0f);
  54.         Sizei recommendedTex1Size = ovrHmd_GetFovTextureSize(hmd, ovrEye_Right, hmd->DefaultEyeFov[1], 1.0f);
  55.         Sizei renderTargetSize;
  56.         renderTargetSize.w = recommendedTex0Size.w + recommendedTex1Size.w;
  57.         renderTargetSize.h = max(recommendedTex0Size.h, recommendedTex1Size.h);
  58.  
  59.         GLuint frameBuffer;
  60.         glGenFramebuffers(1, &frameBuffer);
  61.  
  62.         GLuint texture;
  63.         glGenTextures(1, &texture);
  64.  
  65.         glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
  66.         glBindTexture(GL_TEXTURE_2D, texture);
  67.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, renderTargetSize.w, renderTargetSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  68.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  69.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  70.         glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);
  71.  
  72.         GLuint renderBuffer;
  73.         glGenRenderbuffers(1, &renderBuffer);
  74.         glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
  75.         glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, renderTargetSize.w, renderTargetSize.h);
  76.         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
  77.  
  78.         if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  79.         {
  80.                 glDeleteFramebuffers(1, &frameBuffer);
  81.                 glDeleteTextures(1, &texture);
  82.                 glDeleteRenderbuffers(1, &renderBuffer);
  83.  
  84.                 SDL_GL_DeleteContext(context);
  85.  
  86.                 SDL_DestroyWindow(window);
  87.  
  88.                 ovrHmd_Destroy(hmd);
  89.  
  90.                 ovr_Shutdown();
  91.  
  92.                 SDL_Quit();
  93.  
  94.                 return 0;
  95.         }
  96.  
  97.         ovrFovPort eyeFov[2] = { hmd->DefaultEyeFov[0], hmd->DefaultEyeFov[1] };
  98.  
  99.         ovrRecti eyeRenderViewport[2];
  100.         eyeRenderViewport[0].Pos = Vector2i(0, 0);
  101.         eyeRenderViewport[0].Size = Sizei(renderTargetSize.w / 2, renderTargetSize.h);
  102.         eyeRenderViewport[1].Pos = Vector2i((renderTargetSize.w + 1) / 2, 0);
  103.         eyeRenderViewport[1].Size = eyeRenderViewport[0].Size;
  104.  
  105.         ovrGLTexture eyeTexture[2];
  106.         eyeTexture[0].OGL.Header.API = ovrRenderAPI_OpenGL;
  107.         eyeTexture[0].OGL.Header.TextureSize = renderTargetSize;
  108.         eyeTexture[0].OGL.Header.RenderViewport = eyeRenderViewport[0];
  109.         eyeTexture[0].OGL.TexId = texture;
  110.  
  111.         eyeTexture[1] = eyeTexture[0];
  112.         eyeTexture[1].OGL.Header.RenderViewport = eyeRenderViewport[1];
  113.  
  114.         SDL_SysWMinfo info;
  115.  
  116.         SDL_VERSION(&info.version);
  117.  
  118.         SDL_GetWindowWMInfo(window, &info);
  119.  
  120.         ovrGLConfig cfg;
  121.         cfg.OGL.Header.API = ovrRenderAPI_OpenGL;
  122.         cfg.OGL.Header.RTSize = Sizei(hmd->Resolution.w, hmd->Resolution.h);
  123.         cfg.OGL.Header.Multisample = 1;
  124. #if defined(OVR_OS_WIN32)
  125.         ovrHmd_AttachToWindow(hmd, info.info.win.window, nullptr, nullptr);
  126.         cfg.OGL.Window = info.info.win.window;
  127.         cfg.OGL.DC = 0;
  128. #elif defined(OVR_OS_LINUX)
  129.         cfg.OGL.Disp = info.info.x11.display;
  130.         cfg.OGL.Win = info.info.x11.window;
  131. #endif
  132.  
  133.         ovrEyeRenderDesc eyeRenderDesc[2];
  134.  
  135.         ovrHmd_ConfigureRendering(hmd, &cfg.Config, ovrDistortionCap_Chromatic | ovrDistortionCap_Vignette | ovrDistortionCap_TimeWarp | ovrDistortionCap_Overdrive, eyeFov, eyeRenderDesc);
  136.  
  137.         ovrHmd_SetEnabledCaps(hmd, ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction);
  138.  
  139.         ovrHmd_ConfigureTracking(hmd, ovrTrackingCap_Orientation | ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Position, 0);
  140.  
  141.         const GLchar *vertexShaderSource[] = {
  142.                 "#version 150\n"
  143.                 "uniform mat4 MVPMatrix;\n"
  144.                 "in vec3 position;\n"
  145.                 "void main()\n"
  146.                 "{\n"
  147.                 "    gl_Position = MVPMatrix * vec4(position, 1.0);\n"
  148.                 "}"
  149.         };
  150.  
  151.         GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  152.         glShaderSource(vertexShader, 1, vertexShaderSource, 0);
  153.         glCompileShader(vertexShader);
  154.  
  155.         const GLchar *fragmentShaderSource[] = {
  156.                 "#version 150\n"
  157.                 "out vec4 outputColor;\n"
  158.                 "void main()\n"
  159.                 "{\n"
  160.                 "    outputColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
  161.                 "}"
  162.         };
  163.  
  164.         GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  165.         glShaderSource(fragmentShader, 1, fragmentShaderSource, 0);
  166.         glCompileShader(fragmentShader);
  167.  
  168.         GLuint program = glCreateProgram();
  169.         glAttachShader(program, vertexShader);
  170.         glAttachShader(program, fragmentShader);
  171.         glLinkProgram(program);
  172.         glUseProgram(program);
  173.  
  174.         GLuint MVPMatrixLocation = glGetUniformLocation(program, "MVPMatrix");
  175.         GLuint positionLocation = glGetAttribLocation(program, "position");
  176.  
  177.         GLuint vertexArray;
  178.         glGenVertexArrays(1, &vertexArray);
  179.         glBindVertexArray(vertexArray);
  180.  
  181.         GLfloat vertices[] = {
  182.                 0.0f, 1.0f, -2.0f,
  183.                 -1.0f, -1.0f, -2.0f,
  184.                 1.0f, -1.0f, -2.0f
  185.         };
  186.  
  187.         GLuint positionBuffer;
  188.         glGenBuffers(1, &positionBuffer);
  189.         glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
  190.         glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  191.         glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
  192.         glEnableVertexAttribArray(positionLocation);
  193.  
  194.         glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
  195.         glClearDepth(1.0f);
  196.  
  197.         glDepthFunc(GL_LEQUAL);
  198.         glEnable(GL_DEPTH_TEST);
  199.  
  200.         bool running = true;
  201.  
  202.         while (running == true)
  203.         {
  204.                 SDL_Event event;
  205.  
  206.                 while (SDL_PollEvent(&event))
  207.                 {
  208.                         switch (event.type)
  209.                         {
  210.                         case SDL_QUIT:
  211.                                 running = false;
  212.                         case SDL_KEYDOWN:
  213.                                 ovrHmd_DismissHSWDisplay(hmd);
  214.  
  215.                                 switch (event.key.keysym.sym)
  216.                                 {
  217.                                 case SDLK_ESCAPE:
  218.                                         running = false;
  219.                                         break;
  220.                                 default:
  221.                                         break;
  222.                                 }
  223.                                 break;
  224.                         default:
  225.                                 break;
  226.                         }
  227.                 }
  228.  
  229.                 ovrFrameTiming frameTiming = ovrHmd_BeginFrame(hmd, 0);
  230.  
  231.                 glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
  232.  
  233.                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  234.  
  235.                 ovrPosef eyeRenderPose[2];
  236.  
  237.                 for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++)
  238.                 {
  239.                         ovrEyeType eye = hmd->EyeRenderOrder[eyeIndex];
  240.                         eyeRenderPose[eye] = ovrHmd_GetEyePose(hmd, eye);
  241.  
  242.                         Matrix4f MVPMatrix = Matrix4f(ovrMatrix4f_Projection(eyeRenderDesc[eye].Fov, 0.01f, 10000.0f, true)) * Matrix4f::Translation(eyeRenderDesc[eye].ViewAdjust) * Matrix4f(Quatf(eyeRenderPose[eye].Orientation).Inverted());
  243.  
  244.                         glUniformMatrix4fv(MVPMatrixLocation, 1, GL_FALSE, &MVPMatrix.Transposed().M[0][0]);
  245.  
  246.                         glViewport(eyeRenderViewport[eye].Pos.x, eyeRenderViewport[eye].Pos.y, eyeRenderViewport[eye].Size.w, eyeRenderViewport[eye].Size.h);
  247.  
  248.                         glDrawArrays(GL_TRIANGLES, 0, 3);
  249.                 }
  250.  
  251.                 glBindVertexArray(0);
  252.  
  253.                 ovrHmd_EndFrame(hmd, eyeRenderPose, &eyeTexture[0].Texture);
  254.  
  255.                 glBindVertexArray(vertexArray);
  256.         }
  257.  
  258.         glDeleteVertexArrays(1, &vertexArray);
  259.         glDeleteBuffers(1, &positionBuffer);
  260.  
  261.         glDeleteShader(vertexShader);
  262.         glDeleteShader(fragmentShader);
  263.         glDeleteProgram(program);
  264.  
  265.         glDeleteFramebuffers(1, &frameBuffer);
  266.         glDeleteTextures(1, &texture);
  267.         glDeleteRenderbuffers(1, &renderBuffer);
  268.  
  269.         SDL_GL_DeleteContext(context);
  270.  
  271.         SDL_DestroyWindow(window);
  272.  
  273.         ovrHmd_Destroy(hmd);
  274.  
  275.         ovr_Shutdown();
  276.  
  277.         SDL_Quit();
  278.  
  279.         return 0;
  280. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top