using UnityEngine;
namespace LibNoise.Generator
{
///
/// Provides a noise module that outputs a three-dimensional perlin noise. [GENERATOR]
///
public class Perlin : ModuleBase
{
#region Fields
private double _frequency = 1.0;
private double _lacunarity = 2.0;
private QualityMode _quality = QualityMode.Medium;
private int _octaveCount = 6;
private double _persistence = 0.5;
private int _seed;
#endregion
#region Constructors
///
/// Initializes a new instance of Perlin.
///
public Perlin()
: base(0)
{
}
///
/// Initializes a new instance of Perlin.
///
/// The frequency of the first octave.
/// The lacunarity of the perlin noise.
/// The persistence of the perlin noise.
/// The number of octaves of the perlin noise.
/// The seed of the perlin noise.
/// The quality of the perlin noise.
public Perlin(double frequency, double lacunarity, double persistence, int octaves, int seed,
QualityMode quality)
: base(0)
{
Frequency = frequency;
Lacunarity = lacunarity;
OctaveCount = octaves;
Persistence = persistence;
Seed = seed;
Quality = quality;
}
#endregion
#region Properties
///
/// Gets or sets the frequency of the first octave.
///
public double Frequency
{
get { return _frequency; }
set { _frequency = value; }
}
///
/// Gets or sets the lacunarity of the perlin noise.
///
public double Lacunarity
{
get { return _lacunarity; }
set { _lacunarity = value; }
}
///
/// Gets or sets the quality of the perlin noise.
///
public QualityMode Quality
{
get { return _quality; }
set { _quality = value; }
}
///
/// Gets or sets the number of octaves of the perlin noise.
///
public int OctaveCount
{
get { return _octaveCount; }
set { _octaveCount = Mathf.Clamp(value, 1, Utils.OctavesMaximum); }
}
///
/// Gets or sets the persistence of the perlin noise.
///
public double Persistence
{
get { return _persistence; }
set { _persistence = value; }
}
///
/// Gets or sets the seed of the perlin noise.
///
public int Seed
{
get { return _seed; }
set { _seed = value; }
}
#endregion
#region ModuleBase Members
///
/// Returns the output value for the given input coordinates.
///
/// The input coordinate on the x-axis.
/// The input coordinate on the y-axis.
/// The input coordinate on the z-axis.
/// The resulting output value.
public override double GetValue(double x, double y, double z)
{
var value = 0.0;
var cp = 1.0;
x *= _frequency;
y *= _frequency;
z *= _frequency;
for (var i = 0; i < _octaveCount; i++)
{
var nx = Utils.MakeInt32Range(x);
var ny = Utils.MakeInt32Range(y);
var nz = Utils.MakeInt32Range(z);
var seed = (_seed + i) & 0xffffffff;
var signal = Utils.GradientCoherentNoise3D(nx, ny, nz, seed, _quality);
value += signal * cp;
x *= _lacunarity;
y *= _lacunarity;
z *= _lacunarity;
cp *= _persistence;
}
return value;
}
#endregion
}
}