]> git.lizzy.rs Git - minetest.git/blobdiff - src/noise.cpp
Fix crash when no world is selected and configure button is pressed.
[minetest.git] / src / noise.cpp
index 3874848ad3836672138caa24cc36d6268fd6f3eb..de9d48808e297ee067631c6bb713e59b2c558c3f 100644 (file)
@@ -270,47 +270,27 @@ float contour(float v)
 
 
 Noise::Noise(NoiseParams *np, int seed, int sx, int sy) {
-       int nlx, nly;
-       float ofactor;
-
-       //maximum possible spread value factor
-       ofactor = (float)(1 << (np->octaves - 1));
-
-       //noise lattice point count
-       //(int)(sz * spread * ofactor) is # of lattice points crossed due to length
-       // + 2 for the two initial endpoints
-       // + 1 for potentially crossing a boundary due to offset
-       nlx = (int)(sx * ofactor / np->spread.X) + 3;
-       nly = (int)(sy * ofactor / np->spread.Y) + 3;
-
-       this->np   = np;
-       this->seed = seed;
-       this->sx   = sx;
-       this->sy   = sy;
-       this->sz   = 1;
-       this->noisebuf = new float[nlx * nly];
-       this->buf      = new float[sx * sy];
-       this->result   = new float[sx * sy];
+       init(np, seed, sx, sy, 1);
 }
 
 
 Noise::Noise(NoiseParams *np, int seed, int sx, int sy, int sz) {
-       int nlx, nly, nlz;
-       float ofactor;
+       init(np, seed, sx, sy, sz);
+}
 
-       ofactor = (float)(1 << (np->octaves - 1));
-       nlx = (int)(sx * ofactor / np->spread.X) + 3;
-       nly = (int)(sy * ofactor / np->spread.Y) + 3;
-       nlz = (int)(sz * ofactor / np->spread.Z) + 3;
 
+void Noise::init(NoiseParams *np, int seed, int sx, int sy, int sz) {
        this->np   = np;
        this->seed = seed;
        this->sx   = sx;
        this->sy   = sy;
        this->sz   = sz;
-       this->noisebuf = new float[nlx * nly * nlz];
-       this->buf      = new float[sx * sy * sz];
-       this->result   = new float[sx * sy * sz];
+
+       this->noisebuf = NULL;
+       resizeNoiseBuf(sz > 1);
+
+       this->buf    = new float[sx * sy * sz];
+       this->result = new float[sx * sy * sz];
 }
 
 
@@ -321,6 +301,61 @@ Noise::~Noise() {
 }
 
 
+void Noise::setSize(int sx, int sy) {
+       setSize(sx, sy, 1);
+}
+
+
+void Noise::setSize(int sx, int sy, int sz) {
+       this->sx = sx;
+       this->sy = sy;
+       this->sz = sz;
+
+       this->noisebuf = NULL;
+       resizeNoiseBuf(sz > 1);
+
+       delete[] buf;
+       delete[] result;
+       this->buf    = new float[sx * sy * sz];
+       this->result = new float[sx * sy * sz];
+}
+
+
+void Noise::setSpreadFactor(v3f spread) {
+       this->np->spread = spread;
+
+       resizeNoiseBuf(sz > 1);
+}
+
+
+void Noise::setOctaves(int octaves) {
+       this->np->octaves = octaves;
+
+       resizeNoiseBuf(sz > 1);
+}
+
+
+void Noise::resizeNoiseBuf(bool is3d) {
+       int nlx, nly, nlz;
+       float ofactor;
+
+       //maximum possible spread value factor
+       ofactor = (float)(1 << (np->octaves - 1));
+
+       //noise lattice point count
+       //(int)(sz * spread * ofactor) is # of lattice points crossed due to length
+       // + 2 for the two initial endpoints
+       // + 1 for potentially crossing a boundary due to offset
+       nlx = (int)(sx * ofactor / np->spread.X) + 3;
+       nly = (int)(sy * ofactor / np->spread.Y) + 3;
+       nlz = is3d ? (int)(sz * ofactor / np->spread.Z) + 3 : 1;
+
+       if (noisebuf)
+               delete[] noisebuf;
+       noisebuf = new float[nlx * nly * nlz];
+}
+
+
 /*
  * NB:  This algorithm is not optimal in terms of space complexity.  The entire
  * integer lattice of noise points could be done as 2 lines instead, and for 3D,
@@ -344,7 +379,6 @@ void Noise::gradientMap2D(float x, float y, float step_x, float step_y, int seed
        orig_u = u;
 
        //calculate noise point lattice
-
        nlx = (int)(u + sx * step_x) + 2;
        nly = (int)(v + sy * step_y) + 2;
        index = 0;