| @@ -130,6 +130,16 @@ fi | |||||
| AM_CONDITIONAL(USE_SDL, test "${ac_cv_my_have_sdl}" = "yes") | AM_CONDITIONAL(USE_SDL, test "${ac_cv_my_have_sdl}" = "yes") | ||||
| dnl Use EGL? | |||||
| ac_cv_my_have_egl="no" | |||||
| PKG_CHECK_MODULES(EGL, egl, [ac_cv_my_have_egl="yes"], [:]) | |||||
| if test "${ac_cv_my_have_egl}" != "no"; then | |||||
| AC_DEFINE(USE_EGL, 1, Define to 1 to use libegl) | |||||
| EGL_LIBS="${EGL_LIBS} -lX11" | |||||
| fi | |||||
| AM_CONDITIONAL(USE_EGL, test "${ac_cv_my_have_egl}" != "no") | |||||
| dnl Use libcaca? (required for font generation) | dnl Use libcaca? (required for font generation) | ||||
| ac_cv_my_have_caca="no" | ac_cv_my_have_caca="no" | ||||
| PKG_CHECK_MODULES(CACA, caca >= 0.99.beta17, [ac_cv_my_have_caca="yes"], [:]) | PKG_CHECK_MODULES(CACA, caca >= 0.99.beta17, [ac_cv_my_have_caca="yes"], [:]) | ||||
| @@ -164,8 +174,8 @@ AM_CONDITIONAL(USE_CPPUNIT, test "$CPPUNIT" = "yes") | |||||
| # How to use the Lol Engine inside this tree | # How to use the Lol Engine inside this tree | ||||
| LOL_CFLAGS="$LOL_CFLAGS -I \$(top_srcdir)/src $SDL_CFLAGS" | |||||
| LOL_LIBS="$LOL_LIBS $SDL_LIBS" | |||||
| LOL_CFLAGS="$LOL_CFLAGS -I \$(top_srcdir)/src $SDL_CFLAGS $EGL_CFLAGS" | |||||
| LOL_LIBS="$LOL_LIBS $SDL_LIBS $EGL_LIBS" | |||||
| AC_SUBST(MATH_LIBS) | AC_SUBST(MATH_LIBS) | ||||
| AC_SUBST(LOL_CFLAGS) | AC_SUBST(LOL_CFLAGS) | ||||
| @@ -13,6 +13,8 @@ liblol_a_SOURCES = \ | |||||
| \ | \ | ||||
| sdlapp.cpp sdlapp.h sdlinput.cpp sdlinput.h \ | sdlapp.cpp sdlapp.h sdlinput.cpp sdlinput.h \ | ||||
| \ | \ | ||||
| eglapp.cpp eglapp.h \ | |||||
| \ | |||||
| debugfps.cpp debugfps.h debugsphere.cpp debugsphere.h \ | debugfps.cpp debugfps.h debugsphere.cpp debugsphere.h \ | ||||
| debugrecord.cpp debugrecord.h debugstats.cpp debugstats.h | debugrecord.cpp debugrecord.h debugstats.cpp debugstats.h | ||||
| liblol_a_CPPFLAGS = @LOL_CFLAGS@ | liblol_a_CPPFLAGS = @LOL_CFLAGS@ | ||||
| @@ -0,0 +1,190 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
| // | |||||
| #if defined HAVE_CONFIG_H | |||||
| # include "config.h" | |||||
| #endif | |||||
| #include <cstdio> | |||||
| #if defined USE_EGL | |||||
| # define Font Font_Diverted | |||||
| # include <X11/Xlib.h> | |||||
| # include <X11/Xatom.h> | |||||
| # include <X11/Xutil.h> | |||||
| # undef Font | |||||
| # include <EGL/egl.h> | |||||
| #endif | |||||
| #include "core.h" | |||||
| #include "eglapp.h" | |||||
| /* | |||||
| * EGL App implementation class | |||||
| */ | |||||
| class EglAppData | |||||
| { | |||||
| friend class EglApp; | |||||
| private: | |||||
| #if defined USE_EGL | |||||
| Display *dpy; | |||||
| Window win; | |||||
| EGLDisplay egl_dpy; | |||||
| EGLContext egl_ctx; | |||||
| EGLSurface egl_surf; | |||||
| #endif | |||||
| }; | |||||
| /* | |||||
| * Public EglApp class | |||||
| */ | |||||
| EglApp::EglApp(char const *title, vec2i res, float fps) : | |||||
| data(new EglAppData()) | |||||
| { | |||||
| #if defined USE_EGL | |||||
| data->dpy = XOpenDisplay(NULL); | |||||
| if (data->dpy == NULL) | |||||
| { | |||||
| fprintf(stderr, "Cannot connect to X server\n"); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| Window root = DefaultRootWindow(data->dpy); | |||||
| XSetWindowAttributes swa; | |||||
| swa.event_mask = ExposureMask | PointerMotionMask | KeyPressMask; | |||||
| data->win = XCreateWindow(data->dpy, root, 0, 0, res.x, res.y, 0, | |||||
| CopyFromParent, InputOutput, | |||||
| CopyFromParent, CWEventMask, &swa); | |||||
| XSetWindowAttributes xattr; | |||||
| xattr.override_redirect = False; | |||||
| XChangeWindowAttributes(data->dpy, data->win, CWOverrideRedirect, &xattr); | |||||
| XWMHints hints; | |||||
| hints.flags = InputHint; | |||||
| hints.input = True; | |||||
| XSetWMHints(data->dpy, data->win, &hints); | |||||
| XMapWindow(data->dpy, data->win); | |||||
| XStoreName(data->dpy, data->win, title); | |||||
| data->egl_dpy = eglGetDisplay((EGLNativeDisplayType)data->dpy); | |||||
| if (data->egl_dpy == EGL_NO_DISPLAY) | |||||
| { | |||||
| fprintf(stderr, "Cannot get EGL display\n"); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| if (!eglInitialize(data->egl_dpy, NULL, NULL)) | |||||
| { | |||||
| fprintf(stderr, "Cannot initialize EGL\n"); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| EGLint attr[] = | |||||
| { | |||||
| EGL_BUFFER_SIZE, 16, | |||||
| EGL_RENDERABLE_TYPE, | |||||
| #if defined HAVE_GLES_1X | |||||
| EGL_OPENGL_ES_BIT, | |||||
| #elif defined HAVE_GLES_2X | |||||
| EGL_OPENGL_ES2_BIT, | |||||
| #endif | |||||
| EGL_NONE | |||||
| }; | |||||
| EGLConfig ecfg; | |||||
| EGLint num_config; | |||||
| if (!eglChooseConfig(data->egl_dpy, attr, &ecfg, 1, &num_config)) | |||||
| { | |||||
| fprintf(stderr, "Cannot choose EGL config (%i)\n", eglGetError()); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| if (num_config != 1) | |||||
| { | |||||
| fprintf(stderr, "Cannot choose between %i EGL configs\n", num_config); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| data->egl_surf = eglCreateWindowSurface(data->egl_dpy, ecfg, | |||||
| data->win, NULL); | |||||
| if (data->egl_surf == EGL_NO_SURFACE) | |||||
| { | |||||
| fprintf(stderr, "Cannot create EGL surface (%i)\n", eglGetError()); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| EGLint ctxattr[] = | |||||
| { | |||||
| #if defined HAVE_GLES_1X | |||||
| EGL_CONTEXT_CLIENT_VERSION, 1, | |||||
| #elif defined HAVE_GLES_2X | |||||
| EGL_CONTEXT_CLIENT_VERSION, 2, | |||||
| #endif | |||||
| EGL_NONE | |||||
| }; | |||||
| data->egl_ctx = eglCreateContext(data->egl_dpy, ecfg, | |||||
| EGL_NO_CONTEXT, ctxattr); | |||||
| if (data->egl_ctx == EGL_NO_CONTEXT) | |||||
| { | |||||
| fprintf(stderr, "Cannot create EGL context (%i)\n", eglGetError()); | |||||
| exit(EXIT_FAILURE); | |||||
| } | |||||
| eglMakeCurrent(data->egl_dpy, data->egl_surf, | |||||
| data->egl_surf, data->egl_ctx); | |||||
| XWindowAttributes gwa; | |||||
| XGetWindowAttributes(data->dpy, data->win, &gwa); | |||||
| /* Initialise everything */ | |||||
| Ticker::Setup(fps); | |||||
| Video::Setup(gwa.width, gwa.height); | |||||
| Audio::Setup(2); | |||||
| #endif | |||||
| } | |||||
| void EglApp::Run() | |||||
| { | |||||
| while (!Ticker::Finished()) | |||||
| { | |||||
| /* Tick the game */ | |||||
| Ticker::TickGame(); | |||||
| /* Tick the renderer, show the frame and clamp to desired framerate. */ | |||||
| Ticker::TickDraw(); | |||||
| #if defined USE_EGL | |||||
| eglSwapBuffers(data->egl_dpy, data->egl_surf); | |||||
| #endif | |||||
| Ticker::ClampFps(); | |||||
| } | |||||
| } | |||||
| EglApp::~EglApp() | |||||
| { | |||||
| #if defined USE_EGL | |||||
| eglDestroyContext(data->egl_dpy, data->egl_ctx); | |||||
| eglDestroySurface(data->egl_dpy, data->egl_surf); | |||||
| eglTerminate(data->egl_dpy); | |||||
| XDestroyWindow(data->dpy, data->win); | |||||
| XCloseDisplay(data->dpy); | |||||
| #endif | |||||
| free(data); | |||||
| } | |||||
| @@ -0,0 +1,36 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||||
| // This program is free software; you can redistribute it and/or | |||||
| // modify it under the terms of the Do What The Fuck You Want To | |||||
| // Public License, Version 2, as published by Sam Hocevar. See | |||||
| // http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||||
| // | |||||
| // | |||||
| // The EglApp class | |||||
| // ---------------- | |||||
| // | |||||
| #if !defined __DH_EGLAPP_H__ | |||||
| #define __DH_EGLAPP_H__ | |||||
| #include "matrix.h" | |||||
| class EglAppData; | |||||
| class EglApp | |||||
| { | |||||
| public: | |||||
| EglApp(char const *title, vec2i res, float fps); | |||||
| virtual ~EglApp(); | |||||
| void Run(); | |||||
| private: | |||||
| EglAppData *data; | |||||
| }; | |||||
| #endif // __DH_EGLAPP_H__ | |||||
| @@ -30,11 +30,17 @@ mat4 proj_matrix, view_matrix, model_matrix; | |||||
| #if defined HAVE_GL_2X || defined HAVE_GLES_2X | #if defined HAVE_GL_2X || defined HAVE_GLES_2X | ||||
| static char const *vertexshader = | static char const *vertexshader = | ||||
| #if defined HAVE_GLES_2X | |||||
| "attribute vec3 in_Position;\n" | |||||
| "attribute vec2 in_TexCoord;\n" | |||||
| "varying vec2 pass_TexCoord;\n" | |||||
| #else | |||||
| "#version 130\n" | "#version 130\n" | ||||
| "\n" | "\n" | ||||
| "in vec3 in_Position;\n" | "in vec3 in_Position;\n" | ||||
| //"in vec3 in_Color;\n" | |||||
| "in vec2 in_TexCoord;\n" | "in vec2 in_TexCoord;\n" | ||||
| #endif | |||||
| //"in vec3 in_Color;\n" | |||||
| //"out vec3 pass_Color;\n" | //"out vec3 pass_Color;\n" | ||||
| "uniform mat4 proj_matrix;\n" | "uniform mat4 proj_matrix;\n" | ||||
| "uniform mat4 view_matrix;\n" | "uniform mat4 view_matrix;\n" | ||||
| @@ -44,8 +50,12 @@ static char const *vertexshader = | |||||
| "{\n" | "{\n" | ||||
| " gl_Position = proj_matrix * view_matrix * model_matrix" | " gl_Position = proj_matrix * view_matrix * model_matrix" | ||||
| " * vec4(in_Position, 1.0f);\n" | " * vec4(in_Position, 1.0f);\n" | ||||
| " gl_TexCoord[0] = vec4(in_TexCoord, 0.0, 0.0);\n" | |||||
| //" pass_Color = in_Color;\n" | //" pass_Color = in_Color;\n" | ||||
| #if defined HAVE_GLES_2X | |||||
| " pass_TexCoord = in_TexCoord;\n" | |||||
| #else | |||||
| " gl_TexCoord[0] = vec4(in_TexCoord, 0.0, 0.0);\n" | |||||
| #endif | |||||
| "}\n"; | "}\n"; | ||||
| static char const *fragmentshader = | static char const *fragmentshader = | ||||
| @@ -54,13 +64,20 @@ static char const *fragmentshader = | |||||
| "uniform sampler2D in_Texture;\n" | "uniform sampler2D in_Texture;\n" | ||||
| //"in vec3 pass_Color;\n" | //"in vec3 pass_Color;\n" | ||||
| //"out vec4 out_Color;\n" | //"out vec4 out_Color;\n" | ||||
| #if defined HAVE_GLES_2X | |||||
| "varying vec2 pass_TexCoord;\n" | |||||
| #endif | |||||
| "\n" | "\n" | ||||
| "void main()\n" | "void main()\n" | ||||
| "{\n" | "{\n" | ||||
| //" 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" | ||||
| #if defined HAVE_GLES_2X | |||||
| " gl_FragColor = vec4(0.5, 1.0, 0.0, 0.5);\n" | |||||
| #else | |||||
| " 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" | |||||
| #endif | |||||
| //" gl_FragColor = texture2D(in_Texture, pass_TexCoord);\n" | |||||
| "}\n"; | "}\n"; | ||||
| #endif | #endif | ||||