diff --git a/src/core_lua.c b/src/core_lua.c index d14aae74b254d3f425c86d7893bcc9cfdb414663..bc0480a37ee48648dcf7ab2298da2bf04ae38248 100644 --- a/src/core_lua.c +++ b/src/core_lua.c @@ -1269,8 +1269,8 @@ static int gl_fbo_toscreen(lua_State *L) } if (lua_isuserdata(L, 6)) { - GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{program}", 6); - useShader(*s, 0, 0, w, h, r, g, b, a); + shader_type *s = (shader_type*)auxiliar_checkclass(L, "gl{program}", 6); + useShader(s, 0, 0, w, h, r, g, b, a); } glDisable(GL_BLEND); diff --git a/src/main.c b/src/main.c index 5089cd5ba0de6f7296c993914ffd53f3e3735f0c..2727f187fbb13448842e1c9ead8063b9fa6d453f 100644 --- a/src/main.c +++ b/src/main.c @@ -47,6 +47,7 @@ #define HEIGHT 600 lua_State *L = NULL; +bool no_debug = FALSE; int current_mousehandler = LUA_NOREF; int current_keyhandler = LUA_NOREF; int current_game = LUA_NOREF; @@ -94,6 +95,12 @@ int docall (lua_State *L, int narg, int nret) return status; } +/* No print function, does .. nothing */ +int noprint(lua_State *L) +{ + return 0; +} + void display_utime() { struct timeval tv; @@ -614,6 +621,13 @@ void boot_lua(int state, bool rebooting, int argc, char *argv[]) luaopen_shaders(L); luaopen_serial(L); + // Override "print" if requested + if (no_debug) + { + lua_pushcfunction(L, noprint); + lua_setglobal(L, "print"); + } + // Make the uids repository lua_newtable(L); lua_setglobal(L, "__uids"); @@ -698,6 +712,7 @@ int main(int argc, char *argv[]) if (!strncmp(arg, "-u", 2)) reboot_name = strdup(arg+2); if (!strncmp(arg, "-E", 2)) reboot_einfo = strdup(arg+2); if (!strncmp(arg, "-n", 2)) reboot_new = TRUE; + if (!strncmp(arg, "--no-debug", 10)) no_debug = TRUE; } boot_lua(1, FALSE, argc, argv); diff --git a/src/map.c b/src/map.c index f4f3e2abe6e8fbb4267a9de0e1697fe3cd95cca0..6dbc5252cc8bff54ae49b454f41812578f31d74d 100644 --- a/src/map.c +++ b/src/map.c @@ -55,7 +55,7 @@ static int map_object_new(lua_State *L) obj->dx = luaL_checknumber(L, 6); obj->dy = luaL_checknumber(L, 7); obj->scale = luaL_checknumber(L, 8); - obj->shader = 0; + obj->shader = NULL; obj->tint_r = obj->tint_g = obj->tint_b = 1; for (i = 0; i < nb_textures; i++) { @@ -116,8 +116,8 @@ static int map_object_texture(lua_State *L) static int map_object_shader(lua_State *L) { map_object *obj = (map_object*)auxiliar_checkclass(L, "core{mapobj}", 1); - GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{program}", 2); - obj->shader = *s; + shader_type *s = (shader_type*)auxiliar_checkclass(L, "gl{program}", 2); + obj->shader = s; return 0; } diff --git a/src/map.h b/src/map.h index 2a7d876526be3900fb444a97955346709aedfdad..aaf07c2dc772f447466f2e394c59f1abfc9ebc7d 100644 --- a/src/map.h +++ b/src/map.h @@ -22,13 +22,14 @@ #define _MAP_H_ #include "tgl.h" +#include "useshader.h" typedef struct { int nb_textures; int *textures_ref; GLuint *textures; bool *textures_is3d; - GLuint shader; + shader_type *shader; float dx, dy, scale; float tint_r; float tint_g; diff --git a/src/shaders.c b/src/shaders.c index 137b0c558ab9b167e446742b87306c593d133ec7..d4a60e48c4ff7db4dea49e74fbcb3f1155495200 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -26,31 +26,33 @@ #include "types.h" #include "music.h" #include "script.h" +#include "useshader.h" #include "shaders.h" #include "libtcod.h" bool shaders_active = TRUE; -void useShader(GLuint p, int x, int y, int w, int h, float r, float g, float b, float a) +void useShader(shader_type *p, int x, int y, int w, int h, float r, float g, float b, float a) { - glUseProgramObjectARB(p); + glUseProgramObjectARB(p->shader); + printf("Using shader %d at %dx%d (%dx%d), %f;%f;%f;%f\n", p->shader,x,y,w,h,r,g,b,a); GLfloat t = SDL_GetTicks(); - glUniform1fvARB(glGetUniformLocationARB(p, "tick"), 1, &t); + glUniform1fvARB(p->p_tick, 1, &t); GLfloat d[4]; d[0] = r; d[1] = g; d[2] = b; d[3] = a; - glUniform4fvARB(glGetUniformLocationARB(p, "displayColor"), 1, d); + glUniform4fvARB(p->p_color, 1, d); GLfloat c[2]; c[0] = x; c[1] = y; - glUniform2fvARB(glGetUniformLocationARB(p, "mapCoord"), 1, c); + glUniform2fvARB(p->p_mapcoord, 1, c); c[0] = w; c[1] = h; - glUniform2fvARB(glGetUniformLocationARB(p, "texSize"), 1, c); + glUniform2fvARB(p->p_texsize, 1, c); } static GLuint loadShader(const char* code, GLuint type) @@ -91,21 +93,21 @@ static int program_new(lua_State *L) { if (!shaders_active) return 0; - GLuint *s = (GLuint*)lua_newuserdata(L, sizeof(GLuint)); + shader_type *p = (shader_type*)lua_newuserdata(L, sizeof(shader_type)); auxiliar_setclass(L, "gl{program}", -1); - *s = glCreateProgramObjectARB(); + p->shader = glCreateProgramObjectARB(); - printf("New GL Shader program %d\n", *s); + printf("New GL Shader program %d\n", p->shader); return 1; } static int program_free(lua_State *L) { - GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); - glDeleteObjectARB(*s); + glDeleteObjectARB(p->shader); lua_pushnumber(L, 1); return 1; @@ -113,12 +115,12 @@ static int program_free(lua_State *L) static int program_compile(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); - glLinkProgramARB(*p); - CHECKGLSLLINK(*p); + glLinkProgramARB(p->shader); + CHECKGLSLLINK(p->shader); - CHECKGLSLVALID(*p); + CHECKGLSLVALID(p->shader); #if 1 char buffer[256]; @@ -127,87 +129,93 @@ static int program_compile(lua_State *L) int length; GLenum dummytype; - glGetObjectParameterivARB(*p, GL_ACTIVE_UNIFORMS, &count); + glGetObjectParameterivARB(p->shader, GL_ACTIVE_UNIFORMS, &count); int i; for(i = 0; i<count;++i) { GLint uniLoc; - glGetActiveUniformARB(*p, i, 256, &length, &dummysize, &dummytype, buffer); - uniLoc = glGetUniformLocationARB(*p, buffer); + glGetActiveUniformARB(p->shader, i, 256, &length, &dummysize, &dummytype, buffer); + uniLoc = glGetUniformLocationARB(p->shader, buffer); if(uniLoc>=0) // Test for valid uniform location { - printf("*p %i: Uniform: %i: %X %s\n", *p,uniLoc, dummytype, buffer); + printf("*p %i: Uniform: %i: %X %s\n", p->shader,uniLoc, dummytype, buffer); } } #endif + + p->p_tick = glGetUniformLocationARB(p->shader, "tick"); + p->p_color = glGetUniformLocationARB(p->shader, "displayColor"); + p->p_mapcoord = glGetUniformLocationARB(p->shader, "mapCoord"); + p->p_texsize = glGetUniformLocationARB(p->shader, "texSize"); + lua_pushboolean(L, TRUE); return 1; } static int program_attach(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{shader}", 2); - glAttachObjectARB(*p, *s); + glAttachObjectARB(p->shader, *s); return 0; } static int program_detach(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{shader}", 2); - glDetachObjectARB(*p, *s); + glDetachObjectARB(p->shader, *s); return 0; } static int program_set_uniform_number(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); const char *var = luaL_checkstring(L, 2); GLfloat i = luaL_checknumber(L, 3); - glUseProgramObjectARB(*p); - glUniform1fvARB(glGetUniformLocationARB(*p, var), 1, &i); + glUseProgramObjectARB(p->shader); + glUniform1fvARB(glGetUniformLocationARB(p->shader, var), 1, &i); glUseProgramObjectARB(0); return 0; } static int program_set_uniform_number2(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); const char *var = luaL_checkstring(L, 2); GLfloat i[2]; i[0] = luaL_checknumber(L, 3); i[1] = luaL_checknumber(L, 4); - glUseProgramObjectARB(*p); - glUniform2fvARB(glGetUniformLocationARB(*p, var), 1, i); + glUseProgramObjectARB(p->shader); + glUniform2fvARB(glGetUniformLocationARB(p->shader, var), 1, i); glUseProgramObjectARB(0); return 0; } static int program_set_uniform_number3(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); const char *var = luaL_checkstring(L, 2); GLfloat i[3]; i[0] = luaL_checknumber(L, 3); i[1] = luaL_checknumber(L, 4); i[2] = luaL_checknumber(L, 5); - glUseProgramObjectARB(*p); - glUniform3fvARB(glGetUniformLocationARB(*p, var), 1, i); + glUseProgramObjectARB(p->shader); + glUniform3fvARB(glGetUniformLocationARB(p->shader, var), 1, i); glUseProgramObjectARB(0); return 0; } static int program_set_uniform_number4(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); const char *var = luaL_checkstring(L, 2); GLfloat i[4]; i[0] = luaL_checknumber(L, 3); @@ -215,34 +223,34 @@ static int program_set_uniform_number4(lua_State *L) i[2] = luaL_checknumber(L, 5); i[3] = luaL_checknumber(L, 6); - glUseProgramObjectARB(*p); - glUniform4fvARB(glGetUniformLocationARB(*p, var), 1, i); + glUseProgramObjectARB(p->shader); + glUniform4fvARB(glGetUniformLocationARB(p->shader, var), 1, i); glUseProgramObjectARB(0); return 0; } static int program_set_uniform_texture(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); const char *var = luaL_checkstring(L, 2); GLint i = luaL_checknumber(L, 3); - glUseProgramObjectARB(*p); - glUniform1ivARB(glGetUniformLocationARB(*p, var), 1, &i); + glUseProgramObjectARB(p->shader); + glUniform1ivARB(glGetUniformLocationARB(p->shader, var), 1, &i); glUseProgramObjectARB(0); return 0; } static int program_use(lua_State *L) { - GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1); bool active = lua_toboolean(L, 2); if (active) { - glUseProgramObjectARB(*p); + glUseProgramObjectARB(p->shader); GLfloat t = SDL_GetTicks(); - glUniform1fvARB(glGetUniformLocationARB(*p, "tick"), 1, &t); + glUniform1fvARB(glGetUniformLocationARB(p->shader, "tick"), 1, &t); } else { diff --git a/src/useshader.h b/src/useshader.h index 6a01d6f2d39d36321b949e2c0c2542e1bf6d25fe..af77810665c589e3e658caa9db09742f8fbee67f 100644 --- a/src/useshader.h +++ b/src/useshader.h @@ -1,2 +1,13 @@ +#ifndef __USESHADER_H__ +#define __USESHADER_H__ + +typedef struct { + GLuint shader; + GLint p_tick, p_color, p_mapcoord, p_texsize; + int params_ref; +} shader_type; + extern bool shaders_active; -extern void useShader(GLuint p, int x, int y, int w, int h, float r, float g, float b, float a); +extern void useShader(shader_type *p, int x, int y, int w, int h, float r, float g, float b, float a); + +#endif