/// <summary>
/// Reads from the provided file name all parameters and data for a
/// heightmap. If the data for the heightmap does not exist, then
/// no data is written to the provided texture.
/// </summary>
/// <param name='fileName'>
/// The file name. This can be relative or fully-qualified.
/// </param>
/// <param name='no'>
/// The <see cref="NormalOptions" /> that will store read-in parameters.
/// </param>
/// <param name='co'>
/// The <see cref="CloudOptions" /> that will store read-in parameters for
/// <see cref="CloudFractal" />.
/// </param>
/// <param name='wo'>
/// The <see cref="WorleyOptions" /> that will store read-in parameters for
/// <see cref="WorleyNoise" />.
/// </param>
/// <param name='tex'>
/// The <code>Texture2D</code> containing the heightmap data.
/// </param>
public static void Read(string fileName, ref NormalOptions no,
ref CloudOptions co, ref VoronoiOptions vo,
ref Texture2D tex)
{
using(BinaryReader r = new BinaryReader(File.OpenRead(fileName)))
{
no.size = r.ReadInt32();
no.seed = r.ReadInt32();
no.cloudInf = r.ReadSingle();
no.voronoiInf = r.ReadSingle();
no.useThermalErosion = r.ReadBoolean();
no.useHydroErosion = r.ReadBoolean();
no.showSeams = r.ReadBoolean();
co.upperLeftStart = r.ReadSingle();
co.lowerLeftStart = r.ReadSingle();
co.lowerRightStart = r.ReadSingle();
co.upperRightStart = r.ReadSingle();
vo.metric = (DistanceFunctions.DistanceMetric)r.ReadInt32();
vo.combiner = (CombinerFunctions.CombineFunction)r.ReadInt32();
vo.numberOfFeaturePoints = r.ReadInt32();
vo.numberOfSubregions = r.ReadInt32();
vo.multiplier = r.ReadSingle();
tex.Resize(no.size, no.size);
int bLeft = (int)(r.BaseStream.Length - r.BaseStream.Position);
if(bLeft > 0)
tex.LoadImage(r.ReadBytes(bLeft));
}
}