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