+float NoisePerlin2D(NoiseParams *np, float x, float y, int seed);
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed);
+
+inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
+ float y, float yoff, int seed)
+{
+ return NoisePerlin2D(np,
+ x + xoff * np->spread.X,
+ y + yoff * np->spread.Y,
+ seed);
+}
+
+inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
+ float y, float yoff, float z, float zoff, int seed)
+{
+ return NoisePerlin3D(np,
+ x + xoff * np->spread.X,
+ y + yoff * np->spread.Y,
+ z + zoff * np->spread.Z,
+ seed);
+}
+
+// Return value: -1 ... 1
+float noise2d(int x, int y, int seed);
+float noise3d(int x, int y, int z, int seed);
+
+float noise2d_gradient(float x, float y, int seed, bool eased=true);
+float noise3d_gradient(float x, float y, float z, int seed, bool eased=false);
+
+float noise2d_perlin(float x, float y, int seed,
+ int octaves, float persistence, bool eased=true);
+
+float noise2d_perlin_abs(float x, float y, int seed,
+ int octaves, float persistence, bool eased=true);
+
+float noise3d_perlin(float x, float y, float z, int seed,
+ int octaves, float persistence, bool eased=false);
+
+float noise3d_perlin_abs(float x, float y, float z, int seed,
+ int octaves, float persistence, bool eased=false);
+
+inline float easeCurve(float t)
+{
+ return t * t * t * (t * (6.f * t - 15.f) + 10.f);
+}
+
+float contour(float v);
+