summary refs log tree commit diff
path: root/src/Math/Vector.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/Math/Vector.hpp
parent23b0bc4d1ddc9fad3c32e8257497ddd13ac6a155 (diff)
downloadmeowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.tar.zst
meowcraft-d0de60dc33df75fbcacb53a09568b14d0fd48cb9.zip
Multithreaded world generation with Perlin
Diffstat (limited to 'src/Math/Vector.hpp')
-rw-r--r--src/Math/Vector.hpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/Math/Vector.hpp b/src/Math/Vector.hpp
index cb5eb24..9cc2d75 100644
--- a/src/Math/Vector.hpp
+++ b/src/Math/Vector.hpp
@@ -12,13 +12,17 @@ struct Vector {
 public:
     Vector(): elements{} {};
 
-    template<typename ...Args>
+    template<typename ...Args, typename std::enable_if<sizeof...(Args) == S, int>::type = 0>
     Vector<S, T>(Args... args) : elements{ args... } {};
 
     Vector<S, T>(T values[S]) {
         std::copy(values, values + S, elements);
     };
 
+    Vector<S, T>(T scalar) {
+        std::fill(elements, elements + S, scalar);
+    };
+
     Vector<S, T>(Vector<S - 1, T> vector, T scalar) {
         std::copy(vector.elements, vector.elements + S - 1, elements);
         elements[S - 1] = scalar;
@@ -61,6 +65,10 @@ public:
         return map([=](auto x) { return x / m; });
     }
 
+    Vector<S, T> abs() const {
+        return map([=](auto x) { return std::abs(x); });
+    }
+
     Vector<3, T> cross(Vector<3, T> other) const {
         return {
             y() * other.z() - z() * other.y(),
@@ -81,6 +89,10 @@ public:
         return map([&](auto i, auto x) { return x + other[i]; });
     }
 
+    Vector<S, T> operator+(T scalar) const {
+        return map([=](auto x) { return x + scalar; });
+    }
+
     Vector<S, T> operator*(T scalar) const {
         return map([=](auto x) { return x * scalar; });
     }
@@ -97,6 +109,10 @@ public:
         return map([](T x) -> T { return -x; });
     }
 
+    Vector<S, T> operator/(T scalar) const {
+        return map([=](auto x) { return x / scalar; });
+    }
+
     T x() const {
         static_assert(S > 0);
         return elements[0];