Merge pull request #13 from Bahamada/upstream_merge
[oweals/minetest.git] / src / noise.h
1 /*
2 Minetest-c55
3 Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef NOISE_HEADER
21 #define NOISE_HEADER
22
23 #include "debug.h"
24
25 class PseudoRandom
26 {
27 public:
28         PseudoRandom(): m_next(0)
29         {
30         }
31         PseudoRandom(int seed): m_next(seed)
32         {
33         }
34         void seed(int seed)
35         {
36                 m_next = seed;
37         }
38         // Returns 0...32767
39         int next()
40         {
41                 m_next = m_next * 1103515245 + 12345;
42                 return((unsigned)(m_next/65536) % 32768);
43         }
44         int range(int min, int max)
45         {
46                 if(max-min > 32768/10)
47                 {
48                         //dstream<<"WARNING: PseudoRandom::range: max > 32767"<<std::endl;
49                         assert(0);
50                 }
51                 if(min > max)
52                 {
53                         assert(0);
54                         return max;
55                 }
56                 return (next()%(max-min+1))+min;
57         }
58 private:
59         int m_next;
60 };
61
62 double easeCurve(double t);
63  
64 // Return value: -1 ... 1
65 double noise2d(int x, int y, int seed);
66 double noise3d(int x, int y, int z, int seed);
67
68 double noise2d_gradient(double x, double y, int seed);
69 double noise3d_gradient(double x, double y, double z, int seed);
70
71 double noise2d_perlin(double x, double y, int seed,
72                 int octaves, double persistence);
73
74 double noise2d_perlin_abs(double x, double y, int seed,
75                 int octaves, double persistence);
76
77 double noise3d_perlin(double x, double y, double z, int seed,
78                 int octaves, double persistence);
79
80 double noise3d_perlin_abs(double x, double y, double z, int seed,
81                 int octaves, double persistence);
82
83 enum NoiseType
84 {
85         NOISE_PERLIN,
86         NOISE_PERLIN_ABS,
87         NOISE_PERLIN_CONTOUR,
88         NOISE_PERLIN_CONTOUR_FLIP_YZ
89 };
90
91 struct NoiseParams
92 {
93         NoiseType type;
94         int seed;
95         int octaves;
96         double persistence;
97         double pos_scale;
98         double noise_scale; // Useful for contour noises
99         
100         NoiseParams(NoiseType type_=NOISE_PERLIN, int seed_=0,
101                         int octaves_=3, double persistence_=0.5,
102                         double pos_scale_=100.0, double noise_scale_=1.0):
103                 type(type_),
104                 seed(seed_),
105                 octaves(octaves_),
106                 persistence(persistence_),
107                 pos_scale(pos_scale_),
108                 noise_scale(noise_scale_)
109         {
110         }
111 };
112
113 double noise3d_param(const NoiseParams &param, double x, double y, double z);
114
115 class NoiseBuffer
116 {
117 public:
118         NoiseBuffer();
119         ~NoiseBuffer();
120         
121         void clear();
122         void create(const NoiseParams &param,
123                         double first_x, double first_y, double first_z,
124                         double last_x, double last_y, double last_z,
125                         double samplelength_x, double samplelength_y, double samplelength_z);
126         void multiply(const NoiseParams &param);
127         // Deprecated
128         void create(int seed, int octaves, double persistence,
129                         bool abs,
130                         double first_x, double first_y, double first_z,
131                         double last_x, double last_y, double last_z,
132                         double samplelength_x, double samplelength_y, double samplelength_z);
133
134         void intSet(int x, int y, int z, double d);
135         void intMultiply(int x, int y, int z, double d);
136         double intGet(int x, int y, int z);
137         double get(double x, double y, double z);
138         //bool contains(double x, double y, double z);
139
140 private:
141         double *m_data;
142         double m_start_x, m_start_y, m_start_z;
143         double m_samplelength_x, m_samplelength_y, m_samplelength_z;
144         int m_size_x, m_size_y, m_size_z;
145 };
146
147 #endif
148