Skip to content
Snippets Groups Projects
Commit 5d3e98ca authored by dg's avatar dg
Browse files

shaders can receive uniforms

git-svn-id: http://svn.net-core.org/repos/t-engine4@741 51575b47-30f0-44d4-a5cc-537603b46e54
parent 91b70e59
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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
......@@ -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);
......
......@@ -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},
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment