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