SHOW:
|
|
- or go back to the newest paste.
| 1 | #define GLEW_STATIC | |
| 2 | #include "GL/glew.h" | |
| 3 | // Uncomment your platform | |
| 4 | - | #define OVR_OS_WIN32 |
| 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); |
| 67 | + | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, renderTargetSize.w, renderTargetSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
| 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); |
| 125 | + | ovrHmd_AttachToWindow(hmd, info.info.win.window, NULL, NULL); |
| 126 | cfg.OGL.Window = info.info.win.window; | |
| 127 | - | cfg.OGL.DC = 0; |
| 127 | + | cfg.OGL.DC = NULL; |
| 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); |
| 152 | + | glShaderSource(vertexShader, 1, vertexShaderSource, NULL); |
| 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); |
| 165 | + | glShaderSource(fragmentShader, 1, fragmentShaderSource, NULL); |
| 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 | break; | |
| 213 | case SDL_KEYDOWN: | |
| 214 | ovrHmd_DismissHSWDisplay(hmd); | |
| 215 | ||
| 216 | switch (event.key.keysym.sym) | |
| 217 | {
| |
| 218 | case SDLK_ESCAPE: | |
| 219 | running = false; | |
| 220 | break; | |
| 221 | default: | |
| 222 | break; | |
| 223 | } | |
| 224 | break; | |
| 225 | default: | |
| 226 | break; | |
| 227 | } | |
| 228 | } | |
| 229 | ||
| 230 | ovrFrameTiming frameTiming = ovrHmd_BeginFrame(hmd, 0); | |
| 231 | ||
| 232 | glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); | |
| 233 | ||
| 234 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
| 235 | ||
| 236 | ovrPosef eyeRenderPose[2]; | |
| 237 | ||
| 238 | for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) | |
| 239 | {
| |
| 240 | ovrEyeType eye = hmd->EyeRenderOrder[eyeIndex]; | |
| 241 | eyeRenderPose[eye] = ovrHmd_GetEyePose(hmd, eye); | |
| 242 | ||
| 243 | Matrix4f MVPMatrix = Matrix4f(ovrMatrix4f_Projection(eyeRenderDesc[eye].Fov, 0.01f, 10000.0f, true)) * Matrix4f::Translation(eyeRenderDesc[eye].ViewAdjust) * Matrix4f(Quatf(eyeRenderPose[eye].Orientation).Inverted()); | |
| 244 | ||
| 245 | glUniformMatrix4fv(MVPMatrixLocation, 1, GL_FALSE, &MVPMatrix.Transposed().M[0][0]); | |
| 246 | ||
| 247 | glViewport(eyeRenderViewport[eye].Pos.x, eyeRenderViewport[eye].Pos.y, eyeRenderViewport[eye].Size.w, eyeRenderViewport[eye].Size.h); | |
| 248 | ||
| 249 | glDrawArrays(GL_TRIANGLES, 0, 3); | |
| 250 | } | |
| 251 | ||
| 252 | glBindVertexArray(0); | |
| 253 | ||
| 254 | ovrHmd_EndFrame(hmd, eyeRenderPose, &eyeTexture[0].Texture); | |
| 255 | ||
| 256 | glBindVertexArray(vertexArray); | |
| 257 | } | |
| 258 | ||
| 259 | glDeleteVertexArrays(1, &vertexArray); | |
| 260 | glDeleteBuffers(1, &positionBuffer); | |
| 261 | ||
| 262 | glDeleteShader(vertexShader); | |
| 263 | glDeleteShader(fragmentShader); | |
| 264 | glDeleteProgram(program); | |
| 265 | ||
| 266 | glDeleteFramebuffers(1, &frameBuffer); | |
| 267 | glDeleteTextures(1, &texture); | |
| 268 | glDeleteRenderbuffers(1, &renderBuffer); | |
| 269 | ||
| 270 | SDL_GL_DeleteContext(context); | |
| 271 | ||
| 272 | SDL_DestroyWindow(window); | |
| 273 | ||
| 274 | ovrHmd_Destroy(hmd); | |
| 275 | ||
| 276 | ovr_Shutdown(); | |
| 277 | ||
| 278 | SDL_Quit(); | |
| 279 | ||
| 280 | return 0; | |
| 281 | } |