Advertisement
Guest User

Oculus Rift SDL2 OpenGL Demo

a guest
Jul 26th, 2014
1,443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.64 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement