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