13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _TCUMATRIXUTIL_HPP 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _TCUMATRIXUTIL_HPP 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------- 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Matrix utility functions 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuDefs.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuMatrix.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size> 343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMatrix<T, Size+1, Size+1> translationMatrix (const Vector<T, Size>& translation); 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// 2D affine transformations. 373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMatrix<float, 2, 2> rotationMatrix (float radians); 383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMatrix<float, 2, 2> shearMatrix (const Vector<float, 2>& shear); 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// 3D axis rotations. 413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMatrix<float, 3, 3> rotationMatrixX (float radiansX); 423c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMatrix<float, 3, 3> rotationMatrixY (float radiansY); 433c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMatrix<float, 3, 3> rotationMatrixZ (float radiansZ); 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Implementations. 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Builds a translation matrix for a homogenous coordinate system 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Len> 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Matrix<T, Len+1, Len+1> translationMatrix (const Vector<T, Len>& translation) 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Matrix<T, Len+1, Len+1> res = Matrix<T, Len+1, Len+1>(); 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int row = 0; row < Len; row++) 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry res(row, Len) = translation.m_data[row]; 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return res; 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Matrix<float, 2, 2> rotationMatrix (float radians) 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Matrix<float, 2, 2> mat; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float c = deFloatCos(radians); 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = deFloatSin(radians); 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 0) = c; 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 1) = -s; 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 0) = s; 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 1) = c; 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return mat; 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Matrix<float, 2, 2> shearMatrix (const Vector<float, 2>& shear) 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Matrix<float, 2, 2> mat; 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 0) = 1.0f; 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 1) = shear.x(); 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 0) = shear.y(); 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 1) = 1.0f + shear.x()*shear.y(); 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return mat; 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Matrix<float, 3, 3> rotationMatrixX (float radiansX) 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Matrix<float, 3, 3> mat(1.0f); 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float c = deFloatCos(radiansX); 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = deFloatSin(radiansX); 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 1) = c; 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 2) = -s; 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(2, 1) = s; 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(2, 2) = c; 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return mat; 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Matrix<float, 3, 3> rotationMatrixY (float radiansY) 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Matrix<float, 3, 3> mat(1.0f); 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float c = deFloatCos(radiansY); 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = deFloatSin(radiansY); 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 0) = c; 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 2) = s; 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(2, 0) = -s; 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(2, 2) = c; 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return mat; 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Matrix<float, 3, 3> rotationMatrixZ (float radiansZ) 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Matrix<float, 3, 3> mat(1.0f); 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float c = deFloatCos(radiansZ); 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float s = deFloatSin(radiansZ); 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 0) = c; 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(0, 1) = -s; 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 0) = s; 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mat(1, 1) = c; 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return mat; 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUMATRIXUTIL_HPP 126