#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
