diff --git a/game/engine/Map.lua b/game/engine/Map.lua index 08a5eae035b1a737885b301cf98eaf4697d192df..a6b182154ca182b0c2bc58e44e9e2531e5592d88 100644 --- a/game/engine/Map.lua +++ b/game/engine/Map.lua @@ -391,7 +391,7 @@ function _M:call(x, y, pos, entity) if entity then -- Instanciate shader if entity.shader and type(entity.shader) == "string" then - entity.shader = Shader.new(entity.shader) + entity.shader = Shader.new(entity.shader, entity.shader_args) end self.map[x + y * self.w][pos] = entity diff --git a/game/engine/Shader.lua b/game/engine/Shader.lua index b398285bb9d983ceea28415f4721ba5aa6798900..86b37fd047a66e9cc0e77238284981339ddb7b7b 100644 --- a/game/engine/Shader.lua +++ b/game/engine/Shader.lua @@ -29,7 +29,7 @@ _M.progs = {} --- Make a shader function _M:init(name, args) - self.args = args + self.args = args or {} self.name = name self:loaded() @@ -96,4 +96,14 @@ function _M:loaded() end self.shad = _M.progs[self.name] + + for k, v in pairs(self.args) do + if type(v) == "number" then + self.shad:paramNumber(k, v) + elseif type(v) == "table" + if v.texture then + self.shad:paramNumber(k, v.texture, v.is3d) + end + end + end end diff --git a/src/map.c b/src/map.c index 80e7628573b7a0c1a8253fdfce8e8b4b62c85772..569e7f544df2d355c86792e5ef277177cb719ff7 100644 --- a/src/map.c +++ b/src/map.c @@ -29,7 +29,7 @@ #include "tSDL.h" //#include "shaders.h" -extern void useShader(GLuint p); +extern void useShader(GLuint p, int x, int y); // Minimap defines #define MM_FLOOR 1 @@ -371,7 +371,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -388,7 +388,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_trap[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -405,7 +405,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_object[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -422,7 +422,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_actor[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -442,7 +442,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_actor[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -459,7 +459,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_object[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -476,7 +476,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_trap[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -493,7 +493,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a); else glColor4f(map->shown_r, map->shown_g, map->shown_b, a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); @@ -514,7 +514,7 @@ static int map_to_screen(lua_State *L) glColor4f((map->obscure_r + m->tint_r)/2, (map->obscure_g + m->tint_g)/2, (map->obscure_b + m->tint_b)/2, map->obscure_a); else glColor4f(map->obscure_r, map->obscure_g, map->obscure_b, map->obscure_a); - if (m->shader) useShader(m->shader); + if (m->shader) useShader(m->shader, i, j); glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j].texture); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0 +dx, 0 +dy,-99); diff --git a/src/shaders.c b/src/shaders.c index c85a447c9042cf0e15c8db88cf0a3870f4e494c9..775de18b50964647e4aec26e36208bcc35d6ca62 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -32,95 +32,16 @@ bool shaders_active = TRUE; -int noise3DTexSize = 128; -GLuint noise3DTexName = 0; -GLubyte noise3DTexPtr[128][128][128][4]; -int noise2DTexSize = 128; -GLuint noise2DTexName = 0; -GLubyte noise2DTexPtr[128][128][3]; - -void make3DNoiseTexture(void) +void useShader(GLuint p, int x, int y) { - static bool init = FALSE; - if (init) return; - init = TRUE; - - int f, i, j, k, inc; - TCOD_noise_t noise = TCOD_noise_new(3, TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY); - float p[3]; - - for (i = 0; i < noise3DTexSize; ++i) - { - for (j = 0; j < noise3DTexSize; ++j) - { - for (k = 0; k < noise3DTexSize; ++k) - { - p[0] = i; - p[1] = j; - p[2] = k; - float v = ((TCOD_noise_simplex(noise, p) + 1) / 2) * 255; - noise3DTexPtr[i][j][k][0] = v; - noise3DTexPtr[i][j][k][1] = v; - noise3DTexPtr[i][j][k][2] = v; - noise3DTexPtr[i][j][k][3] = 255; - } - } - } - - glGenTextures(1, &noise3DTexName); - glBindTexture(GL_TEXTURE_3D, noise3DTexName); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 128, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, noise3DTexPtr); - - - for (i = 0; i < noise2DTexSize; ++i) - { - for (j = 0; j < noise2DTexSize; ++j) - { - p[0] = i; - p[1] = j; - p[2] = 1; - float v = ((TCOD_noise_simplex(noise, p) + 1) / 2) * 255; - noise2DTexPtr[i][j][0] = v; - noise2DTexPtr[i][j][1] = v; - noise2DTexPtr[i][j][2] = v; - } - } - - glGenTextures(1, &noise2DTexName); - glBindTexture(GL_TEXTURE_2D, noise2DTexName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - CHECKGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, noise2DTexPtr)); -} - -void useShader(GLuint p) -{ - make3DNoiseTexture(); - CHECKGL(glUseProgramObjectARB(p)); GLint i = SDL_GetTicks(); CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "tick"), 1, &i)); - i = 1; - CHECKGL(glActiveTexture(GL_TEXTURE1)); - CHECKGL(glBindTexture(GL_TEXTURE_3D, noise3DTexName)); - CHECKGL(glEnable(GL_TEXTURE_2D)); - CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "noisevol"), 1, &i)); - - i = 2; - CHECKGL(glActiveTexture(GL_TEXTURE2)); - CHECKGL(glBindTexture(GL_TEXTURE_2D, noise2DTexName)); - CHECKGL(glEnable(GL_TEXTURE_2D)); - CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "noise2d"), 1, &i)); - - CHECKGL(glActiveTexture(GL_TEXTURE0)); + i = x; + CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "mapx"), 1, &i)); + i = y; + CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "mapy"), 1, &i)); } static GLuint loadShader(const char* code, GLuint type) @@ -232,6 +153,31 @@ static int program_detach(lua_State *L) return 0; } +static int program_set_uniform_number(lua_State *L) +{ + GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + const char *var = luaL_checkstring(L, 2); + GLfloat i = luaL_checknumber(L, 3); + + CHECKGL(glUniform1fvARB(glGetUniformLocationARB(p, var), 1, &i)); + return 0; +} + +static int program_set_uniform_texture(lua_State *L) +{ + GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1); + const char *var = luaL_checkstring(L, 2); + GLuint *t = (GLuint*)auxiliar_checkclass(L, "gl{texture}", 3); + bool is3d = lua_toboolean(L, 4); + + GLint i = 1; + CHECKGL(glActiveTexture(GL_TEXTURE1)); + CHECKGL(glBindTexture(is3d ? GL_TEXTURE_3D : GL_TEXTURE_2D, *t)); + CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, var), 1, &i)); + CHECKGL(glActiveTexture(GL_TEXTURE0)); + return 0; +} + static const struct luaL_reg shaderlib[] = { {"newShader", shader_new}, @@ -245,6 +191,8 @@ static const struct luaL_reg program_reg[] = {"compile", program_compile}, {"attach", program_attach}, {"detach", program_detach}, + {"paramNumber", program_set_uniform_number}, + {"paramTexture", program_set_uniform_texture}, {NULL, NULL}, };