#pragma once #include "Common.hpp" namespace Math::Perlin { Real raw(Vector<2> pos); Real raw(Vector<3> pos); template struct Noise { static_assert(D > 1 && D < 4); Vector offset{20000.0f}; Real scale = 15.0f; UInt octaves = 3; Real persistence = 0.3f; Real lacunarity = 2.0f; Real at(Vector pos) const { Real result = 0; Real max = 0; Real frequency = 1; Real amplitude = 1; for (UInt octave = 0; octave < octaves; octave++) { result += raw((pos + offset).abs() / scale * frequency) * amplitude; max += amplitude; frequency *= lacunarity; amplitude *= persistence; } return result / max; } }; }