using System.Diagnostics;
namespace LibNoise.Operator
{
///
/// Provides a noise module that uses three source modules to displace each
/// coordinate of the input value before returning the output value from
/// a source module. [OPERATOR]
///
public class Displace : ModuleBase
{
#region Constructors
///
/// Initializes a new instance of Displace.
///
public Displace()
: base(4)
{
}
///
/// Initializes a new instance of Displace.
///
/// The input module.
/// The displacement module of the x-axis.
/// The displacement module of the y-axis.
/// The displacement module of the z-axis.
public Displace(ModuleBase input, ModuleBase x, ModuleBase y, ModuleBase z)
: base(4)
{
Modules[0] = input;
Modules[1] = x;
Modules[2] = y;
Modules[3] = z;
}
#endregion
#region Properties
///
/// Gets or sets the controlling module on the x-axis.
///
public ModuleBase X
{
get { return Modules[1]; }
set
{
Debug.Assert(value != null);
Modules[1] = value;
}
}
///
/// Gets or sets the controlling module on the z-axis.
///
public ModuleBase Y
{
get { return Modules[2]; }
set
{
Debug.Assert(value != null);
Modules[2] = value;
}
}
///
/// Gets or sets the controlling module on the z-axis.
///
public ModuleBase Z
{
get { return Modules[3]; }
set
{
Debug.Assert(value != null);
Modules[3] = 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)
{
Debug.Assert(Modules[0] != null);
Debug.Assert(Modules[1] != null);
Debug.Assert(Modules[2] != null);
Debug.Assert(Modules[3] != null);
var dx = x + Modules[1].GetValue(x, y, z);
var dy = y + Modules[2].GetValue(x, y, z);
var dz = z + Modules[3].GetValue(x, y, z);
return Modules[0].GetValue(dx, dy, dz);
}
#endregion
}
}