View difference between Paste ID: K8B7fK90 and b39QEsM1
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
}