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