using System;
using UnityEngine;
namespace LibNoise.Generator
{
///
/// Provides a noise module that outputs a three-dimensional billowy noise. [GENERATOR]
///
public class Billow : 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 Billow.
///
public Billow()
: base(0)
{
}
///
/// Initializes a new instance of Billow.
///
/// The frequency of the first octave.
/// The lacunarity of the billowy noise.
/// The persistence of the billowy noise.
/// The number of octaves of the billowy noise.
/// The seed of the billowy noise.
/// The quality of the billowy noise.
public Billow(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 billowy noise.
///
public double Lacunarity
{
get { return _lacunarity; }
set { _lacunarity = value; }
}
///
/// Gets or sets the quality of the billowy noise.
///
public QualityMode Quality
{
get { return _quality; }
set { _quality = value; }
}
///
/// Gets or sets the number of octaves of the billowy noise.
///
public int OctaveCount
{
get { return _octaveCount; }
set { _octaveCount = Mathf.Clamp(value, 1, Utils.OctavesMaximum); }
}
///
/// Gets or sets the persistence of the billowy noise.
///
public double Persistence
{
get { return _persistence; }
set { _persistence = value; }
}
///
/// Gets or sets the seed of the billowy 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 curp = 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);
signal = 2.0 * Math.Abs(signal) - 1.0;
value += signal * curp;
x *= _lacunarity;
y *= _lacunarity;
z *= _lacunarity;
curp *= _persistence;
}
return value + 0.5;
}
#endregion
}
}