1#ifndef _TCUMATRIXUTIL_HPP 2#define _TCUMATRIXUTIL_HPP 3/*------------------------------------------------------------------------- 4 * drawElements Quality Program Tester Core 5 * ---------------------------------------- 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Matrix utility functions 24 *//*--------------------------------------------------------------------*/ 25 26#include "tcuDefs.hpp" 27#include "tcuMatrix.hpp" 28#include "deMath.h" 29 30namespace tcu 31{ 32 33template <typename T, int Size> 34Matrix<T, Size+1, Size+1> translationMatrix (const Vector<T, Size>& translation); 35 36// 2D affine transformations. 37Matrix<float, 2, 2> rotationMatrix (float radians); 38Matrix<float, 2, 2> shearMatrix (const Vector<float, 2>& shear); 39 40// 3D axis rotations. 41Matrix<float, 3, 3> rotationMatrixX (float radiansX); 42Matrix<float, 3, 3> rotationMatrixY (float radiansY); 43Matrix<float, 3, 3> rotationMatrixZ (float radiansZ); 44 45// Implementations. 46 47// Builds a translation matrix for a homogenous coordinate system 48template <typename T, int Len> 49inline Matrix<T, Len+1, Len+1> translationMatrix (const Vector<T, Len>& translation) 50{ 51 Matrix<T, Len+1, Len+1> res = Matrix<T, Len+1, Len+1>(); 52 for (int row = 0; row < Len; row++) 53 res(row, Len) = translation.m_data[row]; 54 return res; 55} 56 57inline Matrix<float, 2, 2> rotationMatrix (float radians) 58{ 59 Matrix<float, 2, 2> mat; 60 float c = deFloatCos(radians); 61 float s = deFloatSin(radians); 62 63 mat(0, 0) = c; 64 mat(0, 1) = -s; 65 mat(1, 0) = s; 66 mat(1, 1) = c; 67 68 return mat; 69} 70 71inline Matrix<float, 2, 2> shearMatrix (const Vector<float, 2>& shear) 72{ 73 Matrix<float, 2, 2> mat; 74 mat(0, 0) = 1.0f; 75 mat(0, 1) = shear.x(); 76 mat(1, 0) = shear.y(); 77 mat(1, 1) = 1.0f + shear.x()*shear.y(); 78 return mat; 79} 80 81inline Matrix<float, 3, 3> rotationMatrixX (float radiansX) 82{ 83 Matrix<float, 3, 3> mat(1.0f); 84 float c = deFloatCos(radiansX); 85 float s = deFloatSin(radiansX); 86 87 mat(1, 1) = c; 88 mat(1, 2) = -s; 89 mat(2, 1) = s; 90 mat(2, 2) = c; 91 92 return mat; 93} 94 95inline Matrix<float, 3, 3> rotationMatrixY (float radiansY) 96{ 97 Matrix<float, 3, 3> mat(1.0f); 98 float c = deFloatCos(radiansY); 99 float s = deFloatSin(radiansY); 100 101 mat(0, 0) = c; 102 mat(0, 2) = s; 103 mat(2, 0) = -s; 104 mat(2, 2) = c; 105 106 return mat; 107} 108 109inline Matrix<float, 3, 3> rotationMatrixZ (float radiansZ) 110{ 111 Matrix<float, 3, 3> mat(1.0f); 112 float c = deFloatCos(radiansZ); 113 float s = deFloatSin(radiansZ); 114 115 mat(0, 0) = c; 116 mat(0, 1) = -s; 117 mat(1, 0) = s; 118 mat(1, 1) = c; 119 120 return mat; 121} 122 123} // tcu 124 125#endif // _TCUMATRIXUTIL_HPP 126