public float Evaluate(float x, float y, float z) { int xi0 = ((int)Floor(x)) & TABLE_SIZE_MASK; int yi0 = ((int)Floor(y)) & TABLE_SIZE_MASK; int zi0 = ((int)Floor(z)) & TABLE_SIZE_MASK; int xi1 = (xi0 + 1) & TABLE_SIZE_MASK; int yi1 = (yi0 + 1) & TABLE_SIZE_MASK; int zi1 = (zi0 + 1) & TABLE_SIZE_MASK; float tx = x - (int)Floor(x); float ty = y - (int)Floor(y); float tz = z - (int)Floor(z); float u = MathR.Smoothstep(tx); float v = MathR.Smoothstep(ty); float w = MathR.Smoothstep(tz); // Edge Vectors Vector3 c000 = Gradient[HashV3(xi0, yi0, zi0)]; Vector3 c100 = Gradient[HashV3(xi1, yi0, zi0)]; Vector3 c010 = Gradient[HashV3(xi0, yi1, zi0)]; Vector3 c110 = Gradient[HashV3(xi1, yi1, zi0)]; Vector3 c001 = Gradient[HashV3(xi0, yi0, zi1)]; Vector3 c101 = Gradient[HashV3(xi1, yi0, zi1)]; Vector3 c011 = Gradient[HashV3(xi0, yi1, zi1)]; Vector3 c111 = Gradient[HashV3(xi1, yi1, zi1)]; float x0 = tx, x1 = tx - 1; float y0 = ty, y1 = ty - 1; float z0 = tz, z1 = tz - 1; // Point Vectors Vector3 p000 = new Vector3(x0, y0, z0); Vector3 p100 = new Vector3(x1, y0, z0); Vector3 p010 = new Vector3(x0, y1, z0); Vector3 p110 = new Vector3(x1, y1, z0); Vector3 p001 = new Vector3(x0, y0, z1); Vector3 p101 = new Vector3(x1, y0, z1); Vector3 p011 = new Vector3(x0, y1, z1); Vector3 p111 = new Vector3(x1, y1, z1); // Lerping float a = MathR.Lerp(Vector3.Dot(c000, p000), Vector3.Dot(c100, p100), u); float b = MathR.Lerp(Vector3.Dot(c010, p010), Vector3.Dot(c110, p110), u); float c = MathR.Lerp(Vector3.Dot(c001, p001), Vector3.Dot(c101, p101), u); float d = MathR.Lerp(Vector3.Dot(c011, p011), Vector3.Dot(c111, p111), u); float e = MathR.Lerp(a, b, v); float f = MathR.Lerp(c, d, v); return(MathR.Lerp(e, f, w)); }