Skip to content
Snippets Groups Projects
Commit 77dbad72 authored by kwolekr's avatar kwolekr
Browse files

Fix and improve noise map functions

parent 75fe948b
No related branches found
No related tags found
No related merge requests found
...@@ -367,6 +367,7 @@ void Noise::resizeNoiseBuf(bool is3d) { ...@@ -367,6 +367,7 @@ void Noise::resizeNoiseBuf(bool is3d) {
* values from the previous noise lattice as midpoints in the new lattice for the * values from the previous noise lattice as midpoints in the new lattice for the
* next octave. * next octave.
*/ */
#define idx(x, y) ((y) * nlx + (x))
void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed) { void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed) {
float v00, v01, v10, v11, u, v, orig_u; float v00, v01, v10, v11, u, v, orig_u;
int index, i, j, x0, y0, noisex, noisey; int index, i, j, x0, y0, noisex, noisey;
...@@ -387,25 +388,26 @@ void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed ...@@ -387,25 +388,26 @@ void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed
noisebuf[index++] = noise2d(x0 + i, y0 + j, seed); noisebuf[index++] = noise2d(x0 + i, y0 + j, seed);
//calculate interpolations //calculate interpolations
index = 0;
noisey = 0; noisey = 0;
for (j = 0; j != sy; j++) { for (j = 0; j != sy; j++) {
v00 = noisebuf[noisey * nlx]; v00 = noisebuf[idx(0, noisey)];
v10 = noisebuf[noisey * nlx + 1]; v10 = noisebuf[idx(1, noisey)];
v01 = noisebuf[(noisey + 1) * nlx]; v01 = noisebuf[idx(0, noisey + 1)];
v11 = noisebuf[(noisey + 1) * nlx + 1]; v11 = noisebuf[idx(1, noisey + 1)];
u = orig_u; u = orig_u;
noisex = 0; noisex = 0;
for (i = 0; i != sx; i++) { for (i = 0; i != sx; i++) {
buf[j * sx + i] = biLinearInterpolation(v00, v10, v01, v11, u, v); buf[index++] = biLinearInterpolation(v00, v10, v01, v11, u, v);
u += step_x; u += step_x;
if (u >= 1.0) { if (u >= 1.0) {
u -= 1.0; u -= 1.0;
noisex++; noisex++;
v00 = v10; v00 = v10;
v01 = v11; v01 = v11;
v10 = noisebuf[noisey * nlx + noisex + 1]; v10 = noisebuf[idx(noisex + 1, noisey)];
v11 = noisebuf[(noisey + 1) * nlx + noisex + 1]; v11 = noisebuf[idx(noisex + 1, noisey + 1)];
} }
} }
...@@ -416,14 +418,16 @@ void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed ...@@ -416,14 +418,16 @@ void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed
} }
} }
} }
#undef idx
#define idx(x, y, z) ((z) * nly * nlx + (y) * nlx + (x))
void Noise::gradientMap3D(float x, float y, float z, void Noise::gradientMap3D(float x, float y, float z,
float step_x, float step_y, float step_z, float step_x, float step_y, float step_z,
int seed) { int seed) {
float v000, v010, v100, v110; float v000, v010, v100, v110;
float v001, v011, v101, v111; float v001, v011, v101, v111;
float u, v, w, orig_u, orig_w; float u, v, w, orig_u, orig_v;
int index, i, j, k, x0, y0, z0, noisex, noisey, noisez; int index, i, j, k, x0, y0, z0, noisex, noisey, noisez;
int nlx, nly, nlz; int nlx, nly, nlz;
...@@ -434,49 +438,39 @@ void Noise::gradientMap3D(float x, float y, float z, ...@@ -434,49 +438,39 @@ void Noise::gradientMap3D(float x, float y, float z,
v = y - (float)y0; v = y - (float)y0;
w = z - (float)z0; w = z - (float)z0;
orig_u = u; orig_u = u;
orig_w = w; orig_v = v;
//calculate noise point lattice //calculate noise point lattice
nlx = (int)(u + sx * step_x) + 2; nlx = (int)(u + sx * step_x) + 2;
nly = (int)(v + sy * step_y) + 2; nly = (int)(v + sy * step_y) + 2;
nlz = (int)(v + sy * step_z) + 2; nlz = (int)(w + sz * step_z) + 2;
index = 0; index = 0;
for (k = 0; k != nlz; k++) for (k = 0; k != nlz; k++)
for (j = 0; j != nly; j++) for (j = 0; j != nly; j++)
for (i = 0; i != nlx; i++) for (i = 0; i != nlx; i++)
noisebuf[index++] = noise3d(x0 + i, y0 + j, z0 + k, seed); noisebuf[index++] = noise3d(x0 + i, y0 + j, z0 + k, seed);
#define index(x, y, z) ((z) * nly * nlx + (y) * nlx + (x))
//calculate interpolations //calculate interpolations
index = 0;
noisey = 0; noisey = 0;
noisez = 0; noisez = 0;
for (k = 0; k != sz; k++) { for (k = 0; k != sz; k++) {
v000 = noisebuf[index(0, noisey, noisez)]; v = orig_v;
v100 = noisebuf[index(1, noisey, noisez)];
v010 = noisebuf[index(0, noisey + 1, noisez)];
v110 = noisebuf[index(1, noisey + 1, noisez)];
v001 = noisebuf[index(0, noisey, noisez + 1)];
v101 = noisebuf[index(1, noisey, noisez + 1)];
v011 = noisebuf[index(0, noisey + 1, noisez + 1)];
v111 = noisebuf[index(1, noisey + 1, noisez + 1)];
w = orig_w;
noisey = 0; noisey = 0;
for (j = 0; j != sy; j++) { for (j = 0; j != sy; j++) {
v000 = noisebuf[index(0, noisey, noisez)]; v000 = noisebuf[idx(0, noisey, noisez)];
v100 = noisebuf[index(1, noisey, noisez)]; v100 = noisebuf[idx(1, noisey, noisez)];
v010 = noisebuf[index(0, noisey + 1, noisez)]; v010 = noisebuf[idx(0, noisey + 1, noisez)];
v110 = noisebuf[index(1, noisey + 1, noisez)]; v110 = noisebuf[idx(1, noisey + 1, noisez)];
v001 = noisebuf[index(0, noisey, noisez + 1)]; v001 = noisebuf[idx(0, noisey, noisez + 1)];
v101 = noisebuf[index(1, noisey, noisez + 1)]; v101 = noisebuf[idx(1, noisey, noisez + 1)];
v011 = noisebuf[index(0, noisey + 1, noisez + 1)]; v011 = noisebuf[idx(0, noisey + 1, noisez + 1)];
v111 = noisebuf[index(1, noisey + 1, noisez + 1)]; v111 = noisebuf[idx(1, noisey + 1, noisez + 1)];
u = orig_u; u = orig_u;
noisex = 0; noisex = 0;
for (i = 0; i != sx; i++) { for (i = 0; i != sx; i++) {
buf[j * sx + i] = triLinearInterpolation( buf[index++] = triLinearInterpolation(
v000, v100, v010, v110, v000, v100, v010, v110,
v001, v101, v011, v111, v001, v101, v011, v111,
u, v, w); u, v, w);
...@@ -486,12 +480,12 @@ void Noise::gradientMap3D(float x, float y, float z, ...@@ -486,12 +480,12 @@ void Noise::gradientMap3D(float x, float y, float z,
noisex++; noisex++;
v000 = v100; v000 = v100;
v010 = v110; v010 = v110;
v100 = noisebuf[index(noisex + 1, noisey, noisez)]; v100 = noisebuf[idx(noisex + 1, noisey, noisez)];
v110 = noisebuf[index(noisex + 1, noisey + 1, noisez)]; v110 = noisebuf[idx(noisex + 1, noisey + 1, noisez)];
v001 = v101; v001 = v101;
v011 = v111; v011 = v111;
v101 = noisebuf[index(noisex + 1, noisey, noisez + 1)]; v101 = noisebuf[idx(noisex + 1, noisey, noisez + 1)];
v111 = noisebuf[index(noisex + 1, noisey + 1, noisez + 1)]; v111 = noisebuf[idx(noisex + 1, noisey + 1, noisez + 1)];
} }
} }
...@@ -509,6 +503,7 @@ void Noise::gradientMap3D(float x, float y, float z, ...@@ -509,6 +503,7 @@ void Noise::gradientMap3D(float x, float y, float z,
} }
} }
} }
#undef idx
float *Noise::perlinMap2D(float x, float y) { float *Noise::perlinMap2D(float x, float y) {
......
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