]> git.lizzy.rs Git - minetest.git/blobdiff - src/noise.h
Update Copyright Years
[minetest.git] / src / noise.h
index 6e4fedbc4d154f4be032ba61941f28adbc3dee34..c2a85771ccdf9a3e2ad74da1417ff643ef468556 100644 (file)
@@ -1,18 +1,18 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
@@ -20,90 +20,145 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef NOISE_HEADER
 #define NOISE_HEADER
 
-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);
-
-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);
-
-double noise2d_perlin_abs(double x, double y, int seed,
-               int octaves, double persistence);
+#include "debug.h"
+#include "irr_v3d.h"
 
-double noise3d_perlin(double x, double y, double z, int seed,
-               int octaves, double persistence);
-
-double noise3d_perlin_abs(double x, double y, double z, int seed,
-               int octaves, double persistence);
-
-enum NoiseType
+class PseudoRandom
 {
-       NOISE_PERLIN,
-       NOISE_PERLIN_ABS,
-       NOISE_PERLIN_CONTOUR,
-       NOISE_PERLIN_CONTOUR_FLIP_YZ
+public:
+       PseudoRandom(): m_next(0)
+       {
+       }
+       PseudoRandom(int seed): m_next(seed)
+       {
+       }
+       void seed(int seed)
+       {
+               m_next = seed;
+       }
+       // Returns 0...32767
+       int next()
+       {
+               m_next = m_next * 1103515245 + 12345;
+               return((unsigned)(m_next/65536) % 32768);
+       }
+       int range(int min, int max)
+       {
+               if(max-min > 32768/10)
+               {
+                       //dstream<<"WARNING: PseudoRandom::range: max > 32767"<<std::endl;
+                       assert(0);
+               }
+               if(min > max)
+               {
+                       assert(0);
+                       return max;
+               }
+               return (next()%(max-min+1))+min;
+       }
+private:
+       int m_next;
 };
 
-struct NoiseParams
-{
-       NoiseType type;
+struct NoiseParams {
+       float offset;
+       float scale;
+       v3f spread;
        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 persist;
 };
 
-double noise3d_param(const NoiseParams &param, double x, double y, double z);
 
-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);
+// Convenience macros for getting/setting NoiseParams in Settings
+#define getNoiseParams(x) getStruct<NoiseParams>((x), "f,f,v3,s32,s32,f")
+#define setNoiseParams(x, y) setStruct((x), "f,f,v3,s32,s32,f", (y))
 
-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;
+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 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,
+               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);
+       void transformNoiseMap();
 };
 
+// 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);
+float noise3d_gradient(float x, float y, float z, int seed);
+
+float noise2d_perlin(float x, float y, int seed,
+               int octaves, float persistence);
+
+float noise2d_perlin_abs(float x, float y, int seed,
+               int octaves, float persistence);
+
+float noise3d_perlin(float x, float y, float z, int seed,
+               int octaves, float persistence);
+
+float noise3d_perlin_abs(float x, float y, float z, int seed,
+               int octaves, float persistence);
+
+inline float easeCurve(float t) {
+       return t * t * t * (t * (6.f * t - 15.f) + 10.f);
+}
+
+#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))
+
+#define NoisePerlin2DNoTxfm(np, x, y, s) \
+               (noise2d_perlin( \
+               (float)(x) / (np)->spread.X, \
+               (float)(y) / (np)->spread.Y, \
+               (s) + (np)->seed, (np)->octaves, (np)->persist))
+
+#define NoisePerlin2DPosOffset(np, x, xoff, y, yoff, s) \
+               ((np)->offset + (np)->scale * noise2d_perlin( \
+               (float)(xoff) + (float)(x) / (np)->spread.X, \
+               (float)(yoff) + (float)(y) / (np)->spread.Y, \
+               (s) + (np)->seed, (np)->octaves, (np)->persist))
+
+#define NoisePerlin2DNoTxfmPosOffset(np, x, xoff, y, yoff, s) \
+               (noise2d_perlin( \
+               (float)(xoff) + (float)(x) / (np)->spread.X, \
+               (float)(yoff) + (float)(y) / (np)->spread.Y, \
+               (s) + (np)->seed, (np)->octaves, (np)->persist))
+
+#define NoisePerlin3D(np, x, y, z, s) ((np)->offset + (np)->scale * \
+               noise2d_perlin((float)(x) / (np)->spread.X, (float)(y) / (np)->spread.Y, \
+               (float)(z) / (np)->spread.Z, (s) + (np)->seed, (np)->octaves, (np)->persist))
+
 #endif