diff --git a/core/include/vf/NoiseAdv.h b/core/include/vf/NoiseAdv.h new file mode 100644 index 0000000..103f510 --- /dev/null +++ b/core/include/vf/NoiseAdv.h @@ -0,0 +1,79 @@ +#pragma once + +#include +#include + +namespace vf { + +// Distance metric used by worley2D to turn a feature-point offset into a +// scalar cell distance. +enum class DistanceMetric : uint8_t { + Euclidean = 0, + Manhattan = 1, + Chebyshev = 2, +}; + +// Closest (f1) and second-closest (f2) feature point distances for a worley +// sample, plus the integer cell that produced the closest point. +struct WorleyResult { + float f1 = 0.0f; + float f2 = 0.0f; + int cellX = 0; + int cellY = 0; +}; + +struct FbmParams { + int octaves = 5; + float lacunarity = 2.0f; + float gain = 0.5f; + float frequency = 1.0f; + float amplitude = 1.0f; +}; + +// Seeded advanced noise toolkit: gradient simplex noise (2D/3D), cellular +// (worley) noise with selectable distance metric, ridged multifractal, +// domain-warped fBm and lattice value noise. All outputs are clamped or +// normalised to land in [-1, 1] (worley distances excepted, which are +// unbounded by nature). Distinct symbol names from vf::PerlinNoise in +// Noise.h so both can coexist in the same binary. +class NoiseAdv { +public: + explicit NoiseAdv(uint32_t seed = 1337u) { reseed(seed); } + + void reseed(uint32_t seed); + + float simplex2D(float x, float y) const; + float simplex3D(float x, float y, float z) const; + + // Interpolated lattice noise (not gradient-based), useful where a + // blockier, less swirly texture than simplex is wanted. + float value2D(float x, float y) const; + + WorleyResult worley2D(float x, float y, DistanceMetric metric = DistanceMetric::Euclidean) const; + + // Single-octave ridge transform of simplex2D: 1 - |n|, range [0, 1]. + float ridged2D(float x, float y) const; + + // Ridged multifractal fBm: each octave is weighted by the previous + // octave's ridge signal, producing sharp connected crests. Range [0, 1]. + float ridgedFbm2D(float x, float y, const FbmParams& params) const; + + // Amplitude-normalised fractal Brownian motion. Range [-1, 1]. + float fbm2D(float x, float y, const FbmParams& params) const; + float fbm3D(float x, float y, float z, const FbmParams& params) const; + + // Samples fbm2D at (x, y) displaced by two independent simplex fields, + // producing the swirled, warped look used for organic terrain features. + float warpedFbm2D(float x, float y, const FbmParams& params, float warpStrength) const; + +private: + float gradDot2D(int hashIndex, float x, float y) const; + float gradDot3D(int hashIndex, float x, float y, float z) const; + uint32_t hashCell(int x, int y) const; + float latticeValue(int x, int y) const; + + std::array perm{}; + uint32_t seedValue = 1337u; +}; + +} // namespace vf