X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosrtxon;a=blobdiff_plain;f=src%2Fnoise.c;fp=src%2Fnoise.c;h=7c1debd87d93f448398d916fa3c65debb6867a0f;hp=0000000000000000000000000000000000000000;hb=6952fc3d7981a73ffbabeca5dca741fd790949cc;hpb=584c6161bb6f3f548d5e27bb7d6895a81375881e diff --git a/src/noise.c b/src/noise.c new file mode 100644 index 0000000..7c1debd --- /dev/null +++ b/src/noise.c @@ -0,0 +1,459 @@ +#include +#include +#include "noise.h" + +/* ---- Ken Perlin's implementation of noise ---- */ +#define B 0x100 +#define BM 0xff +#define N 0x1000 +#define NP 12 /* 2^N */ +#define NM 0xfff + +#define s_curve(t) (t * t * (3.0f - 2.0f * t)) + +#define setup(elem, b0, b1, r0, r1) \ + do { \ + float t = elem + N; \ + b0 = ((int)t) & BM; \ + b1 = (b0 + 1) & BM; \ + r0 = t - (int)t; \ + r1 = r0 - 1.0f; \ + } while(0) + +#define setup_p(elem, b0, b1, r0, r1, p) \ + do { \ + float t = elem + N; \ + b0 = (((int)t) & BM) % p; \ + b1 = ((b0 + 1) & BM) % p; \ + r0 = t - (int)t; \ + r1 = r0 - 1.0f; \ + } while(0) + + +static int perm[B + B + 2]; /* permuted index from g_n onto themselves */ +static float grad3[B + B + 2][3]; /* 3D random gradients */ +static float grad2[B + B + 2][2]; /* 2D random gradients */ +static float grad1[B + B + 2]; /* 1D random ... slopes */ +static int tables_valid; + +#define init_once() if(!tables_valid) init_noise() + +#define SQ(x) ((x) * (x)) +#define LERP(a, b, t) ((a) + ((b) - (a)) * (t)) + +static void init_noise() +{ + int i; + float len; + + /* calculate random gradients */ + for(i=0; i