#pragma once #include #include #include #include #include ///////////////////// // MATRIX CLASS // ///////////////////// template class Matrix3 { private: T **m_data; public: Matrix3() { m_data = new T*[3]; for (int i = 0; i < 3; i++) m_data[i] = new T[3]; } Matrix3(const std::initializer_list> &list_ext) { assert(list_ext.size() == 3); m_data = new T*[3]; for (int i = 0; i < 3; i++) m_data[i] = new T[3]; int i = 0, j = 0; for (auto &list_int : list_ext) { assert(list_int.size() == 3); j = 0; for (auto &element : list_int) { m_data[i][j] = element; j++; } i++; } } void erase() { for (int i = 0; i < 3; i++) delete[] m_data[i]; delete[] m_data; m_data = nullptr; } const T* operator[](const int r) const { assert(r >= 0 && r < 3); return m_data[r]; } T* operator[](const int r) { assert(r >= 0 && r < 3); return m_data[r]; } Matrix3& operator=(const std::initializer_list> list_ext) { assert(list_ext.size() == 3); this->erase(); m_data = new T*[3]; for (int i = 0; i < 3; i++) m_data[i] = new T[3]; int i = 0, j = 0; for (auto &list_int : list_ext) { assert(list_int.size() == 3); j = 0; for (auto &element : list_int) { m_data[i][j] = element; j++; } i++; } return (*this); } Matrix3& operator=(const Matrix3 &m) { this->erase(); m_data = new T*[3]; for (int i = 0; i < 3; i++) m_data[i] = new T[3]; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) m_data[i][j] = m[i][j]; return (*this); } ~Matrix3() { delete[] m_data[0]; delete[] m_data[1]; delete[] m_data[2]; delete[] m_data; } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template std::ostream& operator<<(std::ostream &out, Matrix3 &m) { for (int r = 0; r < 3; r++) { for (int c = 0; c < 3; c++) out << m[r][c] << " "; out << "\n"; } return out; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template bool operator==(Matrix3 m1, Matrix3 m2) { int s = 0; for (int r = 0; r < m1.getNumRows(); r++) for (int c = 0; c < m1.getNumCols(); c++) s += (m1[r][c] == m2[r][c]); if (s == m1.getNumRows() * m1.getNumCols()) return true; else return false; } template bool operator!=(Matrix3 m1, Matrix3 m2) { int s = 0; for (int r = 0; r < m1.getNumRows(); r++) for (int c = 0; c < m1.getNumCols(); c++) s += (m1[r][c] == m2[r][c]); if (s == m1.getNumRows() * m1.getNumCols()) return false; else return true; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template Matrix3 operator+(const Matrix3 &left, const Matrix3 &right) { return { {left[0][0] + right[0][0], left[0][1] + right[0][1], left[0][2] + right[0][2]}, {left[1][0] + right[1][0], left[1][1] + right[1][1], left[1][2] + right[1][2]}, {left[2][0] + right[2][0], left[2][1] + right[2][1], left[2][2] + right[2][2]} }; } template Matrix3& operator+=(Matrix3 &left, const Matrix3 &right) { for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) left[r][c] += right[r][c]; return left; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template Matrix3 operator-(const Matrix3 &left, const Matrix3 &right) { return { {left[0][0] - right[0][0], left[0][1] - right[0][1], left[0][2] - right[0][2]}, {left[1][0] - right[1][0], left[1][1] - right[1][1], left[1][2] - right[1][2]}, {left[2][0] - right[2][0], left[2][1] - right[2][1], left[2][2] - right[2][2]} }; } template Matrix3& operator-=(Matrix3 &left, const Matrix3 &right) { for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) left[r][c] -= right[r][c]; return left; } template Matrix3& operator-(Matrix3 &left) { for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) left[r][c] = -left[r][c]; return left; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template Matrix3& operator*=(Matrix3 &left, const U &right) { for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) left[r][c] *= right; return left; } template Matrix3 operator*(const Matrix3 &left, const U &right) { return { {left[0][0] * right, left[0][1] * right, left[0][2] * right}, {left[1][0] * right, left[1][1] * right, left[1][2] * right}, {left[2][0] * right, left[2][1] * right, left[2][2] * right} }; } template Matrix3 operator*(const U &left, const Matrix3 &right) { return { {left * right[0][0], left * right[0][1], left * right[0][2]}, {left * right[1][0], left * right[1][1], left * right[1][2]}, {left * right[2][0], left * right[2][1], left * right[2][2]} }; } template Matrix3 operator*(Matrix3 &left, Matrix3 &right) { T _00 = left[0][0] * right[0][0] + left[0][1] * right[1][0] + left[0][2] * right[2][0]; T _01 = left[0][0] * right[0][1] + left[0][1] * right[1][1] + left[0][2] * right[2][1]; T _02 = left[0][0] * right[0][2] + left[0][1] * right[1][2] + left[0][2] * right[2][2]; T _10 = left[1][0] * right[0][0] + left[1][1] * right[1][0] + left[1][2] * right[2][0]; T _11 = left[1][0] * right[0][1] + left[1][1] * right[1][1] + left[1][2] * right[2][1]; T _12 = left[1][0] * right[0][2] + left[1][1] * right[1][2] + left[1][2] * right[2][2]; T _20 = left[2][0] * right[0][0] + left[2][1] * right[1][0] + left[2][2] * right[2][0]; T _21 = left[2][0] * right[0][1] + left[2][1] * right[1][1] + left[2][2] * right[2][1]; T _22 = left[2][0] * right[0][2] + left[2][1] * right[1][2] + left[2][2] * right[2][2]; return { {_00,_01,_02},{_10,_11,_12},{_20,_21,_22} }; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template Matrix3& operator/=(Matrix3 &left, U right) { for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) left[r][c] /= right; return left; } template Matrix3 operator/(Matrix3 left, U right) { return { {left[0][0] / right, left[0][1] / right, left[0][2] / right}, {left[1][0] / right, left[1][1] / right, left[1][2] / right}, {left[2][0] / right, left[2][1] / right, left[2][2] / right} }; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////// // 2D VECTOR MATHS // ///////////////////// template float Magnitude(const V2 &v) { return sqrt(static_cast(v.x * v.x + v.y * v.y)); } template V2 UnitVector(const V2 &v) { return v / Magnitude(v); } template bool operator>(const V2 &v1,const V2 &v2) { if (Magnitude(v1) > Magnitude(v2)) return true; else return false; } template bool operator<(V2 &v1, V2 &v2) { if (Magnitude(v1) > Magnitude(v2)) return true; else return false; } ///////////////////// // 3D VECTOR MATHS // ///////////////////// template sf::Vector3 operator*(const Matrix3 &m, const sf::Vector3 &v) { return sf::Vector3( m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z ); }