diff --git a/configure.ac b/configure.ac index 41c6a6a7..7af17d00 100644 --- a/configure.ac +++ b/configure.ac @@ -93,6 +93,7 @@ PKG_CHECK_MODULES(GLES2, glesv2, AC_CHECK_LIB(GL, glLoadIdentity, [ac_cv_my_have_gl="yes" AC_DEFINE(HAVE_GL_1X, 1, Define to 1 if GL 1.x is available) + AC_DEFINE(HAVE_GL_2X, 1, Define to 1 if GL 2.x is available) GL_LIBS="-lGL"]) # FIXME: hackish if test "${ac_cv_my_have_gl}" = "no"; then AC_MSG_ERROR([[No OpenGL or OpenGL ES implementation found]]) diff --git a/src/debugsphere.cpp b/src/debugsphere.cpp index d1dfe580..c42fdaac 100644 --- a/src/debugsphere.cpp +++ b/src/debugsphere.cpp @@ -143,7 +143,9 @@ void DebugSphere::TickDraw(float deltams) } float a = sinf(data->time); +#if 0 float b = sinf(data->time * 0.5f); +#endif int const ndiv = 2; int const ntriangles = 20 * (1 << (ndiv * 2)) @@ -158,6 +160,7 @@ void DebugSphere::TickDraw(float deltams) data->DrawSphere(ndiv, t * (60.0f + 40.0f * a), vertex_parser, normal_parser); +#if 0 // FIXME: does not work with GLES2 glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); @@ -187,6 +190,7 @@ void DebugSphere::TickDraw(float deltams) glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); +#endif free(vertex); free(normal); diff --git a/src/lolgl.h b/src/lolgl.h index 04ea2beb..ef651ca0 100644 --- a/src/lolgl.h +++ b/src/lolgl.h @@ -16,7 +16,24 @@ #if !defined __DH_LOLGL_H__ #define __DH_LOLGL_H__ +#define GL_GLEXT_PROTOTYPES + +/* Only define one GL platform */ #if defined HAVE_GL_1X +# undef HAVE_GLES_1X +#endif +#if defined HAVE_GLES_2X +# undef HAVE_GL_1X +# undef HAVE_GLES_1X +#endif +#if defined HAVE_GL_2X +# undef HAVE_GL_1X +# undef HAVE_GLES_1X +# undef HAVE_GLES_2X +#endif + +/* Include GL */ +#if defined HAVE_GL_1X || defined HAVE_GL_2X # if defined __APPLE__ && defined __MACH__ # include # else @@ -25,8 +42,24 @@ # endif #elif defined HAVE_GLES_1X # include +# include +#elif defined HAVE_GLES_2X +# include +# include +#endif + +/* Redefine some function names */ +#if defined HAVE_GL_1X +# define glClearDepthf glClearDepth +#elif defined HAVE_GL_2X +# define glClearDepthf glClearDepth +#elif defined HAVE_GLES_1X +# define glGenVertexArrays glGenVertexArraysOES +# define glDeleteVertexArrays glDeleteVertexArraysOES #elif defined HAVE_GLES_2X -# include +# define glGenVertexArrays glGenVertexArraysOES +# define glDeleteVertexArrays glDeleteVertexArraysOES +# define glBindVertexArray glBindVertexArrayOES #endif #endif // __DH_LOLGL_H__ diff --git a/src/scene.cpp b/src/scene.cpp index 4e91c2c9..6f57b697 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -30,7 +30,7 @@ struct Tile int x, y, z, o; }; -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X extern Shader *stdshader; #endif extern mat4 model_matrix; @@ -56,7 +56,7 @@ private: int ntiles; float angle; -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X GLuint vao; #endif GLuint *bufs; @@ -81,7 +81,7 @@ Scene::Scene(float angle) data->bufs = 0; data->nbufs = 0; -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X glGenVertexArrays(1, &data->vao); #endif } @@ -91,7 +91,7 @@ Scene::~Scene() /* FIXME: this must be done while the GL context is still active. * Change the architecture to make sure of that. */ glDeleteBuffers(data->nbufs, data->bufs); -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X glDeleteVertexArrays(1, &data->vao); #endif free(data->bufs); @@ -153,17 +153,21 @@ void Scene::Render() // XXX: rename to Blit() model_matrix *= mat4::translate(-320.0f, -240.0f, 0.0f); // XXX: end of debug stuff -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X GLuint uni, attr_pos, attr_tex; uni = stdshader->GetUniformLocation("model_matrix"); attr_pos = stdshader->GetAttribLocation("in_Position"); attr_tex = stdshader->GetAttribLocation("in_TexCoord"); + stdshader->Bind(); glUniformMatrix4fv(uni, 1, GL_FALSE, &model_matrix[0][0]); + glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); +# if !defined HAVE_GLES_2X glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.01f); +# endif glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #else @@ -204,42 +208,66 @@ void Scene::Render() // XXX: rename to Blit() vertex + 18 * (j - i), texture + 12 * (j - i)); } -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X glBindVertexArray(data->vao); + glEnableVertexAttribArray(attr_pos); + glEnableVertexAttribArray(attr_tex); +#elif defined HAVE_GLES_2X + glEnableVertexAttribArray(attr_pos); + glEnableVertexAttribArray(attr_tex); #else glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); #endif +#if defined HAVE_GL_2X glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); glBufferData(GL_ARRAY_BUFFER, 18 * (n - i) * sizeof(GLfloat), vertex, GL_STATIC_DRAW); -#if LOL_EXPERIMENTAL glVertexAttribPointer(attr_pos, 3, GL_FLOAT, GL_FALSE, 0, 0); - glEnableVertexAttribArray(attr_pos); -#else +#elif defined HAVE_GLES_2X + glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); + glVertexAttribPointer(attr_pos, 3, GL_FLOAT, GL_FALSE, 0, vertex); +#elif defined HAVE_GL_1X + glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); + glBufferData(GL_ARRAY_BUFFER, 18 * (n - i) * sizeof(GLfloat), + vertex, GL_STATIC_DRAW); glVertexPointer(3, GL_FLOAT, 0, NULL); +#else + glVertexPointer(3, GL_FLOAT, 0, vertex); #endif +#if defined HAVE_GL_2X glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); glBufferData(GL_ARRAY_BUFFER, 12 * (n - i) * sizeof(GLfloat), texture, GL_STATIC_DRAW); -#if LOL_EXPERIMENTAL glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, 0); - glEnableVertexAttribArray(attr_tex); -#else +#elif defined HAVE_GLES_2X + glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); + glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, texture); +#elif defined HAVE_GL_1X + glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); + glBufferData(GL_ARRAY_BUFFER, 12 * (n - i) * sizeof(GLfloat), + texture, GL_STATIC_DRAW); glTexCoordPointer(2, GL_FLOAT, 0, NULL); +#else + glTexCoordPointer(2, GL_FLOAT, 0, texture); #endif -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X stdshader->Bind(); #endif Tiler::Bind(data->tiles[i].code); glDrawArrays(GL_TRIANGLES, 0, (n - i) * 6); -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X glBindVertexArray(0); + glDisableVertexAttribArray(attr_pos); + glDisableVertexAttribArray(attr_tex); +#elif defined HAVE_GLES_2X + glDisableVertexAttribArray(attr_pos); + glDisableVertexAttribArray(attr_tex); #else glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); diff --git a/src/shader.cpp b/src/shader.cpp index 38e6f0ec..92a35ea3 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -32,7 +32,9 @@ class ShaderData friend class Shader; private: +#if defined HAVE_GL_2X || defined HAVE_GLES_2X GLuint prog_id, vert_id, frag_id; +#endif uint32_t vert_crc, frag_crc; /* Global shader cache */ @@ -74,10 +76,13 @@ void Shader::Destroy(Shader *shader) Shader::Shader(char const *vert, char const *frag) : data(new ShaderData()) { +#if defined HAVE_GL_2X || defined HAVE_GLES_2X char buf[4096]; GLsizei len; +#endif data->vert_crc = Hash::Crc32(vert); +#if defined HAVE_GL_2X || defined HAVE_GLES_2X data->vert_id = glCreateShader(GL_VERTEX_SHADER); glShaderSource(data->vert_id, 1, &vert, NULL); glCompileShader(data->vert_id); @@ -85,8 +90,10 @@ Shader::Shader(char const *vert, char const *frag) glGetShaderInfoLog(data->vert_id, sizeof(buf), &len, buf); if (len > 0) fprintf(stderr, "ERROR: failed to compile vertex shader: %s", buf); +#endif data->frag_crc = Hash::Crc32(frag); +#if defined HAVE_GL_2X || defined HAVE_GLES_2X data->frag_id = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(data->frag_id, 1, &frag, NULL); glCompileShader(data->frag_id); @@ -101,30 +108,45 @@ Shader::Shader(char const *vert, char const *frag) glLinkProgram(data->prog_id); glValidateProgram(data->prog_id); +#endif } int Shader::GetAttribLocation(char const *attr) const { +#if defined HAVE_GL_2X || defined HAVE_GLES_2X return glGetAttribLocation(data->prog_id, attr); +#else + (void)attr; + return -1; +#endif } int Shader::GetUniformLocation(char const *uni) const { +#if defined HAVE_GL_2X || defined HAVE_GLES_2X return glGetUniformLocation(data->prog_id, uni); +#else + (void)uni; + return -1; +#endif } void Shader::Bind() const { +#if defined HAVE_GL_2X || defined HAVE_GLES_2X glUseProgram(data->prog_id); +#endif } Shader::~Shader() { +#if defined HAVE_GL_2X || defined HAVE_GLES_2X glDetachShader(data->prog_id, data->vert_id); glDetachShader(data->prog_id, data->frag_id); glDeleteShader(data->vert_id); glDeleteShader(data->frag_id); glDeleteProgram(data->prog_id); +#endif delete data; } diff --git a/src/video.cpp b/src/video.cpp index 6e0dd7d3..500b451d 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -23,12 +23,12 @@ #include "core.h" #include "lolgl.h" -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X Shader *stdshader; #endif mat4 proj_matrix, view_matrix, model_matrix; -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X static char const *vertexshader = "#version 130\n" "\n" @@ -60,6 +60,7 @@ static char const *fragmentshader = //" gl_FragColor = 0.5 * (texture2D(in_Texture, vec2(gl_TexCoord[0]))\n" //" + vec4(pass_Color, 1.0));\n" " gl_FragColor = texture2D(in_Texture, vec2(gl_TexCoord[0]));\n" + //" gl_FragColor = vec4(0.5, 1.0, 0.0, 0.5);\n" "}\n"; #endif @@ -73,13 +74,17 @@ void Video::Setup(int width, int height) glViewport(0, 0, width, height); glEnable(GL_TEXTURE_2D); +#if defined HAVE_GL_2X || defined HAVE_GLES_1X glShadeModel(GL_SMOOTH); +#endif glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClearDepth(1.0); + glClearDepthf(1.0); +#if defined HAVE_GL_2X || defined HAVE_GLES_1X glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X stdshader = Shader::Create(vertexshader, fragmentshader); #endif } @@ -126,7 +131,8 @@ void Video::SetFov(float theta) view_matrix = mat4(1.0f); -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X + stdshader->Bind(); /* Required on GLES 2.x? */ GLuint uni; uni = stdshader->GetUniformLocation("proj_matrix"); glUniformMatrix4fv(uni, 1, GL_FALSE, &proj_matrix[0][0]); @@ -162,7 +168,7 @@ void Video::Clear() void Video::Destroy() { -#if LOL_EXPERIMENTAL +#if defined HAVE_GL_2X || defined HAVE_GLES_2X Shader::Destroy(stdshader); #endif } @@ -173,7 +179,9 @@ void Video::Capture(uint32_t *buffer) glGetIntegerv(GL_VIEWPORT, v); int width = v[2], height = v[3]; +#if defined HAVE_GL_1X || defined HAVE_GL_2X glPixelStorei(GL_PACK_ROW_LENGTH, 0); +#endif glPixelStorei(GL_PACK_ALIGNMENT, 1); #if defined GL_BGRA