17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!****************************************************************************
27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @file         PVRTVector.h
47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @copyright    Copyright (c) Imagination Technologies Limited.
57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief        Vector and matrix mathematics library
67b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
77b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/
87b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifndef __PVRTVECTOR_H__
97b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define __PVRTVECTOR_H__
107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "assert.h"
127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTGlobal.h"
137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTFixedPoint.h"
147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRTMatrix.h"
157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <string.h>
167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <math.h>
177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Forward Declarations for vector and matrix structs
207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTVec4;
227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTVec3;
237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTMat3;
247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTMat4;
257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			PVRTLinearEqSolve
287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			pSrc	2D array of floats. 4 Eq linear problem is 5x4
297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens							matrix, constants in first column
307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nCnt	Number of equations to solve
317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[out]		pRes	Result
327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Solves 'nCnt' simultaneous equations of 'nCnt' variables.
337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					pRes should be an array large enough to contain the
347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					results: the values of the 'nCnt' variables.
357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					This fn recursively uses Gaussian Elimination.
367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid PVRTLinearEqSolve(VERTTYPE * const pRes, VERTTYPE ** const pSrc, const int nCnt);
387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @struct            PVRTVec2
417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief             2 component vector
427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTVec2
447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE x, y;
467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		** Constructors
487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Blank constructor.
517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*****************************************************************************/
527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2() : x(0), y(0) {}
537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Simple constructor from 2 values.
557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			fX	X component of vector
567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			fY	Y component of vector
577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*****************************************************************************/
587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2(VERTTYPE fX, VERTTYPE fY) : x(fX), y(fY) {}
597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Constructor from a single value.
617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			fValue	    A component value
627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*****************************************************************************/
637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2(VERTTYPE fValue) : x(fValue), y(fValue) {}
647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Constructor from an array
667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			pVec	An array
677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*****************************************************************************/
687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2(const VERTTYPE* pVec) : x(pVec[0]), y(pVec[1]) {}
697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Constructor from a Vec3
717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			v3Vec   A Vec3
727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*****************************************************************************/
737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2(const PVRTVec3& v3Vec);
747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		** Operators
767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		componentwise addition operator for two Vec2s
797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs     Another Vec2
807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of addition
817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*****************************************************************************/
827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 operator+(const PVRTVec2& rhs) const
837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(*this);
857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out += rhs;
867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		componentwise subtraction operator for two Vec2s
897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs    Another vec2
907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of subtraction
917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 operator-(const PVRTVec2& rhs) const
937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(*this);
957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out -= rhs;
967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Componentwise addition and assignment operator for two Vec2s
1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs    Another vec2
1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of addition
1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2& operator+=(const PVRTVec2& rhs)
1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x += rhs.x;
1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y += rhs.y;
1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Componentwise subtraction and assignment operator for two Vec2s
1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs    Another vec2
1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			Result of subtraction
1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2& operator-=(const PVRTVec2& rhs)
1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x -= rhs.x;
1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y -= rhs.y;
1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Negation operator for a Vec2
1247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs    Another vec2
1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			Result of negation
1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	friend PVRTVec2 operator- (const PVRTVec2& rhs) { return PVRTVec2(-rhs.x, -rhs.y); }
1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Multiplication operator for a Vec2
1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			lhs     Scalar
1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs     A Vec2
1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of multiplication
1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	friend PVRTVec2 operator*(const VERTTYPE lhs, const PVRTVec2&  rhs)
1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(lhs);
1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out *= rhs;
1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Division operator for scalar and Vec2
1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			lhs scalar
1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs a Vec2
1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			Result of division
1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	friend PVRTVec2 operator/(const VERTTYPE lhs, const PVRTVec2&  rhs)
1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(lhs);
1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out /= rhs;
1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!**************************************************************************
1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Componentwise multiplication by scalar for Vec2*
1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs     A scalar
1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			Result of multiplication
1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 operator*(const VERTTYPE& rhs) const
1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(*this);
1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out *= rhs;
1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Componentwise multiplication and assignment by scalar for Vec2
1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs     A scalar
1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			Result of multiplication and assignment
1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2& operator*=(const VERTTYPE& rhs)
1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEMUL(x, rhs);
1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEMUL(y, rhs);
1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		Componentwise multiplication and assignment by Vec2 for Vec2
1787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs     A Vec2
1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			Result of multiplication and assignment
1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2& operator*=(const PVRTVec2& rhs)
1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEMUL(x, rhs.x);
1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEMUL(y, rhs.y);
1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		componentwise division by scalar for Vec2
1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs a scalar
1917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of division
1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 operator/(const VERTTYPE& rhs) const
1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(*this);
1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out /= rhs;
1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
1997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		componentwise division and assignment by scalar for Vec2
2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs a scalar
2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of division and assignment
2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2& operator/=(const VERTTYPE& rhs)
2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEDIV(x, rhs);
2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEDIV(y, rhs);
2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		componentwise division and assignment by Vec2 for Vec2
2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs a Vec2
2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			result of division and assignment
2157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2& operator/=(const PVRTVec2& rhs)
2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEDIV(x, rhs.x);
2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEDIV(y, rhs.y);
2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
2217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        @brief      		PVRTVec2 equality operator
2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        @param[in]			rhs     A single value
2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        @return 			true if the two vectors are equal
2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	****************************************************************************/
2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool operator==(const PVRTVec2& rhs) const
2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return ((x == rhs.x) && (y == rhs.y));
2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        @brief      		PVRTVec2 inequality operator
2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        @param[in]			rhs     A single value
2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens        @return 			true if the two vectors are not equal
2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	****************************************************************************/
2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool operator!=(const PVRTVec2& rhs) const
2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return ((x != rhs.x) || (y != rhs.y));
2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// FUNCTIONS
2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		calculates the square of the magnitude of the vector
2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			The square of the magnitude of the vector
2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE lenSqr() const
2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(x,x)+VERTTYPEMUL(y,y);
2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@fn       			length
2557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			the of the magnitude of the vector
2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		calculates the magnitude of the vector
2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE length() const
2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return (VERTTYPE) f2vt(sqrt(vt2f(x)*vt2f(x) + vt2f(y)*vt2f(y)));
2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@fn       			normalize
2657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			the normalized value of the vector
2667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		normalizes the vector
2677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 normalize()
2697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this /= length();
2717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@fn       			normalized
2757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			returns the normalized value of the vector
2767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		returns a normalized vector of the same direction as this
2777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vector
2787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 normalized() const
2807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec2 out(*this);
2827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out.normalize();
2837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@fn       			rotated90
2877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			returns the vector rotated 90�
2887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		returns the vector rotated 90�
2897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
2907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec2 rotated90() const
2917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
2927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVRTVec2(-y, x);
2937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
2947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
2967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@fn       			dot
2977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@param[in]			rhs    A single value
2987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			scalar product
2997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		calculate the scalar product of two Vec3s
3007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
3017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE dot(const PVRTVec2& rhs) const
3027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(x, rhs.x) + VERTTYPEMUL(y, rhs.y);
3047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	/*!***************************************************************************
3077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@fn       			ptr
3087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@return 			pointer
3097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		@brief      		returns a pointer to memory containing the values of the
3107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		Vec3
3117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		****************************************************************************/
3127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE *ptr() { return (VERTTYPE*)this; }
3137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
3147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @struct            PVRTVec3
3177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief             3 component vector
3187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
3197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTVec3 : public PVRTVECTOR3
3207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
3217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Constructors
3237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
3247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Blank constructor.
3267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
3277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3()
3287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = y = z = 0;
3307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Simple constructor from 3 values.
3337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fX	X component of vector
3347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fY	Y component of vector
3357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fZ	Z component of vector
3367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
3377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3(VERTTYPE fX, VERTTYPE fY, VERTTYPE fZ)
3387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = fX;	y = fY;	z = fZ;
3407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from a single value.
3437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fValue	 A component value
3447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
3457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3(const VERTTYPE fValue)
3467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = fValue; y = fValue; z = fValue;
3487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from an array
3517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			pVec	An array
3527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
3537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3(const VERTTYPE* pVec)
3547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = (*pVec++); y = (*pVec++); z = *pVec;
3567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from a PVRTVec4
3597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			v4Vec   A PVRTVec4
3607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
3617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3(const PVRTVec4& v4Vec);
3627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Operators
3647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
3657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		componentwise addition operator for two PVRTVec3s
3677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTVec3
3687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of addition
3697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
3707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 operator+(const PVRTVec3& rhs) const
3717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
3737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = x+rhs.x;
3747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = y+rhs.y;
3757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = z+rhs.z;
3767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
3777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise subtraction operator for two PVRTVec3s
3807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec3
3817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction
3827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
3837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 operator-(const PVRTVec3& rhs) const
3847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
3867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = x-rhs.x;
3877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = y-rhs.y;
3887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = z-rhs.z;
3897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
3907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
3917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
3927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
3937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise addition and assignement operator for two PVRTVec3s
3947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec3
3957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of addition
3967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
3977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3& operator+=(const PVRTVec3& rhs)
3987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
3997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x +=rhs.x;
4007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y +=rhs.y;
4017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z +=rhs.z;
4027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
4037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise subtraction and assignement operator for two PVRTVec3s
4077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec3
4087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of subtraction
4097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3& operator-=(const PVRTVec3& rhs)
4117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x -=rhs.x;
4137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y -=rhs.y;
4147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z -=rhs.z;
4157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
4167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Negation operator for a PVRTVec3
4207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec3
4217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of negation
4227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	friend PVRTVec3 operator - (const PVRTVec3& rhs) { return PVRTVec3(rhs) *= f2vt(-1); }
4247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		multiplication operator for a PVRTVec3
4277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			lhs     Single value
4287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A PVRTVec3
4297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of multiplication
4307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	friend PVRTVec3 operator*(const VERTTYPE lhs, const PVRTVec3&  rhs)
4327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
4347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(lhs,rhs.x);
4357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(lhs,rhs.y);
4367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(lhs,rhs.z);
4377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
4387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Negation operator for a PVRTVec3
4427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			lhs     Single value
4437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A PVRTVec3
4447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of negation
4457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	friend PVRTVec3 operator/(const VERTTYPE lhs, const PVRTVec3&  rhs)
4477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
4497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEDIV(lhs,rhs.x);
4507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEDIV(lhs,rhs.y);
4517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEDIV(lhs,rhs.z);
4527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
4537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication operator PVRTVec3 and PVRTMat3
4577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A PVRTMat3
4587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of multiplication
4597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 operator*(const PVRTMat3& rhs) const;
4617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication and assignment operator for PVRTVec3 and PVRTMat3
4647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A PVRTMat3
4657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of multiplication and assignment
4667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3& operator*=(const PVRTMat3& rhs);
4687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise multiplication by single dimension value for PVRTVec3
4717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A single value
4727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of multiplication
4737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 operator*(const VERTTYPE& rhs) const
4757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
4777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(x,rhs);
4787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(y,rhs);
4797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(z,rhs);
4807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
4817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise multiplication and assignement by single
4857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					dimension value	for PVRTVec3
4867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
4877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of multiplication and assignment
4887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
4897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3& operator*=(const VERTTYPE& rhs)
4907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
4917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEMUL(x,rhs);
4927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEMUL(y,rhs);
4937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z = VERTTYPEMUL(z,rhs);
4947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
4957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
4967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
4977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
4987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise division by single dimension value for PVRTVec3
4997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
5007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of division
5017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
5027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 operator/(const VERTTYPE& rhs) const
5037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
5057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEDIV(x,rhs);
5067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEDIV(y,rhs);
5077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEDIV(z,rhs);
5087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
5097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise division and assignement by single
5137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					dimension value	for PVRTVec3
5147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
5157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of division and assignment
5167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
5177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3& operator/=(const VERTTYPE& rhs)
5187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEDIV(x,rhs);
5207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEDIV(y,rhs);
5217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z = VERTTYPEDIV(z,rhs);
5227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
5237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		PVRTVec3 equality operator
5277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
5287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			true if the two vectors are equal
5297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
5307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool operator==(const PVRTVec3& rhs) const
5317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return ((x == rhs.x) && (y == rhs.y) && (z == rhs.z));
5337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		PVRTVec3 inequality operator
5377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
5387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			true if the two vectors are not equal
5397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	****************************************************************************/
5407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	bool operator!=(const PVRTVec3& rhs) const
5417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return ((x != rhs.x) || (y != rhs.y) || (z != rhs.z));
5437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// FUNCTIONS
5457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			lenSqr
5477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			the square of the magnitude of the vector
5487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculates the square of the magnitude of the vector
5497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
5507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE lenSqr() const
5517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(x,x)+VERTTYPEMUL(y,y)+VERTTYPEMUL(z,z);
5537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			length
5577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			the of the magnitude of the vector
5587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculates the magnitude of the vector
5597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
5607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE length() const
5617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return (VERTTYPE) f2vt(sqrt(vt2f(x)*vt2f(x) + vt2f(y)*vt2f(y) + vt2f(z)*vt2f(z)));
5637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			normalize
5677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			the normalized value of the vector
5687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		normalizes the vector
5697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
5707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 normalize()
5717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
5727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(PVRT_FIXED_POINT_ENABLE)
5737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Scale vector by uniform value
5747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int n = PVRTABS(x) + PVRTABS(y) + PVRTABS(z);
5757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEDIV(x, n);
5767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEDIV(y, n);
5777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z = VERTTYPEDIV(z, n);
5787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Calculate x2+y2+z2/sqrt(x2+y2+z2)
5807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int f = dot(*this);
5817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f = VERTTYPEDIV(PVRTF2X(1.0f), PVRTF2X(sqrt(PVRTX2F(f))));
5827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Multiply vector components by f
5847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = PVRTXMUL(x, f);
5857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = PVRTXMUL(y, f);
5867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z = PVRTXMUL(z, f);
5877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else
5887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE len = length();
5897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x =VERTTYPEDIV(x,len);
5907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y =VERTTYPEDIV(y,len);
5917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z =VERTTYPEDIV(z,len);
5927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
5937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
5947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
5957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
5967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
5977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			normalized
5987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			returns the normalized value of the vector
5997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		returns a normalized vector of the same direction as this
6007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					vector
6017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 normalized() const
6037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
6057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(PVRT_FIXED_POINT_ENABLE)
6067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Scale vector by uniform value
6077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int n = PVRTABS(x) + PVRTABS(y) + PVRTABS(z);
6087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEDIV(x, n);
6097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEDIV(y, n);
6107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEDIV(z, n);
6117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Calculate x2+y2+z2/sqrt(x2+y2+z2)
6137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int f = out.dot(out);
6147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f = VERTTYPEDIV(PVRTF2X(1.0f), PVRTF2X(sqrt(PVRTX2F(f))));
6157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// Multiply vector components by f
6177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = PVRTXMUL(out.x, f);
6187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = PVRTXMUL(out.y, f);
6197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = PVRTXMUL(out.z, f);
6207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else
6217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE len = length();
6227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x =VERTTYPEDIV(x,len);
6237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y =VERTTYPEDIV(y,len);
6247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z =VERTTYPEDIV(z,len);
6257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif
6267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
6277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			dot
6317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
6327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			scalar product
6337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculate the scalar product of two PVRTVec3s
6347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE dot(const PVRTVec3& rhs) const
6367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(x,rhs.x)+VERTTYPEMUL(y,rhs.y)+VERTTYPEMUL(z,rhs.z);
6387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			cross
6427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			returns three-dimensional vector
6437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculate the cross product of two PVRTVec3s
6447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 cross(const PVRTVec3& rhs) const
6467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
6487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(y,rhs.z)-VERTTYPEMUL(z,rhs.y);
6497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(z,rhs.x)-VERTTYPEMUL(x,rhs.z);
6507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(x,rhs.y)-VERTTYPEMUL(y,rhs.x);
6517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
6527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			ptr
6567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			pointer
6577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		returns a pointer to memory containing the values of the
6587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					PVRTVec3
6597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE *ptr() { return (VERTTYPE*)this; }
6617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
6627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @struct            PVRTVec4
6657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief             4 component vector
6667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTVec4 : public PVRTVECTOR4
6687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
6697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Constructors
6717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Blank constructor.
6747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
6757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4(){}
6767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Blank constructor.
6797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
6807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4(const VERTTYPE vec)
6817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = vec; y = vec; z = vec; w = vec;
6837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Constructs a PVRTVec4 from 4 separate values
6877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		fX      Value of x component
6887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		fY      Value of y component
6897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		fZ      Value of z component
6907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		fW      Value of w component
6917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
6927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4(VERTTYPE fX, VERTTYPE fY, VERTTYPE fZ, VERTTYPE fW)
6937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
6947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = fX;	y = fY;	z = fZ;	w = fW;
6957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
6967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
6977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
6987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			vec3 a PVRTVec3
6997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fW     Value of w component
7007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructs a PVRTVec4 from a vec3 and a w component
7017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4(const PVRTVec3& vec3, VERTTYPE fW)
7037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = vec3.x;	y = vec3.y;	z = vec3.z;	w = fW;
7057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructs a vec4 from a vec3 and a w component
7097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fX value of x component
7107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			vec3 a PVRTVec3
7117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4(VERTTYPE fX, const PVRTVec3& vec3)
7137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = fX;	y = vec3.x;	z = vec3.y;	w = vec3.z;
7157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructs a PVRTVec4 from a pointer to an array of four values
7197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			pVec a pointer to an array of four values
7207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4(const VERTTYPE* pVec)
7227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = (*pVec++); y = (*pVec++); z= (*pVec++); w = *pVec;
7247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** PVRTVec4 Operators
7287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Addition operator for PVRTVec4
7317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec4
7327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of addition
7337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator+(const PVRTVec4& rhs) const
7357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
7377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = x+rhs.x;
7387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = y+rhs.y;
7397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = z+rhs.z;
7407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w = w+rhs.w;
7417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
7427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Subtraction operator for PVRTVec4
7467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec4
7477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction
7487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator-(const PVRTVec4& rhs) const
7507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
7527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = x-rhs.x;
7537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = y-rhs.y;
7547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = z-rhs.z;
7557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w = w-rhs.w;
7567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
7577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Addition and assignment operator for PVRTVec4
7617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec4
7627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of addition and assignment
7637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4& operator+=(const PVRTVec4& rhs)
7657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x +=rhs.x;
7677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y +=rhs.y;
7687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z +=rhs.z;
7697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		w +=rhs.w;
7707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
7717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Subtraction and assignment operator for PVRTVec4
7757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec4
7767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction and assignment
7777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4& operator-=(const PVRTVec4& rhs)
7797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
7807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x -=rhs.x;
7817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y -=rhs.y;
7827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z -=rhs.z;
7837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		w -=rhs.w;
7847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
7857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
7867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication for PVRTVec4 and PVRTMat4
7897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A PVRTMat4
7907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
7917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator*(const PVRTMat4& rhs) const;
7937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
7947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
7957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication and assignment for PVRTVec4 and PVRTMat4
7967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A PVRTMat4
7977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignement
7987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
7997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4& operator*=(const PVRTMat4& rhs);
8007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Componentwise multiplication of a PVRTVec4 by a single value
8037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs  A single dimension value
8047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
8057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
8067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator*(const VERTTYPE& rhs) const
8077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
8097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(x,rhs);
8107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(y,rhs);
8117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(z,rhs);
8127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w = VERTTYPEMUL(w,rhs);
8137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
8147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		componentwise multiplication and assignment of a PVRTVec4 by
8187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens                    a single value
8197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A single dimension value
8207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
8217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
8227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4& operator*=(const VERTTYPE& rhs)
8237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEMUL(x,rhs);
8257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEMUL(y,rhs);
8267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z = VERTTYPEMUL(z,rhs);
8277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		w = VERTTYPEMUL(w,rhs);
8287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
8297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		componentwise division of a PVRTVec4 by a single value
8337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     A single dimension value
8347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of division
8357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
8367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator/(const VERTTYPE& rhs) const
8377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
8397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEDIV(x,rhs);
8407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEDIV(y,rhs);
8417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEDIV(z,rhs);
8427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w = VERTTYPEDIV(w,rhs);
8437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
8447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		componentwise division and assignment of a PVRTVec4 by
8487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					a single value
8497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs a single dimension value
8507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of division and assignment
8517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
8527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4& operator/=(const VERTTYPE& rhs)
8537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
8547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x = VERTTYPEDIV(x,rhs);
8557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y = VERTTYPEDIV(y,rhs);
8567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z = VERTTYPEDIV(z,rhs);
8577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		w = VERTTYPEDIV(w,rhs);
8587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
8597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
8607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		componentwise multiplication of a PVRTVec4 by
8637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					a single value
8647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				lhs a single dimension value
8657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs a PVRTVec4
8667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of muliplication
8677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
8687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensfriend PVRTVec4 operator*(const VERTTYPE lhs, const PVRTVec4&  rhs)
8697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 out;
8717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	out.x = VERTTYPEMUL(lhs,rhs.x);
8727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	out.y = VERTTYPEMUL(lhs,rhs.y);
8737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	out.z = VERTTYPEMUL(lhs,rhs.z);
8747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	out.w = VERTTYPEMUL(lhs,rhs.w);
8757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return out;
8767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		PVRTVec4 equality operator
8807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
8817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			true if the two vectors are equal
8827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
8837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool operator==(const PVRTVec4& rhs) const
8847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return ((x == rhs.x) && (y == rhs.y) && (z == rhs.z) && (w == rhs.w));
8867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
8887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@brief      		PVRTVec4 inequality operator
8907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@param[in]			rhs    A single value
8917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@return 			true if the two vectors are not equal
8927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	****************************************************************************/
8937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool operator!=(const PVRTVec4& rhs) const
8947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
8957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	return ((x != rhs.x) || (y != rhs.y) || (z != rhs.z) || (w != rhs.w));
8967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens}
8977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
8987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Functions
8997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			lenSqr
9027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			square of the magnitude of the vector
9037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculates the square of the magnitude of the vector
9047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE lenSqr() const
9067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(x,x)+VERTTYPEMUL(y,y)+VERTTYPEMUL(z,z)+VERTTYPEMUL(w,w);
9087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			length
9127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			the magnitude of the vector
9137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculates the magnitude of the vector
9147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE length() const
9167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return (VERTTYPE) f2vt(sqrt(vt2f(x)*vt2f(x) + vt2f(y)*vt2f(y) + vt2f(z)*vt2f(z) + vt2f(w)*vt2f(w)));
9187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			normalize
9227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			normalized vector
9237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		calculates the normalized value of a PVRTVec4
9247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 normalize()
9267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE len = length();
9287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		x =VERTTYPEDIV(x,len);
9297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		y =VERTTYPEDIV(y,len);
9307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		z =VERTTYPEDIV(z,len);
9317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		w =VERTTYPEDIV(w,len);
9327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
9337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			normalized
9367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			normalized vector
9377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		returns a normalized vector of the same direction as this
9387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					vector
9397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 normalized() const
9417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
9437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE len = length();
9447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x =VERTTYPEDIV(x,len);
9457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y =VERTTYPEDIV(y,len);
9467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z =VERTTYPEDIV(z,len);
9477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w =VERTTYPEDIV(w,len);
9487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
9497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			dot
9537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			scalar product
9547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		returns a normalized vector of the same direction as this
9557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					vector
9567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE dot(const PVRTVec4& rhs) const
9587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(x,rhs.x)+VERTTYPEMUL(y,rhs.y)+VERTTYPEMUL(z,rhs.z)+VERTTYPEMUL(w,rhs.w);
9607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			ptr
9647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			pointer to vector values
9657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		returns a pointer to memory containing the values of the
9667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					PVRTVec3
9677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE *ptr() { return (VERTTYPE*)this; }
9697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
9707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @struct            PVRTMat3
9737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief             3x3 Matrix
9747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTMat3 : public PVRTMATRIX3
9767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
9777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Constructors
9797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
9807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Blank constructor.
9827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3(){}
9847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from array.
9867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			pMat    An array of values for the matrix
9877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
9887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3(const VERTTYPE* pMat)
9897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
9907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE* ptr = f;
9917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<9;i++)
9927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
9937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*ptr++)=(*pMat++);
9947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
9957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
9967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
9977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
9987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	    Constructor from distinct values.
9997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m0	m0 matrix value
10007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m1	m1 matrix value
10017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m2	m2 matrix value
10027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m3	m3 matrix value
10037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m4	m4 matrix value
10047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m5	m5 matrix value
10057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m6	m6 matrix value
10067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m7	m7 matrix value
10077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]	    	m8	m8 matrix value
10087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3(VERTTYPE m0,VERTTYPE m1,VERTTYPE m2,
10107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE m3,VERTTYPE m4,VERTTYPE m5,
10117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE m6,VERTTYPE m7,VERTTYPE m8)
10127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[0]=m0;f[1]=m1;f[2]=m2;
10147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[3]=m3;f[4]=m4;f[5]=m5;
10157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[6]=m6;f[7]=m7;f[8]=m8;
10167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
10197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from 4x4 matrix - uses top left values
10207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			mat - a PVRTMat4
10217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3(const PVRTMat4& mat);
10237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/****************************************************************************
10257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** PVRTMat3 OPERATORS
10267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
10277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
10287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Returns the value of the element at the specified row and column
10297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					of the PVRTMat3
10307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			row			row of matrix
10317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			column		column of matrix
10327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			value of element
10337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE& operator()(const int row, const int column)
10357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return f[column*3+row];
10377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
10397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Returns the value of the element at the specified row and column
10407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					of the PVRTMat3
10417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			row			row of matrix
10427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			column		column of matrix
10437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			value of element
10447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const VERTTYPE& operator()(const int row, const int column) const
10467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return f[column*3+row];
10487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
10517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication of two 3x3 matrices.
10527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTMat3
10537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
10547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3 operator*(const PVRTMat3& rhs) const
10567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
10587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 1
10597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] =	VERTTYPEMUL(f[0],rhs.f[0])+VERTTYPEMUL(f[3],rhs.f[1])+VERTTYPEMUL(f[6],rhs.f[2]);
10607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[1] =	VERTTYPEMUL(f[1],rhs.f[0])+VERTTYPEMUL(f[4],rhs.f[1])+VERTTYPEMUL(f[7],rhs.f[2]);
10617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[2] =	VERTTYPEMUL(f[2],rhs.f[0])+VERTTYPEMUL(f[5],rhs.f[1])+VERTTYPEMUL(f[8],rhs.f[2]);
10627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 2
10647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[3] =	VERTTYPEMUL(f[0],rhs.f[3])+VERTTYPEMUL(f[3],rhs.f[4])+VERTTYPEMUL(f[6],rhs.f[5]);
10657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[4] =	VERTTYPEMUL(f[1],rhs.f[3])+VERTTYPEMUL(f[4],rhs.f[4])+VERTTYPEMUL(f[7],rhs.f[5]);
10667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[5] =	VERTTYPEMUL(f[2],rhs.f[3])+VERTTYPEMUL(f[5],rhs.f[4])+VERTTYPEMUL(f[8],rhs.f[5]);
10677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col3
10697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[6] =	VERTTYPEMUL(f[0],rhs.f[6])+VERTTYPEMUL(f[3],rhs.f[7])+VERTTYPEMUL(f[6],rhs.f[8]);
10707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[7] =	VERTTYPEMUL(f[1],rhs.f[6])+VERTTYPEMUL(f[4],rhs.f[7])+VERTTYPEMUL(f[7],rhs.f[8]);
10717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[8] =	VERTTYPEMUL(f[2],rhs.f[6])+VERTTYPEMUL(f[5],rhs.f[7])+VERTTYPEMUL(f[8],rhs.f[8]);
10727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
10737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
10767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element addition operator.
10777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTMat3
10787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of addition
10797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3 operator+(const PVRTMat3& rhs) const
10817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
10837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *lptr = f, *rptr = rhs.f;
10847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *outptr = out.f;
10857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<9;i++)
10867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
10877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*outptr++) = (*lptr++) + (*rptr++);
10887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
10897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
10907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
10917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
10927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
10937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element subtraction operator.
10947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTMat3
10957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction
10967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
10977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3 operator-(const PVRTMat3& rhs) const
10987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
10997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
11007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *lptr = f, *rptr = rhs.f;
11017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *outptr = out.f;
11027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<9;i++)
11037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*outptr++) = (*lptr++) - (*rptr++);
11057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
11077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
11107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Element by element addition and assignment operator.
11117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTMat3
11127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of addition and assignment
11137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
11147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3& operator+=(const PVRTMat3& rhs)
11157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *lptr = f;
11177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *rptr = rhs.f;
11187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<9;i++)
11197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*lptr++) += (*rptr++);
11217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
11237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
11267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element subtraction and assignment operator.
11277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTMat3
11287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction and assignment
11297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
11307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3& operator-=(const PVRTMat3& rhs)
11317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *lptr = f;
11337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *rptr = rhs.f;
11347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<9;i++)
11357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*lptr++) -= (*rptr++);
11377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
11397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
11427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication and assignment of two 3x3 matrices.
11437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs     Another PVRTMat3
11447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
11457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
11467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3& operator*=(const PVRTMat3& rhs)
11477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
11497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 1
11507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] =	VERTTYPEMUL(f[0],rhs.f[0])+VERTTYPEMUL(f[3],rhs.f[1])+VERTTYPEMUL(f[6],rhs.f[2]);
11517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[1] =	VERTTYPEMUL(f[1],rhs.f[0])+VERTTYPEMUL(f[4],rhs.f[1])+VERTTYPEMUL(f[7],rhs.f[2]);
11527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[2] =	VERTTYPEMUL(f[2],rhs.f[0])+VERTTYPEMUL(f[5],rhs.f[1])+VERTTYPEMUL(f[8],rhs.f[2]);
11537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 2
11557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[3] =	VERTTYPEMUL(f[0],rhs.f[3])+VERTTYPEMUL(f[3],rhs.f[4])+VERTTYPEMUL(f[6],rhs.f[5]);
11567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[4] =	VERTTYPEMUL(f[1],rhs.f[3])+VERTTYPEMUL(f[4],rhs.f[4])+VERTTYPEMUL(f[7],rhs.f[5]);
11577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[5] =	VERTTYPEMUL(f[2],rhs.f[3])+VERTTYPEMUL(f[5],rhs.f[4])+VERTTYPEMUL(f[8],rhs.f[5]);
11587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col3
11607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[6] =	VERTTYPEMUL(f[0],rhs.f[6])+VERTTYPEMUL(f[3],rhs.f[7])+VERTTYPEMUL(f[6],rhs.f[8]);
11617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[7] =	VERTTYPEMUL(f[1],rhs.f[6])+VERTTYPEMUL(f[4],rhs.f[7])+VERTTYPEMUL(f[7],rhs.f[8]);
11627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[8] =	VERTTYPEMUL(f[2],rhs.f[6])+VERTTYPEMUL(f[5],rhs.f[7])+VERTTYPEMUL(f[8],rhs.f[8]);
11637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*this = out;
11647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
11657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
11687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Element multiplication by a single value.
11697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
11707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Result of multiplication and assignment
11717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
11727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3& operator*(const VERTTYPE rhs)
11737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for (int i=0; i<9; ++i)
11757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			f[i]*=rhs;
11777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
11797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
11817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Element multiplication and assignment by a single value.
11827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
11837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
11847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
11857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3& operator*=(const VERTTYPE rhs)
11867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
11877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for (int i=0; i<9; ++i)
11887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
11897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			f[i]*=rhs;
11907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
11917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
11927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
11937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
11947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
11957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication of 3x3 matrix and vec3
11967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    Another PVRTVec3
11977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
11987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
11997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec3 operator*(const PVRTVec3& rhs) const
12007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 out;
12027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(rhs.x,f[0])+VERTTYPEMUL(rhs.y,f[3])+VERTTYPEMUL(rhs.z,f[6]);
12037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(rhs.x,f[1])+VERTTYPEMUL(rhs.y,f[4])+VERTTYPEMUL(rhs.z,f[7]);
12047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(rhs.x,f[2])+VERTTYPEMUL(rhs.y,f[5])+VERTTYPEMUL(rhs.z,f[8]);
12057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
12077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	// FUNCTIONS
12117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Functions
12137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			determinant
12167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
12177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication and assignment of 3x3 matrix and vec3
12187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE determinant() const
12207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return VERTTYPEMUL(f[0],(VERTTYPEMUL(f[4],f[8])-VERTTYPEMUL(f[7],f[5])))
12227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			- VERTTYPEMUL(f[3],(VERTTYPEMUL(f[1],f[8])-VERTTYPEMUL(f[7],f[2])))
12237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			+ VERTTYPEMUL(f[6],(VERTTYPEMUL(f[1],f[5])-VERTTYPEMUL(f[4],f[2])));
12247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			inverse
12287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			inverse mat3
12297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates multiplicative inverse of this matrix
12307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3 inverse() const
12327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
12347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE recDet = determinant();
12377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		_ASSERT(recDet!=0);
12387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		recDet = VERTTYPEDIV(f2vt(1.0f),recDet);
12397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		//TODO: deal with singular matrices with more than just an assert
12417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// inverse is 1/det * adjoint of M
12437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// adjoint is transpose of cofactor matrix
12457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// do transpose and cofactors in one step
12477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] = VERTTYPEMUL(f[4],f[8]) - VERTTYPEMUL(f[5],f[7]);
12497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[1] = VERTTYPEMUL(f[2],f[7]) - VERTTYPEMUL(f[1],f[8]);
12507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[2] = VERTTYPEMUL(f[1],f[5]) - VERTTYPEMUL(f[2],f[4]);
12517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[3] = VERTTYPEMUL(f[5],f[6]) - VERTTYPEMUL(f[3],f[8]);
12537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[4] = VERTTYPEMUL(f[0],f[8]) - VERTTYPEMUL(f[2],f[6]);
12547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[5] = VERTTYPEMUL(f[2],f[3]) - VERTTYPEMUL(f[0],f[5]);
12557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[6] = VERTTYPEMUL(f[3],f[7]) - VERTTYPEMUL(f[4],f[6]);
12577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[7] = VERTTYPEMUL(f[1],f[6]) - VERTTYPEMUL(f[0],f[7]);
12587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[8] = VERTTYPEMUL(f[0],f[4]) - VERTTYPEMUL(f[1],f[3]);
12597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out *= recDet;
12617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
12627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			transpose
12667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			transpose 3x3 matrix
12677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates the transpose of this matrix
12687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat3 transpose() const
12707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
12727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] = f[0];	out.f[3] = f[1];	out.f[6] = f[2];
12737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[1] = f[3];	out.f[4] = f[4];	out.f[7] = f[5];
12747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[2] = f[6];	out.f[5] = f[7];	out.f[8] = f[8];
12757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
12767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
12777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			ptr
12807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			pointer to an array of the elements of this PVRTMat3
12817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates transpose of this matrix
12827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE *ptr() { return (VERTTYPE*)&f; }
12847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
12857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Static factory functions
12877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
12897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			Identity
12907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 representation of the 3x3 identity matrix
12917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Generates an identity matrix
12927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
12937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 Identity()
12947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
12957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat3 out;
12967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] = 1;out.f[1] = 0;out.f[2] = 0;
12977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[3] = 0;out.f[4] = 1;out.f[5] = 0;
12987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[6] = 0;out.f[7] = 0;out.f[8] = 1;
12997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
13007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			RotationX
13047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
13057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
13067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the X axis
13077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 RotationX(VERTTYPE angle);
13097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			RotationY
13127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
13137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
13147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the Y axis
13157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 RotationY(VERTTYPE angle);
13177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			RotationZ
13207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
13217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
13227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the Z axis
13237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 RotationZ(VERTTYPE angle);
13257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			Rotation2D
13287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
13297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
13307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the Z axis
13317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 Rotation2D(VERTTYPE angle)
13337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return RotationZ(angle);
13357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			Scale
13397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested scaling transformation
13407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to scaling of fx, fy and fz
13417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					times in each axis.
13427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 Scale(const VERTTYPE fx,const VERTTYPE fy,const VERTTYPE fz)
13447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVRTMat3(fx,0,0,
13467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						0,fy,0,
13477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						0,0,fz);
13487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			Scale2D
13527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested scaling transformation
13537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to scaling of fx, fy and fz
13547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					times in each axis.
13557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 Scale2D(const VERTTYPE fx,const VERTTYPE fy)
13577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVRTMat3(fx,0,0,
13597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						0,fy,0,
13607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						0,0,f2vt(1));
13617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			Translation2D
13657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested translation
13667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a transformation
13677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					of tx and ty times in each axis.
13687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat3 Translation2D(const VERTTYPE tx, const VERTTYPE ty)
13707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
13717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVRTMat3( f2vt(1),    0,  0,
13727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						 0,    f2vt(1),  0,
13737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens						tx,  		ty,  f2vt(1));
13747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
13757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
13777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
13787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @struct            PVRTMat4
13807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief             4x4 Matrix
13817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
13827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstruct PVRTMat4 : public PVRTMATRIX
13837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{
13847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Constructors
13867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
13877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Blank constructor.
13897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
13907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4(){}
13917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
13927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from array.
13937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m0	m0 matrix value
13947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m1	m1 matrix value
13957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m2	m2 matrix value
13967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m3	m3 matrix value
13977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m4	m4 matrix value
13987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m5	m5 matrix value
13997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m6	m6 matrix value
14007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m7	m7 matrix value
14017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m8	m8 matrix value
14027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m9	m9 matrix value
14037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m10	m10 matrix value
14047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m11	m11 matrix value
14057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m12	m12 matrix value
14067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m13	m13 matrix value
14077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m14	m14 matrix value
14087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			m15	m15 matrix value
14097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4(VERTTYPE m0,VERTTYPE m1,VERTTYPE m2,VERTTYPE m3,
14117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE m4,VERTTYPE m5,VERTTYPE m6,VERTTYPE m7,
14127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE m8,VERTTYPE m9,VERTTYPE m10,VERTTYPE m11,
14137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE m12,VERTTYPE m13,VERTTYPE m14,VERTTYPE m15)
14147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[0]=m0;f[1]=m1;f[2]=m2;f[3]=m3;
14167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[4]=m4;f[5]=m5;f[6]=m6;f[7]=m7;
14177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[8]=m8;f[9]=m9;f[10]=m10;f[11]=m11;
14187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[12]=m12;f[13]=m13;f[14]=m14;f[15]=m15;
14197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
14217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Constructor from distinct values.
14227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			mat     A pointer to an array of 16 VERTTYPEs
14237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4(const VERTTYPE* mat)
14257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE* ptr = f;
14277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<16;i++)
14287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
14297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*ptr++)=(*mat++);
14307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
14317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/****************************************************************************
14347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** PVRTMat4 OPERATORS
14357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/
14367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
14377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Returns value of the element at row r and colun c of the
14387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					PVRTMat4
14397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				r - row of matrix
14407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				c - column of matrix
14417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			value of element
14427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE& operator()(const int r, const int c)
14447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return f[c*4+r];
14467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
14497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Returns value of the element at row r and colun c of the
14507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					PVRTMat4
14517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				r - row of matrix
14527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				c - column of matrix
14537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			value of element
14547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	const VERTTYPE& operator()(const int r, const int c) const
14567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return f[c*4+r];
14587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
14617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication of two 4x4 matrices.
14627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
14637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
14647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4 operator*(const PVRTMat4& rhs) const;
14667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
14687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element addition operator.
14697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
14707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of addition
14717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4 operator+(const PVRTMat4& rhs) const
14737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 out;
14757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *lptr = f, *rptr = rhs.f;
14767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *outptr = out.f;
14777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<16;i++)
14787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
14797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*outptr++) = (*lptr++) + (*rptr++);
14807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
14817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
14827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
14857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element subtraction operator.
14867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
14877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction
14887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
14897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4 operator-(const PVRTMat4& rhs) const
14907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
14917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 out;
14927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<16;i++)
14937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
14947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			out.f[i] = f[i]-rhs.f[i];
14957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
14967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
14977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
14987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
14997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
15007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element addition and assignment operator.
15017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
15027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of addition and assignment
15037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
15047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& operator+=(const PVRTMat4& rhs)
15057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *lptr = f;
15077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *rptr = rhs.f;
15087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<16;i++)
15097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
15107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*lptr++) += (*rptr++);
15117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
15127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
15137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
15167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element by element subtraction and assignment operator.
15177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
15187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of subtraction and assignment
15197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
15207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& operator-=(const PVRTMat4& rhs)
15217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE *lptr = f;
15237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE const *rptr = rhs.f;
15247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(int i=0;i<16;i++)
15257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
15267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			(*lptr++) -= (*rptr++);
15277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
15287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
15297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
15337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication and assignment of two 4x4 matrices.
15347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
15357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
15367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
15377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& operator*=(const PVRTMat4& rhs)
15387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 result;
15407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 0
15417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[0] =	VERTTYPEMUL(f[0],rhs.f[0])+VERTTYPEMUL(f[4],rhs.f[1])+VERTTYPEMUL(f[8],rhs.f[2])+VERTTYPEMUL(f[12],rhs.f[3]);
15427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[1] =	VERTTYPEMUL(f[1],rhs.f[0])+VERTTYPEMUL(f[5],rhs.f[1])+VERTTYPEMUL(f[9],rhs.f[2])+VERTTYPEMUL(f[13],rhs.f[3]);
15437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[2] =	VERTTYPEMUL(f[2],rhs.f[0])+VERTTYPEMUL(f[6],rhs.f[1])+VERTTYPEMUL(f[10],rhs.f[2])+VERTTYPEMUL(f[14],rhs.f[3]);
15447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[3] =	VERTTYPEMUL(f[3],rhs.f[0])+VERTTYPEMUL(f[7],rhs.f[1])+VERTTYPEMUL(f[11],rhs.f[2])+VERTTYPEMUL(f[15],rhs.f[3]);
15457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 1
15477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[4] =	VERTTYPEMUL(f[0],rhs.f[4])+VERTTYPEMUL(f[4],rhs.f[5])+VERTTYPEMUL(f[8],rhs.f[6])+VERTTYPEMUL(f[12],rhs.f[7]);
15487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[5] =	VERTTYPEMUL(f[1],rhs.f[4])+VERTTYPEMUL(f[5],rhs.f[5])+VERTTYPEMUL(f[9],rhs.f[6])+VERTTYPEMUL(f[13],rhs.f[7]);
15497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[6] =	VERTTYPEMUL(f[2],rhs.f[4])+VERTTYPEMUL(f[6],rhs.f[5])+VERTTYPEMUL(f[10],rhs.f[6])+VERTTYPEMUL(f[14],rhs.f[7]);
15507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[7] =	VERTTYPEMUL(f[3],rhs.f[4])+VERTTYPEMUL(f[7],rhs.f[5])+VERTTYPEMUL(f[11],rhs.f[6])+VERTTYPEMUL(f[15],rhs.f[7]);
15517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 2
15537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[8] =	VERTTYPEMUL(f[0],rhs.f[8])+VERTTYPEMUL(f[4],rhs.f[9])+VERTTYPEMUL(f[8],rhs.f[10])+VERTTYPEMUL(f[12],rhs.f[11]);
15547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[9] =	VERTTYPEMUL(f[1],rhs.f[8])+VERTTYPEMUL(f[5],rhs.f[9])+VERTTYPEMUL(f[9],rhs.f[10])+VERTTYPEMUL(f[13],rhs.f[11]);
15557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[10] =	VERTTYPEMUL(f[2],rhs.f[8])+VERTTYPEMUL(f[6],rhs.f[9])+VERTTYPEMUL(f[10],rhs.f[10])+VERTTYPEMUL(f[14],rhs.f[11]);
15567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[11] =	VERTTYPEMUL(f[3],rhs.f[8])+VERTTYPEMUL(f[7],rhs.f[9])+VERTTYPEMUL(f[11],rhs.f[10])+VERTTYPEMUL(f[15],rhs.f[11]);
15577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		// col 3
15597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[12] =	VERTTYPEMUL(f[0],rhs.f[12])+VERTTYPEMUL(f[4],rhs.f[13])+VERTTYPEMUL(f[8],rhs.f[14])+VERTTYPEMUL(f[12],rhs.f[15]);
15607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[13] =	VERTTYPEMUL(f[1],rhs.f[12])+VERTTYPEMUL(f[5],rhs.f[13])+VERTTYPEMUL(f[9],rhs.f[14])+VERTTYPEMUL(f[13],rhs.f[15]);
15617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[14] =	VERTTYPEMUL(f[2],rhs.f[12])+VERTTYPEMUL(f[6],rhs.f[13])+VERTTYPEMUL(f[10],rhs.f[14])+VERTTYPEMUL(f[14],rhs.f[15]);
15627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[15] =	VERTTYPEMUL(f[3],rhs.f[12])+VERTTYPEMUL(f[7],rhs.f[13])+VERTTYPEMUL(f[11],rhs.f[14])+VERTTYPEMUL(f[15],rhs.f[15]);
15637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		*this = result;
15657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
15667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
15697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element multiplication by a single value.
15707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
15717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
15727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
15737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& operator*(const VERTTYPE rhs)
15747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for (int i=0; i<16; ++i)
15767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
15777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			f[i]*=rhs;
15787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
15797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
15807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
15827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element multiplication and assignment by a single value.
15837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			rhs    A single value
15847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
15857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
15867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& operator*=(const VERTTYPE rhs)
15877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
15887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for (int i=0; i<16; ++i)
15897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
15907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			f[i]*=rhs;
15917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
15927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
15937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
15947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
15957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
15967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		element assignment operator.
15977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs another PVRTMat4
15987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of assignment
15997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
16007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& operator=(const PVRTMat4& rhs)
16017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
16027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for (int i=0; i<16; ++i)
16037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
16047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			f[i] =rhs.f[i];
16057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
16067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
16077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
16087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
16097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication of 4x4 matrix and vec3
16107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs a PVRTVec4
16117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication
16127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
16137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator*(const PVRTVec4& rhs) const
16147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
16157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
16167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(rhs.x,f[0])+VERTTYPEMUL(rhs.y,f[4])+VERTTYPEMUL(rhs.z,f[8])+VERTTYPEMUL(rhs.w,f[12]);
16177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(rhs.x,f[1])+VERTTYPEMUL(rhs.y,f[5])+VERTTYPEMUL(rhs.z,f[9])+VERTTYPEMUL(rhs.w,f[13]);
16187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(rhs.x,f[2])+VERTTYPEMUL(rhs.y,f[6])+VERTTYPEMUL(rhs.z,f[10])+VERTTYPEMUL(rhs.w,f[14]);
16197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w = VERTTYPEMUL(rhs.x,f[3])+VERTTYPEMUL(rhs.y,f[7])+VERTTYPEMUL(rhs.z,f[11])+VERTTYPEMUL(rhs.w,f[15]);
16207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
16227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
16237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
16257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Matrix multiplication and assignment of 4x4 matrix and vec3
16267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				rhs a PVRTVec4
16277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			result of multiplication and assignment
16287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
16297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTVec4 operator*=(const PVRTVec4& rhs) const
16307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
16317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec4 out;
16327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.x = VERTTYPEMUL(rhs.x,f[0])+VERTTYPEMUL(rhs.y,f[4])+VERTTYPEMUL(rhs.z,f[8])+VERTTYPEMUL(rhs.w,f[12]);
16337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.y = VERTTYPEMUL(rhs.x,f[1])+VERTTYPEMUL(rhs.y,f[5])+VERTTYPEMUL(rhs.z,f[9])+VERTTYPEMUL(rhs.w,f[13]);
16347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.z = VERTTYPEMUL(rhs.x,f[2])+VERTTYPEMUL(rhs.y,f[6])+VERTTYPEMUL(rhs.z,f[10])+VERTTYPEMUL(rhs.w,f[14]);
16357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.w = VERTTYPEMUL(rhs.x,f[3])+VERTTYPEMUL(rhs.y,f[7])+VERTTYPEMUL(rhs.z,f[11])+VERTTYPEMUL(rhs.w,f[15]);
16367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
16387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
16397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
16417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates multiplicative inverse of this matrix
16427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					The matrix must be of the form :
16437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					A 0
16447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					C 1
16457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					Where A is a 3x3 matrix and C is a 1x3 matrix.
16467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			inverse mat4
16477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
16487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4 inverse() const;
16497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
16517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			inverseEx
16527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			inverse mat4
16537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates multiplicative inverse of this matrix
16547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					Uses a linear equation solver and the knowledge that M.M^-1=I.
16557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					Use this fn to calculate the inverse of matrices that
16567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					inverse() cannot.
16577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
16587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4 inverseEx() const
16597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
16607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 out;
16617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE 		*ppRows[4];
16627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE 		pRes[4];
16637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE 		pIn[20];
16647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		int				i, j;
16657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(i = 0; i < 4; ++i)
16677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			ppRows[i] = &pIn[i * 5];
16687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		/* Solve 4 sets of 4 linear equations */
16707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		for(i = 0; i < 4; ++i)
16717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
16727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(j = 0; j < 4; ++j)
16737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
16747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				ppRows[j][0] = PVRTMat4::Identity().f[i + 4 * j];
16757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				memcpy(&ppRows[j][1], &f[j * 4], 4 * sizeof(VERTTYPE));
16767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
16777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			PVRTLinearEqSolve(pRes, (VERTTYPE**)ppRows, 4);
16797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			for(j = 0; j < 4; ++j)
16817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			{
16827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				out.f[i + 4 * j] = pRes[j];
16837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			}
16847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
16857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
16877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
16887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
16897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
16907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			transpose
16917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			transpose mat4
16927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates transpose of this matrix
16937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
16947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4 transpose() const
16957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
16967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 out;
16977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] = f[0];		out.f[1] = f[4];		out.f[2] = f[8];		out.f[3] = f[12];
16987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[4] = f[1];		out.f[5] = f[5];		out.f[6] = f[9];		out.f[7] = f[13];
16997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[8] = f[2];		out.f[9] = f[6];		out.f[10] = f[10];		out.f[11] = f[14];
17007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[12] = f[3];		out.f[13] = f[7];		out.f[14] = f[11];		out.f[15] = f[15];
17017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
17027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
17037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Alters the translation component of the transformation matrix.
17067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			tx      Distance of translation in x axis
17077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			ty      Distance of translation in y axis
17087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			tz      Distance of translation in z axis
17097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns this
17107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& postTranslate(VERTTYPE tx, VERTTYPE ty, VERTTYPE tz)
17127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
17137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[12] += VERTTYPEMUL(tx,f[0])+VERTTYPEMUL(ty,f[4])+VERTTYPEMUL(tz,f[8]);
17147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[13] += VERTTYPEMUL(tx,f[1])+VERTTYPEMUL(ty,f[5])+VERTTYPEMUL(tz,f[9]);
17157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[14] += VERTTYPEMUL(tx,f[2])+VERTTYPEMUL(ty,f[6])+VERTTYPEMUL(tz,f[10]);
17167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[15] += VERTTYPEMUL(tx,f[3])+VERTTYPEMUL(ty,f[7])+VERTTYPEMUL(tz,f[11]);
17177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//			col(3) += tx * col(0) + ty * col(1) + tz * col(2);
17197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
17207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
17217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Alters the translation component of the transformation matrix.
17247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			tvec    Translation vector
17257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns this
17267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& postTranslate(const PVRTVec3& tvec)
17287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
17297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return postTranslate(tvec.x, tvec.y, tvec.z);
17307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
17317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Translates the matrix from the passed parameters
17347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			tx      Distance of translation in x axis
17357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			ty      Distance of translation in y axis
17367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			tz      Distance of translation in z axis
17377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns this
17387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& preTranslate(VERTTYPE tx, VERTTYPE ty, VERTTYPE tz)
17407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
17417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[0]+=VERTTYPEMUL(f[3],tx);	f[4]+=VERTTYPEMUL(f[7],tx);	f[8]+=VERTTYPEMUL(f[11],tx);	f[12]+=VERTTYPEMUL(f[15],tx);
17427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[1]+=VERTTYPEMUL(f[3],ty);	f[5]+=VERTTYPEMUL(f[7],ty);	f[9]+=VERTTYPEMUL(f[11],ty);	f[13]+=VERTTYPEMUL(f[15],ty);
17437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		f[2]+=VERTTYPEMUL(f[3],tz);	f[6]+=VERTTYPEMUL(f[7],tz);	f[10]+=VERTTYPEMUL(f[11],tz);	f[14]+=VERTTYPEMUL(f[15],tz);
17447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//			row(0) += tx * row(3);
17467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//			row(1) += ty * row(3);
17477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens//			row(2) += tz * row(3);
17487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return *this;
17497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
17507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Translates the matrix from the passed parameters
17537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			tvec    Translation vector
17547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns the translation defined by the passed parameters
17557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	PVRTMat4& preTranslate(const PVRTVec3& tvec)
17577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
17587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return preTranslate(tvec.x, tvec.y, tvec.z);
17597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
17607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates transpose of this matrix
17627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			pointer to an array of the elements of this PVRTMat4
17637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	VERTTYPE *ptr() { return (VERTTYPE*)&f; }
17657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Static factory functions
17687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Generates an identity matrix
17717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat4 representation of the 4x4 identity matrix
17727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Identity()
17747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
17757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 out;
17767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[0] = f2vt(1);out.f[1] = 0;out.f[2] = 0;out.f[3] = 0;
17777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[4] = 0;out.f[5] = f2vt(1);out.f[6] = 0;out.f[7] = 0;
17787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[8] = 0;out.f[9] = 0;out.f[10] = f2vt(1);out.f[11] = 0;
17797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		out.f[12] = 0;out.f[13] = 0;out.f[14] = 0;out.f[15] = f2vt(1);
17807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return out;
17817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
17827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
17837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			RotationX
17857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
17867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
17877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the X axis
17887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 RotationX(VERTTYPE angle);
17907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			RotationY
17927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
17937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
17947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the Y axis
17957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
17967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 RotationY(VERTTYPE angle);
17977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
17987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			RotationZ
17997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested rotation
18007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to a rotation of angle
18017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					degrees about the Z axis
18027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 RotationZ(VERTTYPE angle);
18047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
18067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to scaling of fx, fy and fz
18077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					times in each axis.
18087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested scaling transformation
18097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Scale(const VERTTYPE fx,const VERTTYPE fy,const VERTTYPE fz)
18117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVRTMat4(fx,0,0,0,
18137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			0,fy,0,0,
18147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			0,0,fz,0,
18157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			0,0,0,f2vt(1));
18167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
18177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
18197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a matrix corresponding to scaling of the given vector.
18207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat3 corresponding to the requested scaling transformation
18217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Scale(const PVRTVec3& vec)
18237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return Scale(vec.x, vec.y, vec.z);
18257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
18267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
18287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a 4x4 matrix corresponding to a transformation
18297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					of tx, ty and tz distance in each axis.
18307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat4 corresponding to the requested translation
18317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Translation(const VERTTYPE tx, const VERTTYPE ty, const VERTTYPE tz)
18337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PVRTMat4(f2vt(1),0,0,0,
18357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			0,f2vt(1),0,0,
18367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			0,0,f2vt(1),0,
18377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			tx,ty,tz,f2vt(1));
18387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
18397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
18417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Calculates a 4x4 matrix corresponding to a transformation
18427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					of tx, ty and tz distance in each axis as taken from the
18437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					given vector.
18447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			a PVRTMat4 corresponding to the requested translation
18457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Translation(const PVRTVec3& vec)
18487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return Translation(vec.x, vec.y, vec.z);
18507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
18517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
18537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Clipspace enum
18547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Determines whether clip space Z ranges from -1 to 1 (OGL) or from 0 to 1 (D3D)
18557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	enum eClipspace { OGL, D3D };
18577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
18597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Translates the matrix from the passed parameters
18607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			left        Left view plane
18617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			top         Top view plane
18627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			right       Right view plane
18637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bottom      Bottom view plane
18647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane   The near rendering plane
18657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			farPlane    The far rendering plane
18667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs          Which clipspace convention is being used
18677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate     Is the viewport in portrait or landscape mode
18687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns the orthogonal projection matrix defined by the passed parameters
18697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
18707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Ortho(VERTTYPE left, VERTTYPE top, VERTTYPE right,
18717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE bottom, VERTTYPE nearPlane, VERTTYPE farPlane, const eClipspace cs, bool bRotate = false)
18727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
18737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE rcplmr = VERTTYPEDIV(VERTTYPE(1),(left - right));
18747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE rcpbmt = VERTTYPEDIV(VERTTYPE(1),(bottom - top));
18757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE rcpnmf = VERTTYPEDIV(VERTTYPE(1),(nearPlane - farPlane));
18767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 result;
18787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (bRotate)
18807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
18817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[0]=0;		result.f[4]=VERTTYPEMUL(2,rcplmr); result.f[8]=0; result.f[12]=VERTTYPEMUL(-(right+left),rcplmr);
18827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[1]=VERTTYPEMUL(-2,rcpbmt);	result.f[5]=0;		result.f[9]=0;	result.f[13]=VERTTYPEMUL((top+bottom),rcpbmt);
18837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
18847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
18857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
18867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[0]=VERTTYPEMUL(-2,rcplmr);	result.f[4]=0; result.f[8]=0; result.f[12]=VERTTYPEMUL(right+left,rcplmr);
18877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[1]=0;		result.f[5]=VERTTYPEMUL(-2,rcpbmt);	result.f[9]=0;	result.f[13]=VERTTYPEMUL((top+bottom),rcpbmt);
18887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
18897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (cs == D3D)
18907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
18917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[2]=0;	result.f[6]=0;	result.f[10]=-rcpnmf;	result.f[14]=VERTTYPEMUL(nearPlane,rcpnmf);
18927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
18937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
18947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
18957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[2]=0;	result.f[6]=0;	result.f[10]=VERTTYPEMUL(-2,rcpnmf);	result.f[14]=VERTTYPEMUL(nearPlane + farPlane,rcpnmf);
18967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
18977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[3]=0;	result.f[7]=0;	result.f[11]=0;	result.f[15]=1;
18987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
18997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return result;
19007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
19017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			LookAtRH
19047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				vEye position of 'camera'
19057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				vAt target that camera points at
19067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				vUp up vector for camera
19077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns the view matrix defined by the passed parameters
19087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Create a look-at view matrix for a right hand coordinate
19097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					system
19107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 LookAtRH(const PVRTVec3& vEye, const PVRTVec3& vAt, const PVRTVec3& vUp)
19127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return LookAt(vEye, vAt, vUp, true); }
19137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @fn       			LookAtLH
19157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				vEye position of 'camera'
19167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				vAt target that camera points at
19177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]				vUp up vector for camera
19187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns the view matrix defined by the passed parameters
19197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Create a look-at view matrix for a left hand coordinate
19207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens					system
19217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 LookAtLH(const PVRTVec3& vEye, const PVRTVec3& vAt, const PVRTVec3& vUp)
19237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return LookAt(vEye, vAt, vUp, false);	}
19247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a right hand coordinate
19277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
19287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			width		width of viewplane
19297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			height		height of viewplane
19307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
19317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			farPlane	far clipping distance
19327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
19337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
19347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
19357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveRH(VERTTYPE width, VERTTYPE height, VERTTYPE nearPlane,
19377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE farPlane, const eClipspace cs, bool bRotate = false)
19387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return Perspective(width, height, nearPlane, farPlane, cs, true, bRotate); }
19397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a left hand coordinate
19427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
19437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			width		width of viewplane
19447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			height		height of viewplane
19457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
19467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			farPlane	far clipping distance
19477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
19487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
19497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
19507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveLH(VERTTYPE width, VERTTYPE height, VERTTYPE nearPlane, VERTTYPE farPlane, const eClipspace cs, bool bRotate = false)
19527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return Perspective(width, height, nearPlane, farPlane, cs, false, bRotate); }
19537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a right hand coordinate
19567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
19577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			width		width of viewplane
19587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			height		height of viewplane
19597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
19607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
19617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
19627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
19637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFloatDepthRH(VERTTYPE width, VERTTYPE height, VERTTYPE nearPlane, const eClipspace cs, bool bRotate = false)
19657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return PerspectiveFloatDepth(width, height, nearPlane, cs, true, bRotate); }
19667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a left hand coordinate
19697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
19707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			width		width of viewplane
19717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			height		height of viewplane
19727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
19737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
19747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
19757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
19767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFloatDepthLH(VERTTYPE width, VERTTYPE height, VERTTYPE nearPlane, const eClipspace cs, bool bRotate = false)
19787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return PerspectiveFloatDepth(width, height, nearPlane, cs, false, bRotate); }
19797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
19807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a right hand coordinate
19827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
19837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fovy		angle of view (vertical)
19847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			aspect		aspect ratio of view
19857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
19867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			farPlane	far clipping distance
19877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
19887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
19897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
19907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
19917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFovRH(VERTTYPE fovy, VERTTYPE aspect, VERTTYPE nearPlane, VERTTYPE farPlane, const eClipspace cs, bool bRotate = false)
19927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return PerspectiveFov(fovy, aspect, nearPlane, farPlane, cs, true, bRotate); }
19937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
19947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a left hand coordinate
19957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
19967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fovy		angle of view (vertical)
19977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			aspect		aspect ratio of view
19987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
19997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			farPlane	far clipping distance
20007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
20017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
20027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
20037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
20047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFovLH(VERTTYPE fovy, VERTTYPE aspect, VERTTYPE nearPlane, VERTTYPE farPlane, const eClipspace cs, bool bRotate = false)
20057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return PerspectiveFov(fovy, aspect, nearPlane, farPlane, cs, false, bRotate); }
20067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
20087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a right hand coordinate
20097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
20107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fovy		angle of view (vertical)
20117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			aspect		aspect ratio of view
20127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
20137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
20147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
20157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
20167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
20177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFovFloatDepthRH(VERTTYPE fovy, VERTTYPE aspect, VERTTYPE nearPlane, const eClipspace cs, bool bRotate = false)
20187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return PerspectiveFovFloatDepth(fovy, aspect, nearPlane, cs, true, bRotate); }
20197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
20207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix for a left hand coordinate
20217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				system
20227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			fovy		angle of view (vertical)
20237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			aspect		aspect ratio of view
20247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			nearPlane	near clipping distance
20257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			cs			cs which clipspace convention is being used
20267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRotate is the viewport in portrait or landscape mode
20277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
20287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
20297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFovFloatDepthLH(VERTTYPE fovy, VERTTYPE aspect, VERTTYPE nearPlane, const eClipspace cs, bool bRotate = false)
20307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{ return PerspectiveFovFloatDepth(fovy, aspect, nearPlane, cs, false, bRotate); }
20317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
20337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      		Create a look-at view matrix
20347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			vEye            Position of 'camera'
20357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			vAt             Target that camera points at
20367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			vUp             Up vector for camera
20377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]			bRightHanded    Handedness of coordinate system
20387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 			Returns the view matrix defined by the passed parameters
20397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
20407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 LookAt(const PVRTVec3& vEye, const PVRTVec3& vAt, const PVRTVec3& vUp, bool bRightHanded)
20417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
20427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTVec3 vForward, vUpNorm, vSide;
20437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 result;
20447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vForward = (bRightHanded) ? vEye - vAt : vAt - vEye;
20467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vForward.normalize();
20487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vSide   = vUp.cross( vForward);
20497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vSide	= vSide.normalized();
20507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vUpNorm = vForward.cross(vSide);
20517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		vUpNorm = vUpNorm.normalized();
20527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[0]=vSide.x;	result.f[4]=vSide.y;	result.f[8]=vSide.z;		result.f[12]=0;
20547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[1]=vUpNorm.x;	result.f[5]=vUpNorm.y;	result.f[9]=vUpNorm.z;		result.f[13]=0;
20557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[2]=vForward.x; result.f[6]=vForward.y;	result.f[10]=vForward.z;	result.f[14]=0;
20567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[3]=0;			result.f[7]=0;			result.f[11]=0;				result.f[15]=f2vt(1);
20577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.postTranslate(-vEye);
20607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return result;
20617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
20627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
20647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Create a perspective matrix
20657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		width		Width of viewplane
20667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		height		Height of viewplane
20677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		nearPlane	Near clipping distance
20687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		farPlane	Far clipping distance
20697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		cs			Which clipspace convention is being used
20707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRightHanded	Handedness of coordinate system
20717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRotate		Is the viewport in portrait or landscape mode
20727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
20737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
20747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 Perspective(
20757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE width, VERTTYPE height,
20767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE nearPlane, VERTTYPE farPlane,
20777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const eClipspace cs,
20787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRightHanded,
20797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRotate = false)
20807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
20817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE n2 = VERTTYPEMUL(f2vt(2),nearPlane);
20827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE rcpnmf = VERTTYPEDIV(f2vt(1),(nearPlane - farPlane));
20837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
20847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 result;
20857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (bRotate)
20867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
20877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[0] = 0;	result.f[4]=VERTTYPEDIV(-n2,width);	result.f[8]=0;	result.f[12]=0;
20887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[1] = VERTTYPEDIV(n2,height);	result.f[5]=0;	result.f[9]=0;	result.f[13]=0;
20897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
20907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
20917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
20927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[0] = VERTTYPEDIV(n2,width);	result.f[4]=0;	result.f[8]=0;	result.f[12]=0;
20937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[1] = 0;	result.f[5]=VERTTYPEDIV(n2,height);	result.f[9]=0;	result.f[13]=0;
20947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
20957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (cs == D3D)
20967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
20977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[2] = 0;	result.f[6]=0;	result.f[10]=VERTTYPEMUL(farPlane,rcpnmf);	result.f[14]=VERTTYPEMUL(VERTTYPEMUL(farPlane,rcpnmf),nearPlane);
20987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
20997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
21007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
21017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[2] = 0;	result.f[6]=0;	result.f[10]=VERTTYPEMUL(farPlane+nearPlane,rcpnmf);	result.f[14]=VERTTYPEMUL(VERTTYPEMUL(farPlane,rcpnmf),n2);
21027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
21037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[3] = 0;	result.f[7]=0;	result.f[11]=f2vt(-1);	result.f[15]=0;
21047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (!bRightHanded)
21067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
21077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[10] = VERTTYPEMUL(result.f[10], f2vt(-1));
21087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[11] = f2vt(1);
21097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
21107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return result;
21127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
21137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
21157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Perspective calculation where far plane is assumed to be at an infinite distance and the screen
21167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				space Z is inverted
21177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		width		Width of viewplane
21187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		height		Height of viewplane
21197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		nearPlane	Near clipping distance
21207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		cs			Which clipspace convention is being used
21217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRightHanded	Handedness of coordinate system
21227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRotate		Is the viewport in portrait or landscape mode
21237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
21247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
21257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFloatDepth(
21267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE width, VERTTYPE height,
21277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE nearPlane,
21287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const eClipspace cs,
21297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRightHanded,
21307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRotate = false)
21317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
21327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE n2 = VERTTYPEMUL(2,nearPlane);
21337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		PVRTMat4 result;
21357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (bRotate)
21367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
21377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[0] = 0;	result.f[4]=VERTTYPEDIV(-n2,width);	result.f[8]=0;	result.f[12]=0;
21387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[1] = VERTTYPEDIV(n2,height);	result.f[5]=0;	result.f[9]=0;	result.f[13]=0;
21397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
21407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
21417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
21427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[0] = VERTTYPEDIV(n2,width);	result.f[4]=0;	result.f[8]=0;	result.f[12]=0;
21437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[1] = 0;	result.f[5]=VERTTYPEDIV(n2,height);	result.f[9]=0;	result.f[13]=0;
21447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
21457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (cs == D3D)
21467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
21477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[2] = 0;	result.f[6]=0;	result.f[10]=0;	result.f[14]=nearPlane;
21487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
21497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		else
21507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		{
21517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens			result.f[2] = 0;	result.f[6]=0;	result.f[10]=(bRightHanded?(VERTTYPE)1:(VERTTYPE)-1);	result.f[14]=n2;
21527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		}
21537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		result.f[3] = (VERTTYPE)0;	result.f[7]=(VERTTYPE)0;	result.f[11]= (bRightHanded?(VERTTYPE)-1:(VERTTYPE)1);	result.f[15]=(VERTTYPE)0;
21547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return result;
21567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
21577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
21597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Perspective calculation where field of view is used instead of near plane dimensions
21607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		fovy		Angle of view (vertical)
21617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		aspect		Aspect ratio of view
21627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		nearPlane	Near clipping distance
21637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		farPlane	Far clipping distance
21647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		cs			Which clipspace convention is being used
21657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRightHanded	Handedness of coordinate system
21667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRotate		Is the viewport in portrait or landscape mode
21677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
21687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
21697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFov(
21707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE fovy, VERTTYPE aspect,
21717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE nearPlane, VERTTYPE farPlane,
21727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const eClipspace cs,
21737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRightHanded,
21747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRotate = false)
21757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
21767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE height = VERTTYPEMUL(VERTTYPEMUL(f2vt(2.0f),nearPlane),PVRTTAN(VERTTYPEMUL(fovy,f2vt(0.5f))));
21777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (bRotate) return Perspective(height, VERTTYPEDIV(height,aspect), nearPlane, farPlane, cs, bRightHanded, bRotate);
21787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return Perspective(VERTTYPEMUL(height,aspect), height, nearPlane, farPlane, cs, bRightHanded, bRotate);
21797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
21807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
21817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!***************************************************************************
21827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @brief      	Perspective calculation where field of view is used instead of near plane dimensions
21837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens				and far plane is assumed to be at an infinite distance with inverted Z range
21847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		fovy		Angle of view (vertical)
21857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		aspect		Aspect ratio of view
21867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		nearPlane	Near clipping distance
21877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		cs			Which clipspace convention is being used
21887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRightHanded	Handedness of coordinate system
21897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @param[in]		bRotate		Is the viewport in portrait or landscape mode
21907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @return 		Perspective matrix
21917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
21927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	static PVRTMat4 PerspectiveFovFloatDepth(
21937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE fovy, VERTTYPE aspect,
21947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE nearPlane,
21957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		const eClipspace cs,
21967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRightHanded,
21977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		bool bRotate = false)
21987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	{
21997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		VERTTYPE height = VERTTYPEMUL(VERTTYPEMUL(2,nearPlane), PVRTTAN(VERTTYPEMUL(fovy,0.5)));
22007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		if (bRotate) return PerspectiveFloatDepth(height, VERTTYPEDIV(height,aspect), nearPlane, cs, bRightHanded, bRotate);
22017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens		return PerspectiveFloatDepth(VERTTYPEMUL(height,aspect), height, nearPlane, cs, bRightHanded, bRotate);
22027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens	}
22037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens};
22047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
22057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif /*__PVRTVECTOR_H__*/
22067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
22077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*****************************************************************************
22087b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEnd of file (PVRTVector.h)
22097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/
22107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens
2211