forked from Mirrorlandia_minetest/minetest
Fix and improve noise map functions
This commit is contained in:
parent
75fe948bf7
commit
77dbad72f7
@ -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
|
|||||||
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
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef idx
|
||||||
|
|
||||||
|
|
||||||
float *Noise::perlinMap2D(float x, float y) {
|
float *Noise::perlinMap2D(float x, float y) {
|
||||||
|
Loading…
Reference in New Issue
Block a user