summary refs log tree commit diff
path: root/src/Util/Sampler.hpp
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-06-12 17:09:55 +0200
committerMel <einebeere@gmail.com>2023-06-12 17:14:03 +0200
commitd0de60dc33df75fbcacb53a09568b14d0fd48cb9 (patch)
tree7aefdbb81f114552881834bd5b0d842bc2bdb691 /src/Util/Sampler.hpp
parent23b0bc4d1ddc9fad3c32e8257497ddd13ac6a155 (diff)
downloadmeowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.tar.zst
meowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.zip
Multithreaded world generation with Perlin
Diffstat (limited to 'src/Util/Sampler.hpp')
-rw-r--r--src/Util/Sampler.hpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Util/Sampler.hpp b/src/Util/Sampler.hpp
new file mode 100644
index 0000000..3a4ff4f
--- /dev/null
+++ b/src/Util/Sampler.hpp
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <functional>
+#include "../Math/Vector.hpp"
+#include "../Math/Grid.hpp"
+
+namespace MC::Util {
+
+template<size_t D, typename T>
+class Sampler {
+    using Pos = Vector<D>;
+    using Sample = std::function<T(Pos)>;
+    using Interpolate = std::function<T(Pos, Sample)>;
+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;
+};
+
+}
\ No newline at end of file