Cleaned & enhanced noise object management
authorkwolekr <mirrorisim@gmail.com>
Tue, 18 Dec 2012 21:45:50 +0000 (16:45 -0500)
committerPerttu Ahola <celeron55@gmail.com>
Mon, 21 Jan 2013 19:41:37 +0000 (21:41 +0200)
src/noise.cpp
src/noise.h

index 3874848ad3836672138caa24cc36d6268fd6f3eb..c038384db5cb0167e0d3bb1db978dc7b7919880b 100644 (file)
@@ -270,45 +270,25 @@ 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->noisebuf = NULL;
+       resizeNoiseBuf(sz > 1);
+
        this->buf      = new float[sx * sy * sz];
        this->result   = new float[sx * sy * sz];
 }
@@ -321,6 +301,58 @@ 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;
+
+       resizeNoiseBuf(sz > 1);
+
+       delete[] buf;
+       delete[] result;
+}
+
+
+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 +376,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;
index 0ab162b73a9f504e135cf107c382dbd976aaab05..15df5c25b5d24a61fb1a59a023a47ce2f9328dfc 100644 (file)
@@ -85,6 +85,13 @@ public:
        Noise(NoiseParams *np, int seed, int sx, int sy, int sz);
        ~Noise();
 
+       void init(NoiseParams *np, int seed, int sx, int sy, int sz);
+       void setSize(int sx, int sy);
+       void setSize(int sx, int sy, int sz);
+       void setSpreadFactor(v3f spread);
+       void setOctaves(int octaves);
+       void resizeNoiseBuf(bool is3d);
+
        void gradientMap2D(
                float x, float y,
                float step_x, float step_y,