Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Simplex Noise in C# for Unity3D - Adapted from James Livingston's MinePackage: http://forum.unity3d.com/threads/minepackage-minecraft-starter-package.69573/
using UnityEngine;
using System.Collections;
public class SimplexNoiseGenerator {
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;
public SimplexNoiseGenerator() {
if (T == null) {
System.Random rand = new System.Random();
T = new int[8];
for (int q = 0; q < 8; q++)
T[q] = rand.Next();
}
}
public SimplexNoiseGenerator(string seed) {
T = new int[8];
string[] seed_parts = seed.Split(new char[] {' '});
for(int q = 0; q < 8; q++) {
int b;
try {
b = int.Parse(seed_parts[q]);
} catch {
b = 0x0;
}
T[q] = b;
}
}
public SimplexNoiseGenerator(int[] seed) { // {0x16, 0x38, 0x32, 0x2c, 0x0d, 0x13, 0x07, 0x2a}
T = seed;
}
public string GetSeed() {
string seed = "";
for(int q=0; q < 8; q++) {
seed += T[q].ToString();
if(q < 7)
seed += " ";
}
return seed;
}
public float coherentNoise(float x, float y, float z, int octaves=1, int multiplier = 25, float amplitude = 0.5f, float lacunarity = 2, float persistence = 0.9f) {
Vector3 v3 = new Vector3(x,y,z)/multiplier;
float val = 0;
for (int n = 0; n < octaves; n++) {
val += noise(v3.x,v3.y,v3.z) * amplitude;
v3 *= lacunarity;
amplitude *= persistence;
}
return val;
}
public int getDensity(Vector3 loc) {
float val = coherentNoise(loc.x, loc.y, loc.z);
return (int)Mathf.Lerp(0,255,val);
}
// Simplex Noise Generator
public float noise(float x, float y, float z) {
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);
}
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;
}
}

To use this in a Unity project do I simply drop this script onto an empty gameObject, or do I need to install any prerequisites?

What is the range of the noise function?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment