one except GL ES 2.x for now.legacy
@@ -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]]) | |||
@@ -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); | |||
@@ -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 <OpenGL/gl.h> | |||
# else | |||
@@ -25,8 +42,24 @@ | |||
# endif | |||
#elif defined HAVE_GLES_1X | |||
# 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 | |||
# include <GLES2/gl.h> | |||
# define glGenVertexArrays glGenVertexArraysOES | |||
# define glDeleteVertexArrays glDeleteVertexArraysOES | |||
# define glBindVertexArray glBindVertexArrayOES | |||
#endif | |||
#endif // __DH_LOLGL_H__ | |||
@@ -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); | |||
@@ -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; | |||
} | |||
@@ -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 | |||