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];
}
}
+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,
orig_u = u;
//calculate noise point lattice
-
nlx = (int)(u + sx * step_x) + 2;
nly = (int)(v + sy * step_y) + 2;
index = 0;
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,