diff --git a/CubicNoise/Contracts/INoiseEngine.cs b/CubicNoise/Contracts/INoiseEngine.cs
index 40e2943..15f9140 100644
--- a/CubicNoise/Contracts/INoiseEngine.cs
+++ b/CubicNoise/Contracts/INoiseEngine.cs
@@ -4,10 +4,24 @@ using System.Text;
namespace CubicNoise.Contracts
{
+ ///
+ /// An interface which each noise generator must implement.
+ ///
public interface INoiseEngine
{
+ ///
+ /// Producing a one-dimensional based noise value.
+ ///
+ /// The x coordinate.
+ /// The noise value.
float Get(float x);
+ ///
+ /// Produces a two-dimensional based noise value.
+ ///
+ /// The x coordinate.
+ /// The y coordinate.
+ /// The noise value.
float Get(float x, float y);
}
}
diff --git a/CubicNoise/Contracts/IParameterName.cs b/CubicNoise/Contracts/IParameterName.cs
index 6c7398f..89cf4d2 100644
--- a/CubicNoise/Contracts/IParameterName.cs
+++ b/CubicNoise/Contracts/IParameterName.cs
@@ -1,5 +1,11 @@
namespace CubicNoise.Contracts
{
+ ///
+ /// An interface which gets used to provide arbitrary parameter names
+ /// to the general noise engine class. It is a way to abstract the
+ /// concrete (but to the general noise engine class unknown) parameters
+ /// for different noise generators.
+ ///
public interface IParameterName
{
}
diff --git a/CubicNoise/CubicNoise.csproj b/CubicNoise/CubicNoise.csproj
index e6c458a..1d49885 100644
--- a/CubicNoise/CubicNoise.csproj
+++ b/CubicNoise/CubicNoise.csproj
@@ -16,6 +16,10 @@
C:\Users\Thorsten\Downloads\repos\CubicNoise\CubicNoise\CubicNoise.xml
+
+ C:\Users\Thorsten\Downloads\repos\CubicNoise\CubicNoise\CubicNoise.xml
+
+
True
diff --git a/CubicNoise/CubicNoise.xml b/CubicNoise/CubicNoise.xml
index a5432eb..f0d302e 100644
--- a/CubicNoise/CubicNoise.xml
+++ b/CubicNoise/CubicNoise.xml
@@ -4,5 +4,165 @@
CubicNoise
+
+
+ An interface which each noise generator must implement.
+
+
+
+
+ Producing a one-dimensional based noise value.
+
+ The x coordinate.
+ The noise value.
+
+
+
+ Produces a two-dimensional based noise value.
+
+ The x coordinate.
+ The y coordinate.
+ The noise value.
+
+
+
+ An interface which gets used to provide arbitrary parameter names
+ to the general noise engine class. It is a way to abstract the
+ concrete (but to the general noise engine class unknown) parameters
+ for different noise generators.
+
+
+
+
+ This class stores all parameters needed to create a noise engine instance.
+
+
+
+
+ The engine's seed value. To use a string value as seed, use the GetDeterministicHashCode() method
+ which gets provided by this library. A different seed value results in a complete different result.
+ When you generate e.g. a landscape, two different seeds will produce different landscapes.
+
+
+
+
+ The desired kind of noise generator.
+
+
+
+
+ A dictionary of additional parameters needed by the chosen noise generator.
+
+
+
+
+ Extension methods for this library.
+
+
+
+
+ This is a deterministic hash function for strings. The official hash methods in .NET Core are no longer
+ deterministic due to possible hashing attacks, cf. https://youtu.be/R2Cq3CLI6H8.
+
+ The source for this implementation: https://andrewlock.net/why-is-string-gethashcode-different-each-time-i-run-my-program-in-net-core/.
+ Thanks Andrew for providing such a hash function.
+
+ Aware: Never use this hash function for any security-related task or for any hashtable storage, etc.
+
+ Please use it only in the case, that you really need a deterministic value. In the context of this
+ library, the hash values are usually used for media, games, art, or simulations in order to share
+ results with others. This is the only valid use case!
+
+ The string for which a hash value is to be computed.
+ A deterministic 32 bit / 4 byte hash value of the given string.
+
+
+
+ The main class of the library. You should use it to generate a noise engine. This class is thread-safe.
+ You can use all methods from as many threads, as you want. There a no async methods, because the
+ performance is very high. Even on a 2019 mid-size business laptop with Intel i5 CPU, each core
+ is able to produce > 6 million values per second (2 dimensions).
+
+ Not only the factory method is thread-safe. Each instance of the class is thread-safe as well.
+
+
+
+
+ The factory method to use for generating a noise engine. This method is thread-safe. Call it from as many threads
+ as you want.
+
+ The parameters for the desired noise engine.
+ The desired noise engine instance.
+
+
+
+ Yields a one-dimensional based noise value. This method is thread-safe as well. Call it from as
+ many threads as you want. You can expect about 16 million calls per CPU core per second (year 2019).
+
+ The x coordinate.
+ The corresponding noise value for the given coordinate.
+
+
+
+ Yields a two-dimensional based noise value. This method is thread-safe as well. Call it from as
+ many threads as you want. You can expect about 6 million calls per CPU core per second (year 2019).
+
+ The x coordinate.
+ The y coordinate.
+ The corresponding noise value for the given 2d coordinate.
+
+
+
+ This is the cubic noise engine by Job Talle, cf. https://jobtalle.com/cubic_noise.html. It based on the
+ C# version which was provided at Github: https://github.com/jobtalle/CubicNoise/blob/master/c%23/CubicNoise.cs.
+
+ Thanks Job for your implementation.
+
+ Compared to Job's version, this implementation is a bit optimized and
+ used useful C# 8.0 / .NET Core 3.1 LTS features.
+
+
+
+
+ This class contains all known cubic noise's parameters.
+
+
+
+
+ Cubic noise's octave parameter.
+
+
+
+
+ Cubic noise's period x parameter.
+
+
+
+
+ Cubic noise's period y parameter.
+
+
+
+
+ This is the random number engine which gets used in case that the UNKNOWN type was used.
+ This engine is not meant for production. It is a placeholder for empty values, where a type
+ is needed. The engine will generate a random value each time.
+
+
+
+
+ All implemented noise generators.
+
+
+
+
+ The UNKNOWN generator is a placeholder for empty values. You should not use it in production. It generates random numbers on every call.
+
+
+
+
+ This is the cubic noise generator by Job Talle, cf. https://jobtalle.com/cubic_noise.html and https://github.com/jobtalle.
+
+
diff --git a/CubicNoise/EngineParameters.cs b/CubicNoise/EngineParameters.cs
index 1ebaf04..bb4cd25 100644
--- a/CubicNoise/EngineParameters.cs
+++ b/CubicNoise/EngineParameters.cs
@@ -5,12 +5,26 @@ using CubicNoise.Contracts;
namespace CubicNoise
{
+ ///
+ /// This class stores all parameters needed to create a noise engine instance.
+ ///
public sealed class EngineParameters
{
+ ///
+ /// The engine's seed value. To use a string value as seed, use the GetDeterministicHashCode() method
+ /// which gets provided by this library. A different seed value results in a complete different result.
+ /// When you generate e.g. a landscape, two different seeds will produce different landscapes.
+ ///
public int Seed { get; set; } = new Random().Next();
+ ///
+ /// The desired kind of noise generator.
+ ///
public NoiseTypes Type { get; set; } = NoiseTypes.UNKNOWN;
+ ///
+ /// A dictionary of additional parameters needed by the chosen noise generator.
+ ///
public IReadOnlyDictionary IntParameters { get; set; }
}
}
diff --git a/CubicNoise/Extensions.cs b/CubicNoise/Extensions.cs
index f9e4530..d77fcc8 100644
--- a/CubicNoise/Extensions.cs
+++ b/CubicNoise/Extensions.cs
@@ -5,9 +5,27 @@ using CubicNoise.Noisers;
namespace CubicNoise
{
+ ///
+ /// Extension methods for this library.
+ ///
public static class Extensions
{
- // Source: https://andrewlock.net/why-is-string-gethashcode-different-each-time-i-run-my-program-in-net-core/
+ //
+ ///
+ /// This is a deterministic hash function for strings. The official hash methods in .NET Core are no longer
+ /// deterministic due to possible hashing attacks, cf. https://youtu.be/R2Cq3CLI6H8.
+ ///
+ /// The source for this implementation: https://andrewlock.net/why-is-string-gethashcode-different-each-time-i-run-my-program-in-net-core/.
+ /// Thanks Andrew for providing such a hash function.
+ ///
+ /// Aware: Never use this hash function for any security-related task or for any hashtable storage, etc.
+ ///
+ /// Please use it only in the case, that you really need a deterministic value. In the context of this
+ /// library, the hash values are usually used for media, games, art, or simulations in order to share
+ /// results with others. This is the only valid use case!
+ ///
+ /// The string for which a hash value is to be computed.
+ /// A deterministic 32 bit / 4 byte hash value of the given string.
public static int GetDeterministicHashCode(this string str)
{
unchecked
diff --git a/CubicNoise/NoiseEngine.cs b/CubicNoise/NoiseEngine.cs
index 9e448f7..4d8d763 100644
--- a/CubicNoise/NoiseEngine.cs
+++ b/CubicNoise/NoiseEngine.cs
@@ -6,6 +6,14 @@ using CubicNoise.Noisers;
namespace CubicNoise
{
+ ///
+ /// The main class of the library. You should use it to generate a noise engine. This class is thread-safe.
+ /// You can use all methods from as many threads, as you want. There a no async methods, because the
+ /// performance is very high. Even on a 2019 mid-size business laptop with Intel i5 CPU, each core
+ /// is able to produce > 6 million values per second (2 dimensions).
+ ///
+ /// Not only the factory method is thread-safe. Each instance of the class is thread-safe as well.
+ ///
public sealed class NoiseEngine : INoiseEngine
{
private readonly INoiseEngine engine;
@@ -22,10 +30,29 @@ namespace CubicNoise
};
}
+ ///
+ /// The factory method to use for generating a noise engine. This method is thread-safe. Call it from as many threads
+ /// as you want.
+ ///
+ /// The parameters for the desired noise engine.
+ /// The desired noise engine instance.
public static NoiseEngine Create(EngineParameters parameters) => new NoiseEngine(parameters.Type, parameters.Seed, parameters?.IntParameters);
+ ///
+ /// Yields a one-dimensional based noise value. This method is thread-safe as well. Call it from as
+ /// many threads as you want. You can expect about 16 million calls per CPU core per second (year 2019).
+ ///
+ /// The x coordinate.
+ /// The corresponding noise value for the given coordinate.
public float Get(float x) => this.engine.Get(x);
+ ///
+ /// Yields a two-dimensional based noise value. This method is thread-safe as well. Call it from as
+ /// many threads as you want. You can expect about 6 million calls per CPU core per second (year 2019).
+ ///
+ /// The x coordinate.
+ /// The y coordinate.
+ /// The corresponding noise value for the given 2d coordinate.
public float Get(float x, float y) => this.engine.Get(x, y);
}
}
diff --git a/CubicNoise/NoiseTypes.cs b/CubicNoise/NoiseTypes.cs
index 0306436..ef1d55d 100644
--- a/CubicNoise/NoiseTypes.cs
+++ b/CubicNoise/NoiseTypes.cs
@@ -4,9 +4,19 @@ using System.Text;
namespace CubicNoise
{
+ ///
+ /// All implemented noise generators.
+ ///
public enum NoiseTypes
{
+ ///
+ /// The UNKNOWN generator is a placeholder for empty values. You should not use it in production. It generates random numbers on every call.
+ ///
UNKNOWN = 0,
+
+ ///
+ /// This is the cubic noise generator by Job Talle, cf. https://jobtalle.com/cubic_noise.html and https://github.com/jobtalle.
+ ///
CUBIC_NOISE = 1_000,
}
}
diff --git a/CubicNoise/Noisers/CubicNoiseEngine.cs b/CubicNoise/Noisers/CubicNoiseEngine.cs
index 51498dc..4c0fd68 100644
--- a/CubicNoise/Noisers/CubicNoiseEngine.cs
+++ b/CubicNoise/Noisers/CubicNoiseEngine.cs
@@ -6,7 +6,16 @@ using CubicNoise.Contracts;
namespace CubicNoise.Noisers
{
- public sealed class CubicNoiseEngine : INoiseEngine
+ ///
+ /// This is the cubic noise engine by Job Talle, cf. https://jobtalle.com/cubic_noise.html. It based on the
+ /// C# version which was provided at Github: https://github.com/jobtalle/CubicNoise/blob/master/c%23/CubicNoise.cs.
+ ///
+ /// Thanks Job for your implementation.
+ ///
+ /// Compared to Job's version, this implementation is a bit optimized and
+ /// used useful C# 8.0 / .NET Core 3.1 LTS features.
+ ///
+ internal sealed class CubicNoiseEngine : INoiseEngine
{
private const int RANDOM_NUMBER_A = 134_775_813;
private const int RANDOM_NUMBER_B = 1_103_515_245;
@@ -16,7 +25,7 @@ namespace CubicNoise.Noisers
private readonly int periodY;
private readonly int seed;
- public CubicNoiseEngine(int seed, IReadOnlyDictionary intParameters)
+ internal CubicNoiseEngine(int seed, IReadOnlyDictionary intParameters)
{
this.seed = seed;
this.octave = intParameters?.ContainsKey(CubicNoiseIntParameters.OCTAVE) == true ? intParameters[CubicNoiseIntParameters.OCTAVE] : 16;
diff --git a/CubicNoise/Noisers/CubicNoiseIntParameters.cs b/CubicNoise/Noisers/CubicNoiseIntParameters.cs
index c9f0741..811ee7f 100644
--- a/CubicNoise/Noisers/CubicNoiseIntParameters.cs
+++ b/CubicNoise/Noisers/CubicNoiseIntParameters.cs
@@ -5,10 +5,24 @@ using CubicNoise.Contracts;
namespace CubicNoise.Noisers
{
+ ///
+ /// This class contains all known cubic noise's parameters.
+ ///
public class CubicNoiseIntParameters : IParameterName
{
+ ///
+ /// Cubic noise's octave parameter.
+ ///
public static readonly IParameterName OCTAVE = new CubicNoiseIntParameters();
+
+ ///
+ /// Cubic noise's period x parameter.
+ ///
public static readonly IParameterName PERIOD_X = new CubicNoiseIntParameters();
+
+ ///
+ /// Cubic noise's period y parameter.
+ ///
public static readonly IParameterName PERIOD_Y = new CubicNoiseIntParameters();
private CubicNoiseIntParameters()
diff --git a/CubicNoise/Noisers/RandomNumberEngine.cs b/CubicNoise/Noisers/RandomNumberEngine.cs
index 3e8afca..a98b021 100644
--- a/CubicNoise/Noisers/RandomNumberEngine.cs
+++ b/CubicNoise/Noisers/RandomNumberEngine.cs
@@ -5,11 +5,16 @@ using CubicNoise.Contracts;
namespace CubicNoise.Noisers
{
- public sealed class RandomNumberEngine : INoiseEngine
+ ///
+ /// This is the random number engine which gets used in case that the UNKNOWN type was used.
+ /// This engine is not meant for production. It is a placeholder for empty values, where a type
+ /// is needed. The engine will generate a random value each time.
+ ///
+ internal sealed class RandomNumberEngine : INoiseEngine
{
- private Random rng;
+ private readonly Random rng;
- public RandomNumberEngine(int seed)
+ internal RandomNumberEngine(int seed)
{
this.rng = new Random(seed);
}