From b9a00a40a9a61c3df5c774fd1cc9d04f57994a0c Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Tue, 29 Jan 2019 16:05:51 -0600 Subject: Common: Move Matrix classes out of MathUtil into their own files and make their interface more friendly. --- Source/Core/Common/Matrix.cpp | 158 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 Source/Core/Common/Matrix.cpp (limited to 'Source/Core/Common/Matrix.cpp') diff --git a/Source/Core/Common/Matrix.cpp b/Source/Core/Common/Matrix.cpp new file mode 100644 index 0000000000..97f8471945 --- /dev/null +++ b/Source/Core/Common/Matrix.cpp @@ -0,0 +1,158 @@ +// Copyright 2019 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include "Common/Matrix.h" + +#include +#include + +inline void MatrixMul(int n, const float* a, const float* b, float* result) +{ + for (int i = 0; i < n; ++i) + { + for (int j = 0; j < n; ++j) + { + float temp = 0; + for (int k = 0; k < n; ++k) + { + temp += a[i * n + k] * b[k * n + j]; + } + result[i * n + j] = temp; + } + } +} + +Matrix33 Matrix33::Identity() +{ + Matrix33 mtx = {}; + mtx.data[0] = 1.0f; + mtx.data[4] = 1.0f; + mtx.data[8] = 1.0f; + return mtx; +} + +Matrix33 Matrix33::RotateX(float rad) +{ + float s = sin(rad); + float c = cos(rad); + Matrix33 mtx = {}; + mtx.data[0] = 1; + mtx.data[4] = c; + mtx.data[5] = -s; + mtx.data[7] = s; + mtx.data[8] = c; + return mtx; +} + +Matrix33 Matrix33::RotateY(float rad) +{ + float s = sin(rad); + float c = cos(rad); + Matrix33 mtx = {}; + mtx.data[0] = c; + mtx.data[2] = s; + mtx.data[4] = 1; + mtx.data[6] = -s; + mtx.data[8] = c; + return mtx; +} + +Matrix33 Matrix33::RotateZ(float rad) +{ + float s = sin(rad); + float c = cos(rad); + Matrix33 mtx = {}; + mtx.data[0] = c; + mtx.data[1] = -s; + mtx.data[3] = s; + mtx.data[4] = c; + mtx.data[8] = 1; + return mtx; +} + +Matrix33 Matrix33::Scale(const Vec3& vec) +{ + Matrix33 mtx = {}; + mtx.data[0] = vec.x; + mtx.data[4] = vec.y; + mtx.data[8] = vec.z; + return mtx; +} + +void Matrix33::Multiply(const Matrix33& a, const Matrix33& b, Matrix33* result) +{ + MatrixMul(3, a.data.data(), b.data.data(), result->data.data()); +} + +void Matrix33::Multiply(const Matrix33& a, const Vec3& vec, Vec3* result) +{ + for (int i = 0; i < 3; ++i) + { + result->data[i] = 0; + + for (int k = 0; k < 3; ++k) + { + result->data[i] += a.data[i * 3 + k] * vec.data[k]; + } + } +} + +Matrix44 Matrix44::Identity() +{ + Matrix44 mtx = {}; + mtx.data[0] = 1.0f; + mtx.data[5] = 1.0f; + mtx.data[10] = 1.0f; + mtx.data[15] = 1.0f; + return mtx; +} + +Matrix44 Matrix44::FromMatrix33(const Matrix33& m33) +{ + Matrix44 mtx; + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + mtx.data[i * 4 + j] = m33.data[i * 3 + j]; + } + } + + for (int i = 0; i < 3; ++i) + { + mtx.data[i * 4 + 3] = 0; + mtx.data[i + 12] = 0; + } + mtx.data[15] = 1.0f; + return mtx; +} + +Matrix44 Matrix44::FromArray(const float mtxArray[16]) +{ + Matrix44 mtx; + std::copy_n(mtxArray, 16, std::begin(mtx.data)); + return mtx; +} + +Matrix44 Matrix44::Translate(const Vec3& vec) +{ + Matrix44 mtx = Matrix44::Identity(); + mtx.data[3] = vec.x; + mtx.data[7] = vec.y; + mtx.data[11] = vec.y; + return mtx; +} + +Matrix44 Matrix44::Shear(const float a, const float b) +{ + Matrix44 mtx = Matrix44::Identity(); + mtx.data[2] = a; + mtx.data[6] = b; + return mtx; +} + +void Matrix44::Multiply(const Matrix44& a, const Matrix44& b, Matrix44& result) +{ + MatrixMul(4, a.data.data(), b.data.data(), result.data.data()); +} -- cgit v1.2.3