#ifndef _TCUMATRIXUTIL_HPP #define _TCUMATRIXUTIL_HPP /*------------------------------------------------------------------------- * drawElements Quality Program Tester Core * ---------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Matrix utility functions *//*--------------------------------------------------------------------*/ #include "tcuDefs.hpp" #include "tcuMatrix.hpp" #include "deMath.h" namespace tcu { template <typename T, int Size> Matrix<T, Size+1, Size+1> translationMatrix (const Vector<T, Size>& translation); template <typename T, int Rows, int Cols> Matrix<T, Cols, Rows> transpose (const Matrix<T, Rows, Cols>& mat); // 2D affine transformations. Matrix<float, 2, 2> rotationMatrix (float radians); Matrix<float, 2, 2> shearMatrix (const Vector<float, 2>& shear); // 3D axis rotations. Matrix<float, 3, 3> rotationMatrixX (float radiansX); Matrix<float, 3, 3> rotationMatrixY (float radiansY); Matrix<float, 3, 3> rotationMatrixZ (float radiansZ); // Implementations. // Builds a translation matrix for a homogenous coordinate system template <typename T, int Len> inline Matrix<T, Len+1, Len+1> translationMatrix (const Vector<T, Len>& translation) { Matrix<T, Len+1, Len+1> res = Matrix<T, Len+1, Len+1>(); for (int row = 0; row < Len; row++) res(row, Len) = translation.m_data[row]; return res; } template <typename T, int Rows, int Cols> inline Matrix<T, Cols, Rows> transpose (const Matrix<T, Rows, Cols>& mat) { Matrix<T, Cols, Rows> res; for (int row = 0; row < Rows; row++) for (int col = 0; col < Cols; col++) res(col, row) = mat(row, col); return res; } inline Matrix<float, 2, 2> rotationMatrix (float radians) { Matrix<float, 2, 2> mat; float c = deFloatCos(radians); float s = deFloatSin(radians); mat(0, 0) = c; mat(0, 1) = -s; mat(1, 0) = s; mat(1, 1) = c; return mat; } inline Matrix<float, 2, 2> shearMatrix (const Vector<float, 2>& shear) { Matrix<float, 2, 2> mat; mat(0, 0) = 1.0f; mat(0, 1) = shear.x(); mat(1, 0) = shear.y(); mat(1, 1) = 1.0f + shear.x()*shear.y(); return mat; } inline Matrix<float, 3, 3> rotationMatrixX (float radiansX) { Matrix<float, 3, 3> mat(1.0f); float c = deFloatCos(radiansX); float s = deFloatSin(radiansX); mat(1, 1) = c; mat(1, 2) = -s; mat(2, 1) = s; mat(2, 2) = c; return mat; } inline Matrix<float, 3, 3> rotationMatrixY (float radiansY) { Matrix<float, 3, 3> mat(1.0f); float c = deFloatCos(radiansY); float s = deFloatSin(radiansY); mat(0, 0) = c; mat(0, 2) = s; mat(2, 0) = -s; mat(2, 2) = c; return mat; } inline Matrix<float, 3, 3> rotationMatrixZ (float radiansZ) { Matrix<float, 3, 3> mat(1.0f); float c = deFloatCos(radiansZ); float s = deFloatSin(radiansZ); mat(0, 0) = c; mat(0, 1) = -s; mat(1, 0) = s; mat(1, 1) = c; return mat; } } // tcu #endif // _TCUMATRIXUTIL_HPP