public float Noise(Vec3 vec) { var cube = vec.Floor(); var pt = vec - cube; var faded = Fade(pt); var X = (int)cube.X; var Y = (int)cube.Y; var Z = (int)cube.Z; int A = Permutation(X) + Y, AA = Permutation(A) + Z, AB = Permutation(A + 1) + Z, B = Permutation(X + 1) + Y, BA = Permutation(B) + Z, BB = Permutation(B + 1) + Z; return(FMath.Mix( FMath.Mix( FMath.Mix( Gradient(Permutation(AA), pt.X, pt.Y, pt.Z), Gradient(Permutation(BA), pt.X - 1f, pt.Y, pt.Z), faded.X), FMath.Mix( Gradient(Permutation(AB), pt.X, pt.Y - 1f, pt.Z), Gradient(Permutation(BB), pt.X - 1f, pt.Y - 1f, pt.Z), faded.X), faded.Y), FMath.Mix( FMath.Mix( Gradient(Permutation(AA + 1), pt.X, pt.Y, pt.Z - 1f), Gradient(Permutation(BA + 1), pt.X - 1f, pt.Y, pt.Z - 1f), faded.X), FMath.Mix( Gradient(Permutation(AB + 1), pt.X, pt.Y - 1f, pt.Z - 1f), Gradient(Permutation(BB + 1), pt.X - 1f, pt.Y - 1f, pt.Z - 1f), faded.X), faded.Y), faded.Z)); }
public float PeriodicNoise(Vec3 vec, Vec3 period) { var cube = vec.Floor(); var pt = vec - cube; var faded = Fade(pt); var iv = cube.Mod(period).Floor().ToVeci(); var jv = (cube + new Vec3(1f)).Mod(period).Floor().ToVeci(); int A = Permutation(iv.X), AA = Permutation(A + iv.Y), AB = Permutation(A + jv.Y), B = Permutation(jv.X), BA = Permutation(B + iv.Y), BB = Permutation(B + jv.Y); return(FMath.Mix( FMath.Mix( FMath.Mix( Gradient(Permutation(AA + iv.Z), pt.X, pt.Y, pt.Z), Gradient(Permutation(BA + iv.Z), pt.X - 1f, pt.Y, pt.Z), faded.X), FMath.Mix( Gradient(Permutation(AB + iv.Z), pt.X, pt.Y - 1f, pt.Z), Gradient(Permutation(BB + iv.Z), pt.X - 1f, pt.Y - 1f, pt.Z), faded.X), faded.Y), FMath.Mix( FMath.Mix( Gradient(Permutation(AA + jv.Z), pt.X, pt.Y, pt.Z - 1f), Gradient(Permutation(BA + jv.Z), pt.X - 1f, pt.Y, pt.Z - 1f), faded.X), FMath.Mix( Gradient(Permutation(AB + jv.Z), pt.X, pt.Y - 1f, pt.Z - 1f), Gradient(Permutation(BB + jv.Z), pt.X - 1f, pt.Y - 1f, pt.Z - 1f), faded.X), faded.Y), faded.Z)); }
public static V Mix <V> (this V vec, V other, float interPos) where V : struct, IVec <V, float> { return(vec.Map2 <V, float> (other, (x, y) => FMath.Mix(x, y, interPos))); }