summary refs log tree commit diff
path: root/src/Math/Matrix.hpp
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-10-04 01:18:19 +0200
committerMel <einebeere@gmail.com>2022-10-04 01:18:19 +0200
commit0631fb666d2a28a6eb9b8d1578675699b41a5de6 (patch)
tree1db9b88d9c11074864f6959d32960eb6c54d3c4b /src/Math/Matrix.hpp
parent75f3941579c756655fc7d4d29e7b92b6eae436b7 (diff)
downloadmeowcraft-0631fb666d2a28a6eb9b8d1578675699b41a5de6.tar.zst
meowcraft-0631fb666d2a28a6eb9b8d1578675699b41a5de6.zip
Cube Rendering
Diffstat (limited to 'src/Math/Matrix.hpp')
-rw-r--r--src/Math/Matrix.hpp46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/Math/Matrix.hpp b/src/Math/Matrix.hpp
index adc34a9..9a6b7e6 100644
--- a/src/Math/Matrix.hpp
+++ b/src/Math/Matrix.hpp
@@ -1,7 +1,7 @@
 #pragma once
 
 #include <sstream>
-#include <stddef.h>
+#include <cstddef>
 #include <iostream>
 
 template <size_t R, size_t C, typename T = float>
@@ -9,8 +9,24 @@ struct Matrix {
 public:
     Matrix<R, C, T>() : elements{} {};
 
+    Matrix<R, C, T>(T scalar) {
+        std::fill(elements, elements + R * C, scalar);
+    };
+
     template<typename ...Args>
-    explicit Matrix<R, C, T>(Args... args): elements{ args... } {};
+    Matrix<R, C, T>(Args... args): elements{ args... } {};
+
+    Matrix<R, C, T>(T values[R * C]) {
+        std::copy(values, values + R * C, elements);
+    };
+
+    static Matrix<R, R, T> identity() {
+        Matrix<R, R, T> result{};
+        for (int i = 0; i < R; i++) {
+            result(i, i) = 1;
+        }
+        return result;
+    }
 
     Vector<C, T> row(size_t index) {
         return { &elements[index * C] };
@@ -24,6 +40,22 @@ public:
         return result;
     }
 
+    Matrix<R, C, T> operator+(Matrix<R, C, T> other) {
+        Matrix<R, C, T> result{};
+        for (int i = 0; i < R * C; i++) {
+            result.elements[i] = elements[i] + other.elements[i];
+        }
+        return result;
+    }
+
+    Matrix<R, C, T> operator*(float scalar) {
+        Matrix<R, C, T> result{};
+        for (int i = 0; i < R * C; i++) {
+            result.elements[i] = elements[i] * scalar;
+        }
+        return result;
+    }
+
     template<size_t N>
     Matrix<R, N, T> operator*(Matrix<C, N, T> other) {
         Matrix<R, N, T> result{};
@@ -34,16 +66,18 @@ public:
 
                 auto dot = r * c;
 
-                std::cout << x << ", " << y << ": "
-                    << "(" << r.string() << ", " << c.string() << ")"
-                    << dot << std::endl;
-
                 result(x, y) = dot;
             }
         }
         return result;
     }
 
+    Vector<R, T> operator*(Vector<R, T> vector) {
+        Matrix<R, 1, T> matrix(vector.elements);
+        matrix = this->operator*(matrix);
+        return { matrix.elements };
+    }
+
     auto& operator()(size_t x, size_t y) {
         return elements[y * C + x];
     }