37 #define FN_CELLULAR_INDEX_MAX 3 40 typedef double FN_DECIMAL;
42 typedef float FN_DECIMAL;
48 explicit FastNoise(
int seed = 1337) { SetSeed(seed); CalculateFractalBounding(); }
50 enum NoiseType { Value, ValueFractal, Perlin, PerlinFractal, Simplex, SimplexFractal, Cellular, WhiteNoise, Cubic, CubicFractal };
51 enum Interp { Linear, Hermite, Quintic };
52 enum FractalType { FBM, Billow, RigidMulti };
53 enum CellularDistanceFunction { Euclidean, Manhattan, Natural };
54 enum CellularReturnType { CellValue, NoiseLookup, Distance, Distance2, Distance2Add, Distance2Sub, Distance2Mul, Distance2Div };
58 void SetSeed(
int seed);
61 int GetSeed()
const {
return m_seed; }
65 void SetFrequency(FN_DECIMAL frequency) { m_frequency = frequency; }
68 FN_DECIMAL GetFrequency()
const {
return m_frequency; }
77 void SetInterp(Interp interp) { m_interp = interp; }
80 Interp GetInterp()
const {
return m_interp; }
84 void SetNoiseType(NoiseType noiseType) { m_noiseType = noiseType; }
87 NoiseType GetNoiseType()
const {
return m_noiseType; }
91 void SetFractalOctaves(
int octaves) { m_octaves = octaves; CalculateFractalBounding(); }
94 int GetFractalOctaves()
const {
return m_octaves; }
98 void SetFractalLacunarity(FN_DECIMAL lacunarity) { m_lacunarity = lacunarity; }
101 FN_DECIMAL GetFractalLacunarity()
const {
return m_lacunarity; }
105 void SetFractalGain(FN_DECIMAL gain) { m_gain = gain; CalculateFractalBounding(); }
108 FN_DECIMAL GetFractalGain()
const {
return m_gain; }
112 void SetFractalType(FractalType fractalType) { m_fractalType = fractalType; }
115 FractalType GetFractalType()
const {
return m_fractalType; }
120 void SetCellularDistanceFunction(CellularDistanceFunction cellularDistanceFunction) { m_cellularDistanceFunction = cellularDistanceFunction; }
123 CellularDistanceFunction GetCellularDistanceFunction()
const {
return m_cellularDistanceFunction; }
128 void SetCellularReturnType(CellularReturnType cellularReturnType) { m_cellularReturnType = cellularReturnType; }
131 CellularReturnType GetCellularReturnType()
const {
return m_cellularReturnType; }
135 void SetCellularNoiseLookup(FastNoise* noise) { m_cellularNoiseLookup = noise; }
138 FastNoise* GetCellularNoiseLookup()
const {
return m_cellularNoiseLookup; }
144 void SetCellularDistance2Indices(
int cellularDistanceIndex0,
int cellularDistanceIndex1);
147 void GetCellularDistance2Indices(
int& cellularDistanceIndex0,
int& cellularDistanceIndex1)
const;
152 void SetCellularJitter(FN_DECIMAL cellularJitter) { m_cellularJitter = cellularJitter; }
155 FN_DECIMAL GetCellularJitter()
const {
return m_cellularJitter; }
159 void SetGradientPerturbAmp(FN_DECIMAL gradientPerturbAmp) { m_gradientPerturbAmp = gradientPerturbAmp; }
162 FN_DECIMAL GetGradientPerturbAmp()
const {
return m_gradientPerturbAmp; }
165 FN_DECIMAL GetValue(FN_DECIMAL x, FN_DECIMAL y)
const;
166 FN_DECIMAL GetValueFractal(FN_DECIMAL x, FN_DECIMAL y)
const;
168 FN_DECIMAL GetPerlin(FN_DECIMAL x, FN_DECIMAL y)
const;
169 FN_DECIMAL GetPerlinFractal(FN_DECIMAL x, FN_DECIMAL y)
const;
171 FN_DECIMAL GetSimplex(FN_DECIMAL x, FN_DECIMAL y)
const;
172 FN_DECIMAL GetSimplexFractal(FN_DECIMAL x, FN_DECIMAL y)
const;
174 FN_DECIMAL GetCellular(FN_DECIMAL x, FN_DECIMAL y)
const;
176 FN_DECIMAL GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y)
const;
177 FN_DECIMAL GetWhiteNoiseInt(
int x,
int y)
const;
179 FN_DECIMAL GetCubic(FN_DECIMAL x, FN_DECIMAL y)
const;
180 FN_DECIMAL GetCubicFractal(FN_DECIMAL x, FN_DECIMAL y)
const;
182 FN_DECIMAL GetNoise(FN_DECIMAL x, FN_DECIMAL y)
const;
184 void GradientPerturb(FN_DECIMAL& x, FN_DECIMAL& y)
const;
185 void GradientPerturbFractal(FN_DECIMAL& x, FN_DECIMAL& y)
const;
188 FN_DECIMAL GetValue(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
189 FN_DECIMAL GetValueFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
191 FN_DECIMAL GetPerlin(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
192 FN_DECIMAL GetPerlinFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
194 FN_DECIMAL GetSimplex(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
195 FN_DECIMAL GetSimplexFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
197 FN_DECIMAL GetCellular(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
199 FN_DECIMAL GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
200 FN_DECIMAL GetWhiteNoiseInt(
int x,
int y,
int z)
const;
202 FN_DECIMAL GetCubic(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
203 FN_DECIMAL GetCubicFractal(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
205 FN_DECIMAL GetNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
207 void GradientPerturb(FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z)
const;
208 void GradientPerturbFractal(FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z)
const;
211 FN_DECIMAL GetSimplex(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w)
const;
213 FN_DECIMAL GetWhiteNoise(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w)
const;
214 FN_DECIMAL GetWhiteNoiseInt(
int x,
int y,
int z,
int w)
const;
217 unsigned char m_perm[512];
218 unsigned char m_perm12[512];
221 FN_DECIMAL m_frequency = FN_DECIMAL(0.01);
222 Interp m_interp = Quintic;
223 NoiseType m_noiseType = Simplex;
226 FN_DECIMAL m_lacunarity = FN_DECIMAL(2);
227 FN_DECIMAL m_gain = FN_DECIMAL(0.5);
228 FractalType m_fractalType = FBM;
229 FN_DECIMAL m_fractalBounding;
231 CellularDistanceFunction m_cellularDistanceFunction = Euclidean;
232 CellularReturnType m_cellularReturnType = CellValue;
233 FastNoise* m_cellularNoiseLookup =
nullptr;
234 int m_cellularDistanceIndex0 = 0;
235 int m_cellularDistanceIndex1 = 1;
236 FN_DECIMAL m_cellularJitter = FN_DECIMAL(0.45);
238 FN_DECIMAL m_gradientPerturbAmp = FN_DECIMAL(1);
240 void CalculateFractalBounding();
243 FN_DECIMAL SingleValueFractalFBM(FN_DECIMAL x, FN_DECIMAL y)
const;
244 FN_DECIMAL SingleValueFractalBillow(FN_DECIMAL x, FN_DECIMAL y)
const;
245 FN_DECIMAL SingleValueFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y)
const;
246 FN_DECIMAL SingleValue(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y)
const;
248 FN_DECIMAL SinglePerlinFractalFBM(FN_DECIMAL x, FN_DECIMAL y)
const;
249 FN_DECIMAL SinglePerlinFractalBillow(FN_DECIMAL x, FN_DECIMAL y)
const;
250 FN_DECIMAL SinglePerlinFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y)
const;
251 FN_DECIMAL SinglePerlin(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y)
const;
253 FN_DECIMAL SingleSimplexFractalFBM(FN_DECIMAL x, FN_DECIMAL y)
const;
254 FN_DECIMAL SingleSimplexFractalBillow(FN_DECIMAL x, FN_DECIMAL y)
const;
255 FN_DECIMAL SingleSimplexFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y)
const;
256 FN_DECIMAL SingleSimplexFractalBlend(FN_DECIMAL x, FN_DECIMAL y)
const;
257 FN_DECIMAL SingleSimplex(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y)
const;
259 FN_DECIMAL SingleCubicFractalFBM(FN_DECIMAL x, FN_DECIMAL y)
const;
260 FN_DECIMAL SingleCubicFractalBillow(FN_DECIMAL x, FN_DECIMAL y)
const;
261 FN_DECIMAL SingleCubicFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y)
const;
262 FN_DECIMAL SingleCubic(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y)
const;
264 FN_DECIMAL SingleCellular(FN_DECIMAL x, FN_DECIMAL y)
const;
265 FN_DECIMAL SingleCellular2Edge(FN_DECIMAL x, FN_DECIMAL y)
const;
267 void SingleGradientPerturb(
unsigned char offset, FN_DECIMAL warpAmp, FN_DECIMAL frequency, FN_DECIMAL& x, FN_DECIMAL& y)
const;
270 FN_DECIMAL SingleValueFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
271 FN_DECIMAL SingleValueFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
272 FN_DECIMAL SingleValueFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
273 FN_DECIMAL SingleValue(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
275 FN_DECIMAL SinglePerlinFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
276 FN_DECIMAL SinglePerlinFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
277 FN_DECIMAL SinglePerlinFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
278 FN_DECIMAL SinglePerlin(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
280 FN_DECIMAL SingleSimplexFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
281 FN_DECIMAL SingleSimplexFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
282 FN_DECIMAL SingleSimplexFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
283 FN_DECIMAL SingleSimplex(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
285 FN_DECIMAL SingleCubicFractalFBM(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
286 FN_DECIMAL SingleCubicFractalBillow(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
287 FN_DECIMAL SingleCubicFractalRigidMulti(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
288 FN_DECIMAL SingleCubic(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
290 FN_DECIMAL SingleCellular(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
291 FN_DECIMAL SingleCellular2Edge(FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z)
const;
293 void SingleGradientPerturb(
unsigned char offset, FN_DECIMAL warpAmp, FN_DECIMAL frequency, FN_DECIMAL& x, FN_DECIMAL& y, FN_DECIMAL& z)
const;
296 FN_DECIMAL SingleSimplex(
unsigned char offset, FN_DECIMAL x, FN_DECIMAL y, FN_DECIMAL z, FN_DECIMAL w)
const;
298 inline unsigned char Index2D_12(
unsigned char offset,
int x,
int y)
const;
299 inline unsigned char Index3D_12(
unsigned char offset,
int x,
int y,
int z)
const;
300 inline unsigned char Index4D_32(
unsigned char offset,
int x,
int y,
int z,
int w)
const;
301 inline unsigned char Index2D_256(
unsigned char offset,
int x,
int y)
const;
302 inline unsigned char Index3D_256(
unsigned char offset,
int x,
int y,
int z)
const;
303 inline unsigned char Index4D_256(
unsigned char offset,
int x,
int y,
int z,
int w)
const;
305 inline FN_DECIMAL ValCoord2DFast(
unsigned char offset,
int x,
int y)
const;
306 inline FN_DECIMAL ValCoord3DFast(
unsigned char offset,
int x,
int y,
int z)
const;
307 inline FN_DECIMAL GradCoord2D(
unsigned char offset,
int x,
int y, FN_DECIMAL xd, FN_DECIMAL yd)
const;
308 inline FN_DECIMAL GradCoord3D(
unsigned char offset,
int x,
int y,
int z, FN_DECIMAL xd, FN_DECIMAL yd, FN_DECIMAL zd)
const;
309 inline FN_DECIMAL GradCoord4D(
unsigned char offset,
int x,
int y,
int z,
int w, FN_DECIMAL xd, FN_DECIMAL yd, FN_DECIMAL zd, FN_DECIMAL wd)
const;