#pragma once #include #include "../Math/Vector.hpp" #include "../Math/Grid.hpp" namespace MC::Util { template class Sampler { using Pos = Vector; using Sample = std::function; using Interpolate = std::function; public: Sampler( Sample sample, Pos offset = {}, float scale = 1.0f, Interpolate interpolate = nearest_interpolation ) : m_sample([=](Sampler::Pos pos) -> T { return interpolate(pos, [=](Sampler::Pos p) -> T { return sample(p * scale + offset); }); }) {} T sample(Pos at) { return m_sample(at); } static T nearest_interpolation(Pos pos, Sample sample) { return sample(pos); } private: Sample m_sample; }; }