1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef UUID_907229FCB3A711DE83C152F855D89593
7 #define UUID_907229FCB3A711DE83C152F855D89593
65 atan2( float a, float b )
72 atan2( double a, double b )
79 determinant( T * * a, int n )
88 det = a[0][0] * a[1][1] - a[1][0] * a[0][1];
92 for( j1=0; j1<n; j1++ )
94 m = static_cast<T * *>(malloc((n-1)*sizeof(T *)));
95 for( i=0; i<n-1; i++ )
96 m[i] = static_cast<T *>(malloc((n-1)*sizeof(T)));
104 m[i-1][j2] = a[i][j];
108 det += T(pow(-1.0,1.0+j1+1.0)) * a[0][j1] * determinant(m,n-1);
109 for( i=0; i<n-1; i++ )
117 template <class T,int N>
119 cofactor( T * * a, T (&b)[N][N] )
124 c = static_cast<T * *>(malloc((N-1)*sizeof(T *)));
125 for( i=0; i<N-1; i++ )
126 c[i] = static_cast<T *>(malloc((N-1)*sizeof(T)));
132 for( ii=0; ii<N; ii++ )
137 for( jj=0; jj<N; jj++ )
141 c[i1][j1] = a[ii][jj];
146 det = determinant(c,N-1);
147 b[i][j] = T(pow(-1.0,i+j+2.0)) * det;
150 for( i=0; i<N-1; i++ )
156 template <class T,int D>
158 determinant( T (&in)[D][D] )
160 T * * m = static_cast<T * *>(malloc(D*sizeof(T *)));
161 for( int i=0; i!=D; ++i )
163 m[i] = static_cast<T *>(malloc(D*sizeof(T)));
164 for( int j=0; j!=D; ++j )
167 T det=::test_qvm::detail::determinant(m,D);
168 for( int i=0; i<D; ++i )
174 template <class T,int D>
176 inverse( T (&out)[D][D], T (&in)[D][D] )
178 T * * m = static_cast<T * *>(malloc(D*sizeof(T *)));
179 for( int i=0; i!=D; ++i )
181 m[i] = static_cast<T *>(malloc(D*sizeof(T)));
182 for( int j=0; j!=D; ++j )
185 T det=::test_qvm::detail::determinant(m,D);
189 ::test_qvm::detail::cofactor(m,b);
190 for( int i=0; i<D; ++i )
193 for( int i=0; i!=D; ++i )
194 for( int j=0; j!=D; ++j )
198 template <class T,int M,int N>
200 init_m( T (&r)[M][N], T start=T(0), T step=T(0) )
202 for( int i=0; i<M; ++i )
203 for( int j=0; j<N; ++j,start+=step )
207 template <class T,int D>
209 init_v( T (&r)[D], T start=T(0), T step=T(0) )
211 for( int i=0; i<D; ++i,start+=step )
215 template <class T,int M,int N>
217 zero_mat( T (&r)[M][N] )
219 for( int i=0; i<M; ++i )
220 for( int j=0; j<N; ++j )
224 template <class T,int D>
226 zero_vec( T (&r)[D] )
228 for( int i=0; i<D; ++i )
232 template <class T,int D>
234 identity( T (&r)[D][D] )
236 for( int i=0; i<D; ++i )
237 for( int j=0; j<D; ++j )
238 r[i][j] = (i==j) ? T(1) : T(0);
241 template <class T,class U,class V,int M,int N>
243 add_m( T (&r)[M][N], U (&a)[M][N], V (&b)[M][N] )
245 for( int i=0; i<M; ++i )
246 for( int j=0; j<N; ++j )
247 r[i][j] = a[i][j] + b[i][j];
250 template <class T,class U,class V,int D>
252 add_v( T (&r)[D], U (&a)[D], V (&b)[D] )
254 for( int i=0; i<D; ++i )
258 template <class T,class U,class V,int M,int N>
260 subtract_m( T (&r)[M][N], U (&a)[M][N], V (&b)[M][N] )
262 for( int i=0; i<M; ++i )
263 for( int j=0; j<N; ++j )
264 r[i][j] = a[i][j] - b[i][j];
267 template <class T,class U,class V,int D>
269 subtract_v( T (&r)[D], U (&a)[D], V (&b)[D] )
271 for( int i=0; i<D; ++i )
275 template <class T,int D,class U>
277 rotation_x( T (&r)[D][D], U angle )
280 T c=::test_qvm::detail::cos(angle);
281 T s=::test_qvm::detail::sin(angle);
288 template <class T,int D,class U>
290 rotation_y( T (&r)[D][D], U angle )
293 T c=::test_qvm::detail::cos(angle);
294 T s=::test_qvm::detail::sin(angle);
301 template <class T,int D,class U>
303 rotation_z( T (&r)[D][D], U angle )
306 T c=::test_qvm::detail::cos(angle);
307 T s=::test_qvm::detail::sin(angle);
314 template <class T,int D>
316 translation( T (&r)[D][D], T (&t)[D-1] )
319 for( int i=0; i!=D-1; ++i )
323 template <class R,class T,class U,int M,int N,int P>
325 multiply_m( R (&r)[M][P], T (&a)[M][N], U (&b)[N][P] )
327 for( int i=0; i<M; ++i )
328 for( int j=0; j<P; ++j )
331 for( int k=0; k<N; ++k )
332 x += R(a[i][k])*R(b[k][j]);
337 template <class R,class T,class U,int M,int N>
339 multiply_mv( R (&r)[M], T (&a)[M][N], U (&b)[N] )
341 for( int i=0; i<M; ++i )
344 for( int k=0; k<N; ++k )
345 x += R(a[i][k])*R(b[k]);
350 template <class R,class T,class U,int N,int P>
352 multiply_vm( R (&r)[P], T (&a)[N], U (&b)[N][P] )
354 for( int j=0; j<P; ++j )
357 for( int k=0; k<N; ++k )
358 x += R(a[k])*R(b[k][j]);
363 template <class T,class U,int M,int N,class S>
365 scalar_multiply_m( T (&r)[M][N], U (&a)[M][N], S scalar )
367 for( int i=0; i<M; ++i )
368 for( int j=0; j<N; ++j )
369 r[i][j] = a[i][j]*scalar;
372 template <class T,class U,int D,class S>
374 scalar_multiply_v( T (&r)[D], U (&a)[D], S scalar )
376 for( int i=0; i<D; ++i )
380 template <class T,int M,int N>
382 transpose( T (&r)[M][N], T (&a)[N][M] )
384 for( int i=0; i<M; ++i )
385 for( int j=0; j<N; ++j )
389 template <class R,class T,class U,int D>
391 dot( T (&a)[D], U (&b)[D] )
394 for( int i=0; i<D; ++i )
399 template <class T,int M,int N>
401 norm_squared( T (&m)[M][N] )
404 for( int i=0; i<M; ++i )
405 for( int j=0; j<N; ++j )
416 matrix_perspective_lh( T (&r)[4][4], T fov_y, T aspect_ratio, T zn, T zf )
418 T ys=T(1)/::tanf(fov_y/T(2));
419 T xs=ys/aspect_ratio;
423 r[2][2] = zf/(zf-zn);
424 r[2][3] = -zn*zf/(zf-zn);
431 matrix_perspective_rh( T (&r)[4][4], T fov_y, T aspect_ratio, T zn, T zf )
433 matrix_perspective_lh(r,fov_y,aspect_ratio,zn,zf);