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 } }