#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 Matrix translationMatrix(const Vector &translation); template Matrix transpose(const Matrix &mat); // 2D affine transformations. Matrix rotationMatrix(float radians); Matrix shearMatrix(const Vector &shear); // 3D axis rotations. Matrix rotationMatrixX(float radiansX); Matrix rotationMatrixY(float radiansY); Matrix rotationMatrixZ(float radiansZ); // Implementations. // Builds a translation matrix for a homogenous coordinate system template inline Matrix translationMatrix(const Vector &translation) { Matrix res = Matrix(); for (int row = 0; row < Len; row++) res(row, Len) = translation.m_data[row]; return res; } template inline Matrix transpose(const Matrix &mat) { Matrix 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 rotationMatrix(float radians) { Matrix 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 shearMatrix(const Vector &shear) { Matrix 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 rotationMatrixX(float radiansX) { Matrix 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 rotationMatrixY(float radiansY) { Matrix 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 rotationMatrixZ(float radiansZ) { Matrix 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; } } // namespace tcu #endif // _TCUMATRIXUTIL_HPP