public Task ModifyVertices(SQT.Context context, SQT.Node node, CancellationTokenSource cancellation)
 {
     return(Task.Factory.StartNew(() =>
     {
         for (int i = 0; i < node.positions.Length; i++)
         {
             Noise.Perlin.PerlinSample sample = GetSample(node.positions[i]);
             node.positions[i] += node.normals[i] * sample.value;
             node.normals[i] = (node.normals[i] - sample.derivative).normalized;
         }
     }, cancellation.Token));
 }
        Noise.Perlin.PerlinSample GetSample(Vector3 position)
        {
            float strength  = this.strength;
            float frequency = this.frequency;

            Noise.Perlin.PerlinSample sum = GetSample(position, frequency) * strength;
            for (int i = 1; i < octaves; i++)
            {
                strength  *= persistence;
                frequency *= lacunarity;
                Noise.Perlin.PerlinSample sample = GetSample(position, frequency) * strength;
                sum += sample;
            }
            return(sum);
        }
 Noise.Perlin.PerlinSample GetSample(Vector3 position, float frequency)
 {
     Noise.Perlin.PerlinSample sample = perlin.Sample(position * frequency);
     sample.derivative *= frequency;
     return(sample);
 }