195 lines
8.7 KiB
C
195 lines
8.7 KiB
C
/* Copyright (c) 2007-2012 Eliot Eshelman
|
|
*
|
|
* 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 3 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef SIMPLEX_H_
|
|
#define SIMPLEX_H_
|
|
|
|
|
|
/* 2D, 3D and 4D Simplex Noise functions return 'random' values in (-1, 1).
|
|
|
|
This algorithm was originally designed by Ken Perlin, but my code has been
|
|
adapted from the implementation written by Stefan Gustavson (stegu@itn.liu.se)
|
|
|
|
Raw Simplex noise functions return the value generated by Ken's algorithm.
|
|
|
|
Scaled Raw Simplex noise functions adjust the range of values returned from the
|
|
traditional (-1, 1) to whichever bounds are passed to the function.
|
|
|
|
Multi-Octave Simplex noise functions compine multiple noise values to create a
|
|
more complex result. Each successive layer of noise is adjusted and scaled.
|
|
|
|
Scaled Multi-Octave Simplex noise functions scale the values returned from the
|
|
traditional (-1,1) range to whichever range is passed to the function.
|
|
|
|
In many cases, you may think you only need a 1D noise function, but in practice
|
|
2D is almost always better. For instance, if you're using the current frame
|
|
number as the parameter for the noise, all objects will end up with the same
|
|
noise value at each frame. By adding a second parameter on the second
|
|
dimension, you can ensure that each gets a unique noise value and they don't
|
|
all look identical.
|
|
*/
|
|
|
|
|
|
// Multi-octave Simplex noise
|
|
// For each octave, a higher frequency/lower amplitude function will be added to the original.
|
|
// The higher the persistence [0-1], the more of each succeeding octave will be added.
|
|
float octave_noise_2d(const float octaves,
|
|
const float persistence,
|
|
const float scale,
|
|
const float x,
|
|
const float y);
|
|
float octave_noise_3d(const float octaves,
|
|
const float persistence,
|
|
const float scale,
|
|
const float x,
|
|
const float y,
|
|
const float z);
|
|
float octave_noise_4d(const float octaves,
|
|
const float persistence,
|
|
const float scale,
|
|
const float x,
|
|
const float y,
|
|
const float z,
|
|
const float w);
|
|
|
|
|
|
// Scaled Multi-octave Simplex noise
|
|
// The result will be between the two parameters passed.
|
|
float scaled_octave_noise_2d( const float octaves,
|
|
const float persistence,
|
|
const float scale,
|
|
const float loBound,
|
|
const float hiBound,
|
|
const float x,
|
|
const float y);
|
|
float scaled_octave_noise_3d( const float octaves,
|
|
const float persistence,
|
|
const float scale,
|
|
const float loBound,
|
|
const float hiBound,
|
|
const float x,
|
|
const float y,
|
|
const float z);
|
|
float scaled_octave_noise_4d( const float octaves,
|
|
const float persistence,
|
|
const float scale,
|
|
const float loBound,
|
|
const float hiBound,
|
|
const float x,
|
|
const float y,
|
|
const float z,
|
|
const float w);
|
|
|
|
// Scaled Raw Simplex noise
|
|
// The result will be between the two parameters passed.
|
|
float scaled_raw_noise_2d( const float loBound,
|
|
const float hiBound,
|
|
const float x,
|
|
const float y);
|
|
float scaled_raw_noise_3d( const float loBound,
|
|
const float hiBound,
|
|
const float x,
|
|
const float y,
|
|
const float z);
|
|
float scaled_raw_noise_4d( const float loBound,
|
|
const float hiBound,
|
|
const float x,
|
|
const float y,
|
|
const float z,
|
|
const float w);
|
|
|
|
|
|
// Raw Simplex noise - a single noise value.
|
|
float raw_noise_2d(const float x, const float y);
|
|
float raw_noise_3d(const float x, const float y, const float z);
|
|
float raw_noise_4d(const float x, const float y, const float, const float w);
|
|
|
|
|
|
int fastfloor(const float x);
|
|
|
|
float dot(const int* g, const float x, const float y);
|
|
float dot(const int* g, const float x, const float y, const float z);
|
|
float dot(const int* g, const float x, const float y, const float z, const float w);
|
|
|
|
|
|
// The gradients are the midpoints of the vertices of a cube.
|
|
static const int grad3[12][3] = {
|
|
{1,1,0}, {-1,1,0}, {1,-1,0}, {-1,-1,0},
|
|
{1,0,1}, {-1,0,1}, {1,0,-1}, {-1,0,-1},
|
|
{0,1,1}, {0,-1,1}, {0,1,-1}, {0,-1,-1}
|
|
};
|
|
|
|
|
|
// The gradients are the midpoints of the vertices of a hypercube.
|
|
static const int grad4[32][4]= {
|
|
{0,1,1,1}, {0,1,1,-1}, {0,1,-1,1}, {0,1,-1,-1},
|
|
{0,-1,1,1}, {0,-1,1,-1}, {0,-1,-1,1}, {0,-1,-1,-1},
|
|
{1,0,1,1}, {1,0,1,-1}, {1,0,-1,1}, {1,0,-1,-1},
|
|
{-1,0,1,1}, {-1,0,1,-1}, {-1,0,-1,1}, {-1,0,-1,-1},
|
|
{1,1,0,1}, {1,1,0,-1}, {1,-1,0,1}, {1,-1,0,-1},
|
|
{-1,1,0,1}, {-1,1,0,-1}, {-1,-1,0,1}, {-1,-1,0,-1},
|
|
{1,1,1,0}, {1,1,-1,0}, {1,-1,1,0}, {1,-1,-1,0},
|
|
{-1,1,1,0}, {-1,1,-1,0}, {-1,-1,1,0}, {-1,-1,-1,0}
|
|
};
|
|
|
|
|
|
// Permutation table. The same list is repeated twice.
|
|
static const int perm[512] = {
|
|
151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
|
|
8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
|
|
35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,
|
|
134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
|
|
55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 89,
|
|
18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,
|
|
250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
|
|
189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,
|
|
172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,
|
|
228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,
|
|
107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,
|
|
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,
|
|
|
|
151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
|
|
8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
|
|
35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,
|
|
134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
|
|
55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 89,
|
|
18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,
|
|
250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
|
|
189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,
|
|
172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,
|
|
228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,
|
|
107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,
|
|
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
|
|
};
|
|
|
|
|
|
// A lookup table to traverse the simplex around a given point in 4D.
|
|
static const int simplex[64][4] = {
|
|
{0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0},
|
|
{0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0},
|
|
{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
|
|
{1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0},
|
|
{1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0},
|
|
{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
|
|
{2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0},
|
|
{2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}
|
|
};
|
|
|
|
|
|
#endif /*SIMPLEX_H_*/
|