]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/noise.h
The new mapgen, noise functions, et al.
[dragonfireclient.git] / src / noise.h
index 670c2eddca014b4c3a488d525872177c9734a2bb..6e5120003f21e94c4d9fa2aa6e63d12f328b4b36 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define NOISE_HEADER
 
 #include "debug.h"
+#include "irr_v3d.h"
 
 class PseudoRandom
 {
@@ -59,91 +60,69 @@ class PseudoRandom
        int m_next;
 };
 
-double easeCurve(double t);
-// Return value: -1 ... 1
-double noise2d(int x, int y, int seed);
-double noise3d(int x, int y, int z, int seed);
+struct NoiseParams {
+       float offset;
+       float scale;
+       v3f spread;
+       int seed;
+       int octaves;
+       float persist;
+};
 
-double noise2d_gradient(double x, double y, int seed);
-double noise3d_gradient(double x, double y, double z, int seed);
 
-double noise2d_perlin(double x, double y, int seed,
-               int octaves, double persistence);
+class Noise {
+public:
+       NoiseParams *np;
+       int seed;
+       int sx;
+       int sy;
+       int sz;
+       float *noisebuf;
+       float *buf;
+       float *result;
+
+       Noise(NoiseParams *np, int seed, int sx, int sy);
+       Noise(NoiseParams *np, int seed, int sx, int sy, int sz);
+       ~Noise();
+
+       void gradientMap2D(
+               float x, float y,
+               float step_x, float step_y,
+               int seed);
+       void gradientMap3D(
+               float x, float y, float z,
+               float step_x, float step_y, float step_z,
+               int seed);
+       float *perlinMap2D(float x, float y);
+       float *perlinMap3D(float x, float y, float z);
+};
 
-double noise2d_perlin_abs(double x, double y, int seed,
-               int octaves, double persistence);
+// Return value: -1 ... 1
+float noise2d(int x, int y, int seed);
+float noise3d(int x, int y, int z, int seed);
 
-double noise3d_perlin(double x, double y, double z, int seed,
-               int octaves, double persistence);
+float noise2d_gradient(float x, float y, int seed);
+float noise3d_gradient(float x, float y, float z, int seed);
 
-double noise3d_perlin_abs(double x, double y, double z, int seed,
-               int octaves, double persistence);
+float noise2d_perlin(float x, float y, int seed,
+               int octaves, float persistence);
 
-enum NoiseType
-{
-       NOISE_CONSTANT_ONE,
-       NOISE_PERLIN,
-       NOISE_PERLIN_ABS,
-       NOISE_PERLIN_CONTOUR,
-       NOISE_PERLIN_CONTOUR_FLIP_YZ,
-};
+float noise2d_perlin_abs(float x, float y, int seed,
+               int octaves, float persistence);
 
-struct NoiseParams
-{
-       NoiseType type;
-       int seed;
-       int octaves;
-       double persistence;
-       double pos_scale;
-       double noise_scale; // Useful for contour noises
-       
-       NoiseParams(NoiseType type_=NOISE_PERLIN, int seed_=0,
-                       int octaves_=3, double persistence_=0.5,
-                       double pos_scale_=100.0, double noise_scale_=1.0):
-               type(type_),
-               seed(seed_),
-               octaves(octaves_),
-               persistence(persistence_),
-               pos_scale(pos_scale_),
-               noise_scale(noise_scale_)
-       {
-       }
-};
+float noise3d_perlin(float x, float y, float z, int seed,
+               int octaves, float persistence);
 
-double noise3d_param(const NoiseParams &param, double x, double y, double z);
+float noise3d_perlin_abs(float x, float y, float z, int seed,
+               int octaves, float persistence);
 
-class NoiseBuffer
-{
-public:
-       NoiseBuffer();
-       ~NoiseBuffer();
-       
-       void clear();
-       void create(const NoiseParams &param,
-                       double first_x, double first_y, double first_z,
-                       double last_x, double last_y, double last_z,
-                       double samplelength_x, double samplelength_y, double samplelength_z);
-       void multiply(const NoiseParams &param);
-       // Deprecated
-       void create(int seed, int octaves, double persistence,
-                       bool abs,
-                       double first_x, double first_y, double first_z,
-                       double last_x, double last_y, double last_z,
-                       double samplelength_x, double samplelength_y, double samplelength_z);
-
-       void intSet(int x, int y, int z, double d);
-       void intMultiply(int x, int y, int z, double d);
-       double intGet(int x, int y, int z);
-       double get(double x, double y, double z);
-       //bool contains(double x, double y, double z);
+inline float easeCurve(float t) {
+       return t * t * t * (t * (6.f * t - 15.f) + 10.f);
+}
 
-private:
-       double *m_data;
-       double m_start_x, m_start_y, m_start_z;
-       double m_samplelength_x, m_samplelength_y, m_samplelength_z;
-       int m_size_x, m_size_y, m_size_z;
-};
+#define NoisePerlin2D(np, x, y, s) ((np)->offset + (np)->scale * \
+               noise2d_perlin((float)(x) * (np)->spread.X, (float)(y) * (np)->spread.Y, \
+               (s) + (np)->seed, (np)->octaves, (np)->persist))
 
 #endif