X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnoise.h;h=9f9e2af6df4210de55f1c9da1578a5902532a89d;hb=86a0f5603b9e936b8527ae22c4aeaf5714c9d279;hp=c8d8985c6dfa5845fc7c0006ca2437c710d19adf;hpb=033ae0dcaecc37fee487e44896a0c0fb4c844e4e;p=oweals%2Fminetest.git diff --git a/src/noise.h b/src/noise.h index c8d8985c6..9f9e2af6d 100644 --- a/src/noise.h +++ b/src/noise.h @@ -1,18 +1,19 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola +Copyright (C) 2010-2013 kwolekr, Ryan Kwolek 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. */ @@ -21,6 +22,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,90 +61,122 @@ private: 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); + NoiseParams() {} -double noise2d_perlin(double x, double y, int seed, - int octaves, double persistence); + NoiseParams(float offset_, float scale_, v3f spread_, + int seed_, int octaves_, float persist_) + { + offset = offset_; + scale = scale_; + spread = spread_; + seed = seed_; + octaves = octaves_; + persist = persist_; + } +}; -double noise2d_perlin_abs(double x, double y, int seed, - int octaves, double persistence); -double noise3d_perlin(double x, double y, double z, int seed, - int octaves, double persistence); +// Convenience macros for getting/setting NoiseParams in Settings -double noise3d_perlin_abs(double x, double y, double z, int seed, - int octaves, double persistence); +#define NOISEPARAMS_FMT_STR "f,f,v3,s32,s32,f" -enum NoiseType -{ - NOISE_PERLIN, - NOISE_PERLIN_ABS, - NOISE_PERLIN_CONTOUR, - NOISE_PERLIN_CONTOUR_FLIP_YZ -}; +#define getNoiseParams(x, y) getStruct((x), NOISEPARAMS_FMT_STR, &(y), sizeof(y)) +#define setNoiseParams(x, y) setStruct((x), NOISEPARAMS_FMT_STR, &(y)) -struct NoiseParams -{ - NoiseType type; +class Noise { +public: + NoiseParams *np; 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_) - { - } + 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); + virtual ~Noise(); + + virtual 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 *perlinMap2DModulated(float x, float y, float *persist_map); + float *perlinMap3D(float x, float y, float z); + void transformNoiseMap(); }; -double noise3d_param(const NoiseParams ¶m, double x, double y, double z); - -class NoiseBuffer -{ -public: - NoiseBuffer(); - ~NoiseBuffer(); - - void clear(); - void create(const NoiseParams ¶m, - 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 ¶m); - // 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); - -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; -}; +// 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 * \ + noise3d_perlin((float)(x) / (np)->spread.X, (float)(y) / (np)->spread.Y, \ + (float)(z) / (np)->spread.Z, (s) + (np)->seed, (np)->octaves, (np)->persist)) #endif