Guest User

Oculus Rift SDL2 OpenGL Demo

a guest
May 28th, 2014
2,470
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.51 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.     ovrHmdDesc hmdDesc;
  36.  
  37.     ovrHmd_GetDesc(hmd, &hmdDesc);
  38.  
  39.     if (debug == false)
  40.     {
  41.         x = hmdDesc.WindowsPos.x;
  42.         y = hmdDesc.WindowsPos.y;
  43.         flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
  44.     }
  45.  
  46.     int w = hmdDesc.Resolution.w;
  47.     int h = hmdDesc.Resolution.h;
  48.  
  49.     SDL_Window *window = SDL_CreateWindow("Oculus Rift SDL2 OpenGL Demo", x, y, w, h, flags);
  50.  
  51.     SDL_GLContext context = SDL_GL_CreateContext(window);
  52.  
  53.     glewExperimental = GL_TRUE;
  54.  
  55.     glewInit();
  56.  
  57.     Sizei recommendedTex0Size = ovrHmd_GetFovTextureSize(hmd, ovrEye_Left, hmdDesc.DefaultEyeFov[0], 1.0f);
  58.     Sizei recommendedTex1Size = ovrHmd_GetFovTextureSize(hmd, ovrEye_Right, hmdDesc.DefaultEyeFov[1], 1.0f);
  59.     Sizei renderTargetSize;
  60.     renderTargetSize.w = recommendedTex0Size.w + recommendedTex1Size.w;
  61.     renderTargetSize.h = max(recommendedTex0Size.h, recommendedTex1Size.h);
  62.  
  63.     GLuint frameBuffer;
  64.     glGenFramebuffers(1, &frameBuffer);
  65.    
  66.     GLuint texture;
  67.     glGenTextures(1, &texture);
  68.  
  69.     glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
  70.     glBindTexture(GL_TEXTURE_2D, texture);
  71.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, renderTargetSize.w, renderTargetSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  72.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  73.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  74.     glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);
  75.  
  76.     GLuint renderBuffer;
  77.     glGenRenderbuffers(1, &renderBuffer);
  78.     glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
  79.     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, renderTargetSize.w, renderTargetSize.h);
  80.     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
  81.  
  82.     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  83.     {
  84.         glDeleteFramebuffers(1, &frameBuffer);
  85.         glDeleteTextures(1, &texture);
  86.         glDeleteRenderbuffers(1, &renderBuffer);
  87.  
  88.         SDL_GL_DeleteContext(context);
  89.  
  90.         SDL_DestroyWindow(window);
  91.  
  92.         ovrHmd_Destroy(hmd);
  93.  
  94.         ovr_Shutdown();
  95.  
  96.         SDL_Quit();
  97.  
  98.         return 0;
  99.     }
  100.  
  101.     ovrFovPort eyeFov[2] = { hmdDesc.DefaultEyeFov[0], hmdDesc.DefaultEyeFov[1] };
  102.  
  103.     ovrRecti eyeRenderViewport[2];
  104.     eyeRenderViewport[0].Pos = Vector2i(0, 0);
  105.     eyeRenderViewport[0].Size = Sizei(renderTargetSize.w / 2, renderTargetSize.h);
  106.     eyeRenderViewport[1].Pos = Vector2i((renderTargetSize.w + 1) / 2, 0);
  107.     eyeRenderViewport[1].Size = eyeRenderViewport[0].Size;
  108.  
  109.     ovrGLTexture eyeTexture[2];
  110.     eyeTexture[0].OGL.Header.API = ovrRenderAPI_OpenGL;
  111.     eyeTexture[0].OGL.Header.TextureSize = renderTargetSize;
  112.     eyeTexture[0].OGL.Header.RenderViewport = eyeRenderViewport[0];
  113.     eyeTexture[0].OGL.TexId = texture;
  114.  
  115.     eyeTexture[1] = eyeTexture[0];
  116.     eyeTexture[1].OGL.Header.RenderViewport = eyeRenderViewport[1];
  117.  
  118.     SDL_SysWMinfo info;
  119.  
  120.     SDL_VERSION(&info.version);
  121.  
  122.     SDL_GetWindowWMInfo(window, &info);
  123.  
  124.     ovrGLConfig cfg;
  125.     cfg.OGL.Header.API = ovrRenderAPI_OpenGL;
  126.     cfg.OGL.Header.RTSize = Sizei(hmdDesc.Resolution.w, hmdDesc.Resolution.h);
  127.     cfg.OGL.Header.Multisample = 1;
  128. #if defined(OVR_OS_WIN32)
  129.     cfg.OGL.Window = info.info.win.window;
  130. #elif defined(OVR_OS_LINUX)
  131.     cfg.OGL.Disp = info.info.x11.display;
  132.     cfg.OGL.Win = info.info.x11.window;
  133. #endif
  134.  
  135.     ovrEyeRenderDesc eyeRenderDesc[2];
  136.  
  137.     ovrHmd_ConfigureRendering(hmd, &cfg.Config, ovrDistortionCap_Chromatic | ovrDistortionCap_TimeWarp, eyeFov, eyeRenderDesc);
  138.  
  139.     ovrHmd_SetEnabledCaps(hmd, ovrHmdCap_LowPersistence | ovrHmdCap_LatencyTest);
  140.  
  141.     ovrHmd_StartSensor(hmd, ovrSensorCap_Orientation | ovrSensorCap_YawCorrection | ovrSensorCap_Position, 0);
  142.  
  143.     const GLchar *vertexShaderSource[] = {
  144.         "#version 150\n"
  145.         "uniform mat4 MVPMatrix;\n"
  146.         "in vec3 position;\n"
  147.         "void main()\n"
  148.         "{\n"
  149.         "    gl_Position = MVPMatrix * vec4(position, 1.0);\n"
  150.         "}"
  151.     };
  152.  
  153.     GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  154.     glShaderSource(vertexShader, 1, vertexShaderSource, 0);
  155.     glCompileShader(vertexShader);
  156.  
  157.     const GLchar *fragmentShaderSource[] = {
  158.         "#version 150\n"
  159.         "out vec4 outputColor;\n"
  160.         "void main()\n"
  161.         "{\n"
  162.         "    outputColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
  163.         "}"
  164.     };
  165.  
  166.     GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  167.     glShaderSource(fragmentShader, 1, fragmentShaderSource, 0);
  168.     glCompileShader(fragmentShader);
  169.  
  170.     GLuint program = glCreateProgram();
  171.     glAttachShader(program, vertexShader);
  172.     glAttachShader(program, fragmentShader);
  173.     glLinkProgram(program);
  174.     glUseProgram(program);
  175.  
  176.     GLuint MVPMatrixLocation = glGetUniformLocation(program, "MVPMatrix");
  177.     GLuint positionLocation = glGetAttribLocation(program, "position");
  178.  
  179.     GLuint vertexArray;
  180.     glGenVertexArrays(1, &vertexArray);
  181.     glBindVertexArray(vertexArray);
  182.  
  183.     GLfloat vertices[] = {
  184.         0.0f, 1.0f, -2.0f,
  185.         -1.0f, -1.0f, -2.0f,
  186.         1.0f, -1.0f, -2.0f
  187.     };
  188.  
  189.     GLuint positionBuffer;
  190.     glGenBuffers(1, &positionBuffer);
  191.     glBindBuffer(GL_ARRAY_BUFFER, positionBuffer);
  192.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  193.     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
  194.     glEnableVertexAttribArray(positionLocation);
  195.  
  196.     glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
  197.     glClearDepth(1.0f);
  198.  
  199.     glDepthFunc(GL_LEQUAL);
  200.     glEnable(GL_DEPTH_TEST);
  201.  
  202.     bool running = true;
  203.  
  204.     while (running)
  205.     {
  206.         SDL_Event event;
  207.  
  208.         while (SDL_PollEvent(&event))
  209.         {
  210.             switch (event.type)
  211.             {
  212.             case SDL_QUIT:
  213.                 running = false;
  214.             case SDL_KEYDOWN:
  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 = hmdDesc.EyeRenderOrder[eyeIndex];
  240.             eyeRenderPose[eye] = ovrHmd_BeginEyeRender(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.             ovrHmd_EndEyeRender(hmd, eye, eyeRenderPose[eye], &eyeTexture[eye].Texture);
  251.         }
  252.  
  253.         ovrHmd_EndFrame(hmd);
  254.     }
  255.  
  256.     glDeleteVertexArrays(1, &vertexArray);
  257.     glDeleteBuffers(1, &positionBuffer);
  258.  
  259.     glDeleteShader(vertexShader);
  260.     glDeleteShader(fragmentShader);
  261.     glDeleteProgram(program);
  262.  
  263.     glDeleteFramebuffers(1, &frameBuffer);
  264.     glDeleteTextures(1, &texture);
  265.     glDeleteRenderbuffers(1, &renderBuffer);
  266.  
  267.     SDL_GL_DeleteContext(context);
  268.  
  269.     SDL_DestroyWindow(window);
  270.  
  271.     ovrHmd_Destroy(hmd);
  272.  
  273.     ovr_Shutdown();
  274.  
  275.     SDL_Quit();
  276.  
  277.     return 0;
  278. }
Advertisement
Add Comment
Please, Sign In to add comment