Created
August 27, 2013 13:16
-
-
Save jonbro/6353378 to your computer and use it in GitHub Desktop.
simplex noise for unity (via tom nullpointer)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| private int[] A = new int[3]; | |
| private float s, u, v, w; | |
| private int i, j, k; | |
| private float onethird = 0.333333333f; | |
| private float onesixth = 0.166666667f; | |
| private int[] T; | |
| // Simplex Noise Generator | |
| public float noise(float x, float y, float z) | |
| { | |
| if (T == null)//do we have the seed set up? | |
| { | |
| int seed=33;//a preset seed if you wanted to set one inline | |
| //seed = Random.Range(0,100);//this was grabbing the seed from a manager class elsewhere | |
| seed=C_VoxChunkLocalGenerator.m_Instance.m_Seed; | |
| System.Random rand = new System.Random(seed);//generates the starter value for the generator | |
| T = new int[8]; | |
| for (int q = 0; q < 8; q++) | |
| T[q] = rand.Next(); | |
| } | |
| s = (x + y + z) * onethird; | |
| i = fastfloor(x + s); | |
| j = fastfloor(y + s); | |
| k = fastfloor(z + s); | |
| s = (i + j + k) * onesixth; | |
| u = x - i + s; | |
| v = y - j + s; | |
| w = z - k + s; | |
| A[0] = 0; A[1] = 0; A[2] = 0; | |
| int hi = u >= w ? u >= v ? 0 : 1 : v >= w ? 1 : 2; | |
| int lo = u < w ? u < v ? 0 : 1 : v < w ? 1 : 2; | |
| return kay(hi) + kay(3 - hi - lo) + kay(lo) + kay(0) +.5f;//ive added .5f to make it centre around .5 | |
| } | |
| float kay(int a) | |
| { | |
| s = (A[0] + A[1] + A[2]) * onesixth; | |
| float x = u - A[0] + s; | |
| float y = v - A[1] + s; | |
| float z = w - A[2] + s; | |
| float t = 0.6f - x * x - y * y - z * z; | |
| int h = shuffle(i + A[0], j + A[1], k + A[2]); | |
| A[a]++; | |
| if (t < 0) return 0; | |
| int b5 = h >> 5 & 1; | |
| int b4 = h >> 4 & 1; | |
| int b3 = h >> 3 & 1; | |
| int b2 = h >> 2 & 1; | |
| int b1 = h & 3; | |
| float p = b1 == 1 ? x : b1 == 2 ? y : z; | |
| float q = b1 == 1 ? y : b1 == 2 ? z : x; | |
| float r = b1 == 1 ? z : b1 == 2 ? x : y; | |
| p = b5 == b3 ? -p : p; | |
| q = b5 == b4 ? -q : q; | |
| r = b5 != (b4 ^ b3) ? -r : r; | |
| t *= t; | |
| return 8 * t * t * (p + (b1 == 0 ? q + r : b2 == 0 ? q : r)); | |
| } | |
| int shuffle(int i, int j, int k) | |
| { | |
| return b(i, j, k, 0) + b(j, k, i, 1) + b(k, i, j, 2) + b(i, j, k, 3) + b(j, k, i, 4) + b(k, i, j, 5) + b(i, j, k, 6) + b(j, k, i, 7); | |
| } | |
| int b(int i, int j, int k, int B) | |
| { | |
| return T[b(i, B) << 2 | b(j, B) << 1 | b(k, B)]; | |
| } | |
| int b(int N, int B) | |
| { | |
| return N >> B & 1; | |
| } | |
| int fastfloor(float n) | |
| { | |
| return n > 0 ? (int)n : (int)n - 1; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment