diff options
Diffstat (limited to 'debug_tools/WatchYourStep/ptxjitplus/inc/nvMatrix.h')
| -rw-r--r-- | debug_tools/WatchYourStep/ptxjitplus/inc/nvMatrix.h | 524 |
1 files changed, 524 insertions, 0 deletions
diff --git a/debug_tools/WatchYourStep/ptxjitplus/inc/nvMatrix.h b/debug_tools/WatchYourStep/ptxjitplus/inc/nvMatrix.h new file mode 100644 index 0000000..31ad6ec --- /dev/null +++ b/debug_tools/WatchYourStep/ptxjitplus/inc/nvMatrix.h @@ -0,0 +1,524 @@ +/* + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +// +// Template math library for common 3D functionality +// +// nvMatrix.h - template matrix code +// +// This code is in part deriver from glh, a cross platform glut helper library. +// The copyright for glh follows this notice. +// +// Copyright (c) NVIDIA Corporation. All rights reserved. +//////////////////////////////////////////////////////////////////////////////// + +/* + Copyright (c) 2000 Cass Everitt + Copyright (c) 2000 NVIDIA Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, are permitted provided that the following + conditions are met: + + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + + * The names of contributors to this software may not be used + to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + + Cass Everitt - [email protected] +*/ + +#ifndef NV_MATRIX_H +#define NV_MATRIX_H + +namespace nv +{ + + template <class T> class vec2; + template <class T> class vec3; + template <class T> class vec4; + + //////////////////////////////////////////////////////////////////////////////// + // + // Matrix + // + //////////////////////////////////////////////////////////////////////////////// + template<class T> + class matrix4 + { + + public: + + matrix4() + { + make_identity(); + } + + matrix4(T t) + { + set_value(t); + } + + matrix4(const T *m) + { + set_value(m); + } + + matrix4(T a00, T a01, T a02, T a03, + T a10, T a11, T a12, T a13, + T a20, T a21, T a22, T a23, + T a30, T a31, T a32, T a33) : + _11(a00), _12(a01), _13(a02), _14(a03), + _21(a10), _22(a11), _23(a12), _24(a13), + _31(a20), _32(a21), _33(a22), _34(a23), + _41(a30), _42(a31), _43(a32), _44(a33) + {} + + + void get_value(T *mp) const + { + int c = 0; + + for (int j=0; j < 4; j++) + for (int i=0; i < 4; i++) + { + mp[c++] = element(i,j); + } + } + + const T *get_value() const + { + return _array; + } + + void set_value(T *mp) + { + int c = 0; + + for (int j=0; j < 4; j++) + for (int i=0; i < 4; i++) + { + element(i,j) = mp[c++]; + } + } + + void set_value(T r) + { + for (int i=0; i < 4; i++) + for (int j=0; j < 4; j++) + { + element(i,j) = r; + } + } + + void make_identity() + { + element(0,0) = 1.0; + element(0,1) = 0.0; + element(0,2) = 0.0; + element(0,3) = 0.0; + + element(1,0) = 0.0; + element(1,1) = 1.0; + element(1,2) = 0.0; + element(1,3) = 0.0; + + element(2,0) = 0.0; + element(2,1) = 0.0; + element(2,2) = 1.0; + element(2,3) = 0.0; + + element(3,0) = 0.0; + element(3,1) = 0.0; + element(3,2) = 0.0; + element(3,3) = 1.0; + } + + // set a uniform scale + void set_scale(T s) + { + element(0,0) = s; + element(1,1) = s; + element(2,2) = s; + } + + void set_scale(const vec3<T> &s) + { + for (int i = 0; i < 3; i++) + { + element(i,i) = s[i]; + } + } + + + void set_translate(const vec3<T> &t) + { + for (int i = 0; i < 3; i++) + { + element(i,3) = t[i]; + } + } + + void set_row(int r, const vec4<T> &t) + { + for (int i = 0; i < 4; i++) + { + element(r,i) = t[i]; + } + } + + void set_column(int c, const vec4<T> &t) + { + for (int i = 0; i < 4; i++) + { + element(i,c) = t[i]; + } + } + + vec4<T> get_row(int r) const + { + vec4<T> v; + + for (int i = 0; i < 4; i++) + { + v[i] = element(r,i); + } + + return v; + } + + vec4<T> get_column(int c) const + { + vec4<T> v; + + for (int i = 0; i < 4; i++) + { + v[i] = element(i,c); + } + + return v; + } + + friend matrix4 inverse(const matrix4 &m) + { + matrix4 minv; + + T r1[8], r2[8], r3[8], r4[8]; + T *s[4], *tmprow; + + s[0] = &r1[0]; + s[1] = &r2[0]; + s[2] = &r3[0]; + s[3] = &r4[0]; + + register int i,j,p,jj; + + for (i=0; i<4; i++) + { + for (j=0; j<4; j++) + { + s[i][j] = m.element(i,j); + + if (i==j) + { + s[i][j+4] = 1.0; + } + else + { + s[i][j+4] = 0.0; + } + } + } + + T scp[4]; + + for (i=0; i<4; i++) + { + scp[i] = T(fabs(s[i][0])); + + for (j=1; j<4; j++) + if (T(fabs(s[i][j])) > scp[i]) + { + scp[i] = T(fabs(s[i][j])); + } + + if (scp[i] == 0.0) + { + return minv; // singular matrix! + } + } + + int pivot_to; + T scp_max; + + for (i=0; i<4; i++) + { + // select pivot row + pivot_to = i; + scp_max = T(fabs(s[i][i]/scp[i])); + + // find out which row should be on top + for (p=i+1; p<4; p++) + if (T(fabs(s[p][i]/scp[p])) > scp_max) + { + scp_max = T(fabs(s[p][i]/scp[p])); + pivot_to = p; + } + + // Pivot if necessary + if (pivot_to != i) + { + tmprow = s[i]; + s[i] = s[pivot_to]; + s[pivot_to] = tmprow; + T tmpscp; + tmpscp = scp[i]; + scp[i] = scp[pivot_to]; + scp[pivot_to] = tmpscp; + } + + T mji; + + // perform gaussian elimination + for (j=i+1; j<4; j++) + { + mji = s[j][i]/s[i][i]; + s[j][i] = 0.0; + + for (jj=i+1; jj<8; jj++) + { + s[j][jj] -= mji*s[i][jj]; + } + } + } + + if (s[3][3] == 0.0) + { + return minv; // singular matrix! + } + + // + // Now we have an upper triangular matrix. + // + // x x x x | y y y y + // 0 x x x | y y y y + // 0 0 x x | y y y y + // 0 0 0 x | y y y y + // + // we'll back substitute to get the inverse + // + // 1 0 0 0 | z z z z + // 0 1 0 0 | z z z z + // 0 0 1 0 | z z z z + // 0 0 0 1 | z z z z + // + + T mij; + + for (i=3; i>0; i--) + { + for (j=i-1; j > -1; j--) + { + mij = s[j][i]/s[i][i]; + + for (jj=j+1; jj<8; jj++) + { + s[j][jj] -= mij*s[i][jj]; + } + } + } + + for (i=0; i<4; i++) + for (j=0; j<4; j++) + { + minv(i,j) = s[i][j+4] / s[i][i]; + } + + return minv; + } + + + friend matrix4 transpose(const matrix4 &m) + { + matrix4 mtrans; + + for (int i=0; i<4; i++) + for (int j=0; j<4; j++) + { + mtrans(i,j) = m.element(j,i); + } + + return mtrans; + } + + matrix4 &operator *= (const matrix4 &rhs) + { + matrix4 mt(*this); + set_value(T(0)); + + for (int i=0; i < 4; i++) + for (int j=0; j < 4; j++) + for (int c=0; c < 4; c++) + { + element(i,j) += mt(i,c) * rhs(c,j); + } + + return *this; + } + + friend matrix4 operator * (const matrix4 &lhs, const matrix4 &rhs) + { + matrix4 r(T(0)); + + for (int i=0; i < 4; i++) + for (int j=0; j < 4; j++) + for (int c=0; c < 4; c++) + { + r.element(i,j) += lhs(i,c) * rhs(c,j); + } + + return r; + } + + // dst = M * src + vec4<T> operator *(const vec4<T> &src) const + { + vec4<T> r; + + for (int i = 0; i < 4; i++) + r[i] = (src[0] * element(i,0) + src[1] * element(i,1) + + src[2] * element(i,2) + src[3] * element(i,3)); + + return r; + } + + // dst = src * M + friend vec4<T> operator *(const vec4<T> &lhs, const matrix4 &rhs) + { + vec4<T> r; + + for (int i = 0; i < 4; i++) + r[i] = (lhs[0] * rhs.element(0,i) + lhs[1] * rhs.element(1,i) + + lhs[2] * rhs.element(2,i) + lhs[3] * rhs.element(3,i)); + + return r; + } + + T &operator()(int row, int col) + { + return element(row,col); + } + + const T &operator()(int row, int col) const + { + return element(row,col); + } + + T &element(int row, int col) + { + return _array[row | (col<<2)]; + } + + const T &element(int row, int col) const + { + return _array[row | (col<<2)]; + } + + matrix4 &operator *= (const T &r) + { + for (int i = 0; i < 4; ++i) + { + element(0,i) *= r; + element(1,i) *= r; + element(2,i) *= r; + element(3,i) *= r; + } + + return *this; + } + + matrix4 &operator += (const matrix4 &mat) + { + for (int i = 0; i < 4; ++i) + { + element(0,i) += mat.element(0,i); + element(1,i) += mat.element(1,i); + element(2,i) += mat.element(2,i); + element(3,i) += mat.element(3,i); + } + + return *this; + } + + + friend bool operator == (const matrix4 &lhs, const matrix4 &rhs) + { + bool r = true; + + for (int i = 0; i < 16; i++) + { + r &= lhs._array[i] == rhs._array[i]; + } + + return r; + } + + friend bool operator != (const matrix4 &lhs, const matrix4 &rhs) + { + bool r = true; + + for (int i = 0; i < 16; i++) + { + r &= lhs._array[i] != rhs._array[i]; + } + + return r; + } + + union + { + struct + { + T _11, _12, _13, _14; // standard names for components + T _21, _22, _23, _24; // standard names for components + T _31, _32, _33, _34; // standard names for components + T _41, _42, _43, _44; // standard names for components + }; + T _array[16]; // array access + }; + }; + +}; + +#endif |
