diff options
Diffstat (limited to 'src/3rdparty/angle/src/common/matrix_utils.h')
-rw-r--r-- | src/3rdparty/angle/src/common/matrix_utils.h | 386 |
1 files changed, 0 insertions, 386 deletions
diff --git a/src/3rdparty/angle/src/common/matrix_utils.h b/src/3rdparty/angle/src/common/matrix_utils.h deleted file mode 100644 index aa3f89536e..0000000000 --- a/src/3rdparty/angle/src/common/matrix_utils.h +++ /dev/null @@ -1,386 +0,0 @@ -// -// Copyright 2015 The ANGLE Project Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Matrix: -// Utility class implementing various matrix operations. -// Supports matrices with minimum 2 and maximum 4 number of rows/columns. -// -// TODO: Check if we can merge Matrix.h in sample_util with this and replace it with this implementation. -// TODO: Rename this file to Matrix.h once we remove Matrix.h in sample_util. - -#ifndef COMMON_MATRIX_UTILS_H_ -#define COMMON_MATRIX_UTILS_H_ - -#include <vector> - -#include "common/debug.h" -#include "common/mathutil.h" - -namespace angle -{ - -template<typename T> -class Matrix -{ - public: - Matrix(const std::vector<T> &elements, const unsigned int &numRows, const unsigned int &numCols) - : mElements(elements), - mRows(numRows), - mCols(numCols) - { - ASSERT(rows() >= 1 && rows() <= 4); - ASSERT(columns() >= 1 && columns() <= 4); - } - - Matrix(const std::vector<T> &elements, const unsigned int &size) - : mElements(elements), - mRows(size), - mCols(size) - { - ASSERT(rows() >= 1 && rows() <= 4); - ASSERT(columns() >= 1 && columns() <= 4); - } - - Matrix(const T *elements, const unsigned int &size) - : mRows(size), - mCols(size) - { - ASSERT(rows() >= 1 && rows() <= 4); - ASSERT(columns() >= 1 && columns() <= 4); - for (size_t i = 0; i < size * size; i++) - mElements.push_back(elements[i]); - } - - const T &operator()(const unsigned int &rowIndex, const unsigned int &columnIndex) const - { - return mElements[rowIndex * columns() + columnIndex]; - } - - T &operator()(const unsigned int &rowIndex, const unsigned int &columnIndex) - { - return mElements[rowIndex * columns() + columnIndex]; - } - - const T &at(const unsigned int &rowIndex, const unsigned int &columnIndex) const - { - return operator()(rowIndex, columnIndex); - } - - Matrix<T> operator*(const Matrix<T> &m) - { - ASSERT(columns() == m.rows()); - - unsigned int resultRows = rows(); - unsigned int resultCols = m.columns(); - Matrix<T> result(std::vector<T>(resultRows * resultCols), resultRows, resultCols); - for (unsigned int i = 0; i < resultRows; i++) - { - for (unsigned int j = 0; j < resultCols; j++) - { - T tmp = 0.0f; - for (unsigned int k = 0; k < columns(); k++) - tmp += at(i, k) * m(k, j); - result(i, j) = tmp; - } - } - - return result; - } - - unsigned int size() const - { - ASSERT(rows() == columns()); - return rows(); - } - - unsigned int rows() const { return mRows; } - - unsigned int columns() const { return mCols; } - - std::vector<T> elements() const { return mElements; } - - Matrix<T> compMult(const Matrix<T> &mat1) const - { - Matrix result(std::vector<T>(mElements.size()), size()); - for (unsigned int i = 0; i < columns(); i++) - for (unsigned int j = 0; j < rows(); j++) - result(i, j) = at(i, j) * mat1(i, j); - - return result; - } - - Matrix<T> outerProduct(const Matrix<T> &mat1) const - { - unsigned int cols = mat1.columns(); - Matrix result(std::vector<T>(rows() * cols), rows(), cols); - for (unsigned int i = 0; i < rows(); i++) - for (unsigned int j = 0; j < cols; j++) - result(i, j) = at(i, 0) * mat1(0, j); - - return result; - } - - Matrix<T> transpose() const - { - Matrix result(std::vector<T>(mElements.size()), columns(), rows()); - for (unsigned int i = 0; i < columns(); i++) - for (unsigned int j = 0; j < rows(); j++) - result(i, j) = at(j, i); - - return result; - } - - T determinant() const - { - ASSERT(rows() == columns()); - - switch (size()) - { - case 2: - return at(0, 0) * at(1, 1) - at(0, 1) * at(1, 0); - - case 3: - return at(0, 0) * at(1, 1) * at(2, 2) + - at(0, 1) * at(1, 2) * at(2, 0) + - at(0, 2) * at(1, 0) * at(2, 1) - - at(0, 2) * at(1, 1) * at(2, 0) - - at(0, 1) * at(1, 0) * at(2, 2) - - at(0, 0) * at(1, 2) * at(2, 1); - - case 4: - { - const float minorMatrices[4][3 * 3] = - { - { - at(1, 1), at(2, 1), at(3, 1), - at(1, 2), at(2, 2), at(3, 2), - at(1, 3), at(2, 3), at(3, 3), - }, - { - at(1, 0), at(2, 0), at(3, 0), - at(1, 2), at(2, 2), at(3, 2), - at(1, 3), at(2, 3), at(3, 3), - }, - { - at(1, 0), at(2, 0), at(3, 0), - at(1, 1), at(2, 1), at(3, 1), - at(1, 3), at(2, 3), at(3, 3), - }, - { - at(1, 0), at(2, 0), at(3, 0), - at(1, 1), at(2, 1), at(3, 1), - at(1, 2), at(2, 2), at(3, 2), - } - }; - return at(0, 0) * Matrix<T>(minorMatrices[0], 3).determinant() - - at(0, 1) * Matrix<T>(minorMatrices[1], 3).determinant() + - at(0, 2) * Matrix<T>(minorMatrices[2], 3).determinant() - - at(0, 3) * Matrix<T>(minorMatrices[3], 3).determinant(); - } - - default: - UNREACHABLE(); - break; - } - - return T(); - } - - Matrix<T> inverse() const - { - ASSERT(rows() == columns()); - - Matrix<T> cof(std::vector<T>(mElements.size()), rows(), columns()); - switch (size()) - { - case 2: - cof(0, 0) = at(1, 1); - cof(0, 1) = -at(1, 0); - cof(1, 0) = -at(0, 1); - cof(1, 1) = at(0, 0); - break; - - case 3: - cof(0, 0) = at(1, 1) * at(2, 2) - - at(2, 1) * at(1, 2); - cof(0, 1) = -(at(1, 0) * at(2, 2) - - at(2, 0) * at(1, 2)); - cof(0, 2) = at(1, 0) * at(2, 1) - - at(2, 0) * at(1, 1); - cof(1, 0) = -(at(0, 1) * at(2, 2) - - at(2, 1) * at(0, 2)); - cof(1, 1) = at(0, 0) * at(2, 2) - - at(2, 0) * at(0, 2); - cof(1, 2) = -(at(0, 0) * at(2, 1) - - at(2, 0) * at(0, 1)); - cof(2, 0) = at(0, 1) * at(1, 2) - - at(1, 1) * at(0, 2); - cof(2, 1) = -(at(0, 0) * at(1, 2) - - at(1, 0) * at(0, 2)); - cof(2, 2) = at(0, 0) * at(1, 1) - - at(1, 0) * at(0, 1); - break; - - case 4: - cof(0, 0) = at(1, 1) * at(2, 2) * at(3, 3) + - at(2, 1) * at(3, 2) * at(1, 3) + - at(3, 1) * at(1, 2) * at(2, 3) - - at(1, 1) * at(3, 2) * at(2, 3) - - at(2, 1) * at(1, 2) * at(3, 3) - - at(3, 1) * at(2, 2) * at(1, 3); - cof(0, 1) = -(at(1, 0) * at(2, 2) * at(3, 3) + - at(2, 0) * at(3, 2) * at(1, 3) + - at(3, 0) * at(1, 2) * at(2, 3) - - at(1, 0) * at(3, 2) * at(2, 3) - - at(2, 0) * at(1, 2) * at(3, 3) - - at(3, 0) * at(2, 2) * at(1, 3)); - cof(0, 2) = at(1, 0) * at(2, 1) * at(3, 3) + - at(2, 0) * at(3, 1) * at(1, 3) + - at(3, 0) * at(1, 1) * at(2, 3) - - at(1, 0) * at(3, 1) * at(2, 3) - - at(2, 0) * at(1, 1) * at(3, 3) - - at(3, 0) * at(2, 1) * at(1, 3); - cof(0, 3) = -(at(1, 0) * at(2, 1) * at(3, 2) + - at(2, 0) * at(3, 1) * at(1, 2) + - at(3, 0) * at(1, 1) * at(2, 2) - - at(1, 0) * at(3, 1) * at(2, 2) - - at(2, 0) * at(1, 1) * at(3, 2) - - at(3, 0) * at(2, 1) * at(1, 2)); - cof(1, 0) = -(at(0, 1) * at(2, 2) * at(3, 3) + - at(2, 1) * at(3, 2) * at(0, 3) + - at(3, 1) * at(0, 2) * at(2, 3) - - at(0, 1) * at(3, 2) * at(2, 3) - - at(2, 1) * at(0, 2) * at(3, 3) - - at(3, 1) * at(2, 2) * at(0, 3)); - cof(1, 1) = at(0, 0) * at(2, 2) * at(3, 3) + - at(2, 0) * at(3, 2) * at(0, 3) + - at(3, 0) * at(0, 2) * at(2, 3) - - at(0, 0) * at(3, 2) * at(2, 3) - - at(2, 0) * at(0, 2) * at(3, 3) - - at(3, 0) * at(2, 2) * at(0, 3); - cof(1, 2) = -(at(0, 0) * at(2, 1) * at(3, 3) + - at(2, 0) * at(3, 1) * at(0, 3) + - at(3, 0) * at(0, 1) * at(2, 3) - - at(0, 0) * at(3, 1) * at(2, 3) - - at(2, 0) * at(0, 1) * at(3, 3) - - at(3, 0) * at(2, 1) * at(0, 3)); - cof(1, 3) = at(0, 0) * at(2, 1) * at(3, 2) + - at(2, 0) * at(3, 1) * at(0, 2) + - at(3, 0) * at(0, 1) * at(2, 2) - - at(0, 0) * at(3, 1) * at(2, 2) - - at(2, 0) * at(0, 1) * at(3, 2) - - at(3, 0) * at(2, 1) * at(0, 2); - cof(2, 0) = at(0, 1) * at(1, 2) * at(3, 3) + - at(1, 1) * at(3, 2) * at(0, 3) + - at(3, 1) * at(0, 2) * at(1, 3) - - at(0, 1) * at(3, 2) * at(1, 3) - - at(1, 1) * at(0, 2) * at(3, 3) - - at(3, 1) * at(1, 2) * at(0, 3); - cof(2, 1) = -(at(0, 0) * at(1, 2) * at(3, 3) + - at(1, 0) * at(3, 2) * at(0, 3) + - at(3, 0) * at(0, 2) * at(1, 3) - - at(0, 0) * at(3, 2) * at(1, 3) - - at(1, 0) * at(0, 2) * at(3, 3) - - at(3, 0) * at(1, 2) * at(0, 3)); - cof(2, 2) = at(0, 0) * at(1, 1) * at(3, 3) + - at(1, 0) * at(3, 1) * at(0, 3) + - at(3, 0) * at(0, 1) * at(1, 3) - - at(0, 0) * at(3, 1) * at(1, 3) - - at(1, 0) * at(0, 1) * at(3, 3) - - at(3, 0) * at(1, 1) * at(0, 3); - cof(2, 3) = -(at(0, 0) * at(1, 1) * at(3, 2) + - at(1, 0) * at(3, 1) * at(0, 2) + - at(3, 0) * at(0, 1) * at(1, 2) - - at(0, 0) * at(3, 1) * at(1, 2) - - at(1, 0) * at(0, 1) * at(3, 2) - - at(3, 0) * at(1, 1) * at(0, 2)); - cof(3, 0) = -(at(0, 1) * at(1, 2) * at(2, 3) + - at(1, 1) * at(2, 2) * at(0, 3) + - at(2, 1) * at(0, 2) * at(1, 3) - - at(0, 1) * at(2, 2) * at(1, 3) - - at(1, 1) * at(0, 2) * at(2, 3) - - at(2, 1) * at(1, 2) * at(0, 3)); - cof(3, 1) = at(0, 0) * at(1, 2) * at(2, 3) + - at(1, 0) * at(2, 2) * at(0, 3) + - at(2, 0) * at(0, 2) * at(1, 3) - - at(0, 0) * at(2, 2) * at(1, 3) - - at(1, 0) * at(0, 2) * at(2, 3) - - at(2, 0) * at(1, 2) * at(0, 3); - cof(3, 2) = -(at(0, 0) * at(1, 1) * at(2, 3) + - at(1, 0) * at(2, 1) * at(0, 3) + - at(2, 0) * at(0, 1) * at(1, 3) - - at(0, 0) * at(2, 1) * at(1, 3) - - at(1, 0) * at(0, 1) * at(2, 3) - - at(2, 0) * at(1, 1) * at(0, 3)); - cof(3, 3) = at(0, 0) * at(1, 1) * at(2, 2) + - at(1, 0) * at(2, 1) * at(0, 2) + - at(2, 0) * at(0, 1) * at(1, 2) - - at(0, 0) * at(2, 1) * at(1, 2) - - at(1, 0) * at(0, 1) * at(2, 2) - - at(2, 0) * at(1, 1) * at(0, 2); - break; - - default: - UNREACHABLE(); - break; - } - - // The inverse of A is the transpose of the cofactor matrix times the reciprocal of the determinant of A. - Matrix<T> adjugateMatrix(cof.transpose()); - T det = determinant(); - Matrix<T> result(std::vector<T>(mElements.size()), rows(), columns()); - for (unsigned int i = 0; i < rows(); i++) - for (unsigned int j = 0; j < columns(); j++) - result(i, j) = det ? adjugateMatrix(i, j) / det : T(); - - return result; - } - - void setToIdentity() - { - ASSERT(rows() == columns()); - - const auto one = T(1); - const auto zero = T(0); - - for (auto &e : mElements) - e = zero; - - for (unsigned int i = 0; i < rows(); ++i) - { - const auto pos = i * columns() + (i % columns()); - mElements[pos] = one; - } - } - - template <unsigned int Size> - static void setToIdentity(T(&matrix)[Size]) - { - static_assert(gl::iSquareRoot<Size>() != 0, "Matrix is not square."); - - const auto cols = gl::iSquareRoot<Size>(); - const auto one = T(1); - const auto zero = T(0); - - for (auto &e : matrix) - e = zero; - - for (unsigned int i = 0; i < cols; ++i) - { - const auto pos = i * cols + (i % cols); - matrix[pos] = one; - } - } - - private: - std::vector<T> mElements; - unsigned int mRows; - unsigned int mCols; -}; - -} // namespace angle - -#endif // COMMON_MATRIX_UTILS_H_ - |