#include "proctext.h" #include "noise.h" #define SMOOTHSTEP(x) ((x)*(x)*(3 - 2*(x))) static float gradientTab[TABSIZE*3]; static void gradientTabInit(int seed); static float glattice(int ix, int iy, int iz, float fx, float fy, float fz); float gnoise(float x, float y, float z) { int ix, iy, iz; float fx0, fx1, fy0, fy1, fz0, fz1; float wx, wy, wz; float vx0, vx1, vy0, vy1, vz0, vz1; static int initialized = 0; if (!initialized) { gradientTabInit(665); initialized = 1; } ix = FLOOR(x); fx0 = x - ix; fx1 = fx0 - 1; wx = SMOOTHSTEP(fx0); iy = FLOOR(y); fy0 = y - iy; fy1 = fy0 - 1; wy = SMOOTHSTEP(fy0); iz = FLOOR(z); fz0 = z - iz; fz1 = fz0 - 1; wz = SMOOTHSTEP(fz0); vx0 = glattice(ix,iy,iz,fx0,fy0,fz0); vx1 = glattice(ix+1,iy,iz,fx1,fy0,fz0); vy0 = LERP(wx, vx0, vx1); vx0 = glattice(ix,iy+1,iz,fx0,fy1,fz0); vx1 = glattice(ix+1,iy+1,iz,fx1,fy1,fz0); vy1 = LERP(wx, vx0, vx1); vz0 = LERP(wy, vy0, vy1); vx0 = glattice(ix,iy,iz+1,fx0,fy0,fz1); vx1 = glattice(ix+1,iy,iz+1,fx1,fy0,fz1); vy0 = LERP(wx, vx0, vx1); vx0 = glattice(ix,iy+1,iz+1,fx0,fy1,fz1); vx1 = glattice(ix+1,iy+1,iz+1,fx1,fy1,fz1); vy1 = LERP(wx, vx0, vx1); vz1 = LERP(wy, vy0, vy1); return LERP(wz, vz0, vz1); } static void gradientTabInit(int seed) { float *table = gradientTab; float z, r, theta; int i; srandom(seed); for(i = 0; i < TABSIZE; i++) { z = 1. - 2.*RANDNBR; /* r is radius of x,y circle */ r = sqrtf(1 - z*z); /* theta is angle in (x,y) */ theta = 2 * M_PI * RANDNBR; *table++ = r * cosf(theta); *table++ = r * sinf(theta); *table++ = z; } } static float glattice(int ix, int iy, int iz, float fx, float fy, float fz) { float *g = &gradientTab[INDEX(ix,iy,iz)*3]; return g[0]*fx + g[1]*fy + g[2]*fz; }