18 #include <emscripten/emscripten.h>
23 #if defined(__IPHONEOS__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__NACL__) \
24 || defined(__WINDOWS__) || defined(__LINUX__)
25 #define HAVE_OPENGLES2
32 typedef struct GLES2_Context
34 #define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
35 #include "../src/render/opengles2/SDL_gles2funcs.h"
42 static int depth = 16;
43 static GLES2_Context
ctx;
45 static int LoadContext(GLES2_Context *
data)
47 #if SDL_VIDEO_DRIVER_UIKIT
48 #define __SDL_NOGETPROCADDR__
49 #elif SDL_VIDEO_DRIVER_ANDROID
50 #define __SDL_NOGETPROCADDR__
51 #elif SDL_VIDEO_DRIVER_PANDORA
52 #define __SDL_NOGETPROCADDR__
55 #if defined __SDL_NOGETPROCADDR__
56 #define SDL_PROC(ret,func,params) data->func=func;
58 #define SDL_PROC(ret,func,params) \
60 data->func = SDL_GL_GetProcAddress(#func); \
61 if ( ! data->func ) { \
62 return SDL_SetError("Couldn't load GLES2 function %s: %s", #func, SDL_GetError()); \
67 #include "../src/render/opengles2/SDL_gles2funcs.h"
95 GLenum glError = ctx.glGetError(); \
96 if(glError != GL_NO_ERROR) { \
97 SDL_Log("glGetError() = %i (0x%.8x) at line %i\n", glError, glError, __LINE__); \
107 rotate_matrix(
float angle,
float x,
float y,
float z,
float *
r)
109 float radians,
c,
s, c1, u[3],
length;
112 radians = (float)(angle * M_PI) / 180.0f;
119 length = (float)
SDL_sqrt(x * x + y * y + z * z);
125 for (i = 0; i < 16; i++) {
131 for (i = 0; i < 3; i++) {
132 r[i * 4 + (i + 1) % 3] = u[(i + 2) % 3] *
s;
133 r[i * 4 + (i + 2) % 3] = -u[(i + 1) % 3] *
s;
136 for (i = 0; i < 3; i++) {
137 for (j = 0; j < 3; j++) {
138 r[i * 4 +
j] += c1 * u[
i] * u[
j] + (i == j ? c : 0.0f);
147 perspective_matrix(
float fovy,
float aspect,
float znear,
float zfar,
float *r)
154 for (i = 0; i < 16; i++) {
160 r[10] = (znear + zfar) / (znear - zfar);
162 r[14] = (2.0f * znear * zfar) / (znear - zfar);
171 multiply_matrix(
float *lhs,
float *rhs,
float *r)
176 for (i = 0; i < 4; i++) {
177 for (j = 0; j < 4; j++) {
178 tmp[j * 4 +
i] = 0.0;
180 for (k = 0; k < 4; k++) {
181 tmp[j * 4 +
i] += lhs[k * 4 +
i] * rhs[j * 4 +
k];
186 for (i = 0; i < 16; i++) {
207 *shader = GL_CHECK(ctx.glCreateShader(shader_type));
211 GL_CHECK(ctx.glShaderSource(*shader, 1, shaders,
NULL));
217 GL_CHECK(ctx.glCompileShader(*shader));
222 ctx.glGetProgramInfoLog(*shader,
sizeof(buffer), &length, &buffer[0]);
224 SDL_Log(
"Shader compilation failed: %s", buffer);fflush(stderr);
231 const float _vertices[] =
289 const float _colors[] =
347 const char* _shader_vert_src =
348 " attribute vec4 av4position; "
349 " attribute vec3 av3color; "
350 " uniform mat4 mvp; "
351 " varying vec3 vv3color; "
353 " vv3color = av3color; "
354 " gl_Position = mvp * av4position; "
357 const char* _shader_frag_src =
358 " precision lowp float; "
359 " varying vec3 vv3color; "
361 " gl_FragColor = vec4(vv3color, 1.0); "
364 typedef struct shader_data
366 GLuint shader_program, shader_frag, shader_vert;
369 GLint attr_color, attr_mvp;
371 int angle_x, angle_y, angle_z;
378 float matrix_rotate[16], matrix_modelview[16], matrix_perspective[16], matrix_mvp[16];
384 rotate_matrix((
float)data->angle_x, 1.0f, 0.0f, 0.0f, matrix_modelview);
385 rotate_matrix((
float)data->angle_y, 0.0f, 1.0f, 0.0f, matrix_rotate);
387 multiply_matrix(matrix_rotate, matrix_modelview, matrix_modelview);
389 rotate_matrix((
float)data->angle_z, 0.0f, 1.0f, 0.0f, matrix_rotate);
391 multiply_matrix(matrix_rotate, matrix_modelview, matrix_modelview);
394 matrix_modelview[14] -= 2.5;
396 perspective_matrix(45.0f, (
float)width/height, 0.01f, 100.0f, matrix_perspective);
397 multiply_matrix(matrix_perspective, matrix_modelview, matrix_mvp);
399 GL_CHECK(ctx.glUniformMatrix4fv(data->attr_mvp, 1,
GL_FALSE, matrix_mvp));
405 if(data->angle_x >= 360) data->angle_x -= 360;
406 if(data->angle_x < 0) data->angle_x += 360;
407 if(data->angle_y >= 360) data->angle_y -= 360;
408 if(data->angle_y < 0) data->angle_y += 360;
409 if(data->angle_z >= 360) data->angle_z -= 360;
410 if(data->angle_z < 0) data->angle_z += 360;
429 switch (event.
type) {
443 ctx.glViewport(0, 0, w, h);
444 state->
window_w =
event.window.data1;
445 state->
window_h =
event.window.data2;
470 #ifdef __EMSCRIPTEN__
472 emscripten_cancel_main_loop();
478 main(
int argc,
char *argv[])
497 for (i = 1; i < argc;) {
521 SDL_Log (
"Usage: %s %s [--fsaa] [--accel] [--zdepth %%d]\n", argv[0],
566 if (LoadContext(&ctx) < 0) {
567 SDL_Log(
"Could not load GLES2 functions\n");
591 SDL_Log(
"SDL_GL_RED_SIZE: requested %d, got %d\n", 5, value);
593 SDL_Log(
"Failed to get SDL_GL_RED_SIZE: %s\n",
598 SDL_Log(
"SDL_GL_GREEN_SIZE: requested %d, got %d\n", 5, value);
600 SDL_Log(
"Failed to get SDL_GL_GREEN_SIZE: %s\n",
605 SDL_Log(
"SDL_GL_BLUE_SIZE: requested %d, got %d\n", 5, value);
607 SDL_Log(
"Failed to get SDL_GL_BLUE_SIZE: %s\n",
612 SDL_Log(
"SDL_GL_DEPTH_SIZE: requested %d, got %d\n",
depth, value);
614 SDL_Log(
"Failed to get SDL_GL_DEPTH_SIZE: %s\n",
620 SDL_Log(
"SDL_GL_MULTISAMPLEBUFFERS: requested 1, got %d\n", value);
622 SDL_Log(
"Failed to get SDL_GL_MULTISAMPLEBUFFERS: %s\n",
627 SDL_Log(
"SDL_GL_MULTISAMPLESAMPLES: requested %d, got %d\n", fsaa,
630 SDL_Log(
"Failed to get SDL_GL_MULTISAMPLESAMPLES: %s\n",
637 SDL_Log(
"SDL_GL_ACCELERATED_VISUAL: requested 1, got %d\n", value);
639 SDL_Log(
"Failed to get SDL_GL_ACCELERATED_VISUAL: %s\n",
658 ctx.glViewport(0, 0, w, h);
661 data->angle_x = 0; data->angle_y = 0; data->angle_z = 0;
668 data->shader_program = GL_CHECK(ctx.glCreateProgram());
671 GL_CHECK(ctx.glAttachShader(data->shader_program, data->shader_vert));
672 GL_CHECK(ctx.glAttachShader(data->shader_program, data->shader_frag));
673 GL_CHECK(ctx.glLinkProgram(data->shader_program));
676 data->attr_position = GL_CHECK(ctx.glGetAttribLocation(data->shader_program,
"av4position"));
677 data->attr_color = GL_CHECK(ctx.glGetAttribLocation(data->shader_program,
"av3color"));
680 data->attr_mvp = GL_CHECK(ctx.glGetUniformLocation(data->shader_program,
"mvp"));
682 GL_CHECK(ctx.glUseProgram(data->shader_program));
685 GL_CHECK(ctx.glEnableVertexAttribArray(data->attr_position));
686 GL_CHECK(ctx.glEnableVertexAttribArray(data->attr_color));
689 GL_CHECK(ctx.glVertexAttribPointer(data->attr_position, 3,
GL_FLOAT,
GL_FALSE, 0, _vertices));
690 GL_CHECK(ctx.glVertexAttribPointer(data->attr_color, 3,
GL_FLOAT,
GL_FALSE, 0, _colors));
701 #ifdef __EMSCRIPTEN__
702 emscripten_set_main_loop(
loop, 0, 1);
712 SDL_Log(
"%2.2f frames per second\n",
713 ((
double) frames * 1000) / (now - then));
715 #if !defined(__ANDROID__) && !defined(__NACL__)
726 SDL_Log(
"No OpenGL ES support on this system\n");