diff --git a/src/noise.c b/src/noise.c index ec58dc3865698809fb56ed3c385428fde8c5359b..4d304c5f023b71548ef5da9b647b662509af94cc 100644 --- a/src/noise.c +++ b/src/noise.c @@ -27,6 +27,7 @@ #include <math.h> #include "libtcod.h" #include "noise.h" +#include "tgl.h" typedef struct { @@ -164,6 +165,56 @@ static int noise_turbulence_wavelet(lua_State *L) return 1; } +#define BYTES_PER_TEXEL 3 +#define LAYER(r) (w * h * r * BYTES_PER_TEXEL) +// 2->1 dimension mapping function +#define TEXEL2(s, t) (BYTES_PER_TEXEL * (s * w + t)) +// 3->1 dimension mapping function +#define TEXEL3(s, t, r) (TEXEL2(s, t) + LAYER(r)) + +static int noise_texture2d(lua_State *L) +{ + noise_t *n = (noise_t*)auxiliar_checkclass(L, "noise{core}", 1); + const char *type = luaL_checkstring(L, 2); + int w = luaL_checknumber(L, 3); + int h = luaL_checknumber(L, 4); + float zoom = luaL_checknumber(L, 4); + float x = luaL_checknumber(L, 5); + float y = luaL_checknumber(L, 6); + float octave = lua_tonumber(L, 7); + GLubyte *map = malloc(w * h * 3 * sizeof(GLubyte)); + + float p[2]; + int i, j; + for (i = 0; i < w; i++) + { + for (j = 0; j < h; j++) + { + p[0] = zoom * ((float)(i+x)) / w; + p[1] = zoom * ((float)(j+y)) / h; + float v = ((TCOD_noise_simplex(n->noise, p) + 1) / 2) * 255; + map[TEXEL2(i, j)] = (GLubyte)v; + map[TEXEL2(i, j)+1] = (GLubyte)v; + map[TEXEL2(i, j)+2] = (GLubyte)v; + } + } + + GLuint *t = (GLuint*)lua_newuserdata(L, sizeof(GLuint)); + auxiliar_setclass(L, "gl{texture}", -1); + + glGenTextures(1, t); + glBindTexture(GL_TEXTURE_2D, *t); + 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); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, map); + + free(map); + + return 1; +} + static const struct luaL_reg noiselib[] = { {"new", noise_new}, @@ -182,6 +233,7 @@ static const struct luaL_reg noise_reg[] = {"wavelet", noise_wavelet}, {"fbm_wavelet", noise_fbm_wavelet}, {"turbulence_wavelet", noise_turbulence_wavelet}, + {"makeTexture2D", noise_texture2d}, {NULL, NULL}, }; diff --git a/src/shaders.c b/src/shaders.c index 96d5d438ff3d070d13d4885b05061dd30563eb97..c85a447c9042cf0e15c8db88cf0a3870f4e494c9 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -81,9 +81,13 @@ void make3DNoiseTexture(void) { for (j = 0; j < noise2DTexSize; ++j) { - noise2DTexPtr[i][j][0] = i; - noise2DTexPtr[i][j][1] = j; - noise2DTexPtr[i][j][2] = 255; + 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; } }