-//Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
-
-//Distributed under the Boost Software License, Version 1.0. (See accompanying
-//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/qvm/operations.hpp>
-#include <boost/qvm/quat.hpp>
-#include <boost/qvm/vec.hpp>
-#include <boost/qvm/mat.hpp>
-
-namespace
-my_stuff
- {
- struct
- mat
- {
- float a[3][3];
- };
-
- struct
- vec
- {
- float a[3];
- };
-
- struct
- quat
- {
- float a[4];
- };
- }
-
-namespace
-boost
- {
- namespace
- qvm
- {
- template <>
- struct
- mat_traits<my_stuff::mat>
- {
- typedef float scalar_type;
- static int const rows=3;
- static int const cols=3;
-
- template <int R,int C>
- static
- scalar_type &
- write_element( my_stuff::mat & m )
- {
- BOOST_QVM_STATIC_ASSERT(R>=0);
- BOOST_QVM_STATIC_ASSERT(R<rows);
- BOOST_QVM_STATIC_ASSERT(C>=0);
- BOOST_QVM_STATIC_ASSERT(C<cols);
- return m.a[R][C];
- }
-
- template <int R,int C>
- static
- scalar_type
- read_element( my_stuff::mat const & m )
- {
- BOOST_QVM_STATIC_ASSERT(R>=0);
- BOOST_QVM_STATIC_ASSERT(R<rows);
- BOOST_QVM_STATIC_ASSERT(C>=0);
- BOOST_QVM_STATIC_ASSERT(C<cols);
- return m.a[R][C];
- }
-
- static
- inline
- scalar_type &
- write_element_idx( int r, int c, my_stuff::mat & m )
- {
- BOOST_QVM_ASSERT(r>=0);
- BOOST_QVM_ASSERT(r<rows);
- BOOST_QVM_ASSERT(c>=0);
- BOOST_QVM_ASSERT(c<cols);
- return m.a[r][c];
- }
-
- static
- inline
- scalar_type
- read_element_idx( int r, int c, my_stuff::mat const & m )
- {
- BOOST_QVM_ASSERT(r>=0);
- BOOST_QVM_ASSERT(r<rows);
- BOOST_QVM_ASSERT(c>=0);
- BOOST_QVM_ASSERT(c<cols);
- return m.a[r][c];
- }
- };
-
- template <>
- struct
- vec_traits<my_stuff::vec>
- {
- static int const dim=3;
- typedef float scalar_type;
-
- template <int I>
- static
- scalar_type &
- write_element( my_stuff::vec & m )
- {
- BOOST_QVM_STATIC_ASSERT(I>=0);
- BOOST_QVM_STATIC_ASSERT(I<dim);
- return m.a[I];
- }
-
- template <int I>
- static
- scalar_type
- read_element( my_stuff::vec const & m )
- {
- BOOST_QVM_STATIC_ASSERT(I>=0);
- BOOST_QVM_STATIC_ASSERT(I<dim);
- return m.a[I];
- }
-
- static
- inline
- scalar_type &
- write_element_idx( int i, my_stuff::vec & m )
- {
- BOOST_QVM_ASSERT(i>=0);
- BOOST_QVM_ASSERT(i<dim);
- return m.a[i];
- }
-
- static
- inline
- scalar_type
- read_element_idx( int i, my_stuff::vec const & m )
- {
- BOOST_QVM_ASSERT(i>=0);
- BOOST_QVM_ASSERT(i<dim);
- return m.a[i];
- }
- };
-
- template <>
- struct
- quat_traits<my_stuff::quat>
- {
- typedef float scalar_type;
-
- template <int I>
- static
- scalar_type &
- write_element( my_stuff::quat & m )
- {
- BOOST_QVM_STATIC_ASSERT(I>=0);
- BOOST_QVM_STATIC_ASSERT(I<4);
- return m.a[I];
- }
-
- template <int I>
- static
- scalar_type
- read_element( my_stuff::quat const & m )
- {
- BOOST_QVM_STATIC_ASSERT(I>=0);
- BOOST_QVM_STATIC_ASSERT(I<4);
- return m.a[I];
- }
- };
- }
- }
-
-namespace
-my_stuff
- {
- mat &
- operator/=( mat & x, float y )
- {
- return boost::qvm::operator/=(x,y);
- }
-
- vec &
- operator/=( vec & x, float y )
- {
- return boost::qvm::operator/=(x,y);
- }
-
- quat &
- operator/=( quat & x, float y )
- {
- return boost::qvm::operator/=(x,y);
- }
-
- mat &
- operator*=( mat & x, float y )
- {
- return boost::qvm::operator*=(x,y);
- }
-
- vec &
- operator*=( vec & x, float y )
- {
- return boost::qvm::operator*=(x,y);
- }
-
- quat &
- operator*=( quat & x, float y )
- {
- return boost::qvm::operator*=(x,y);
- }
-
- mat
- operator/( mat const & x, float y )
- {
- return boost::qvm::operator/(x,y);
- }
-
- vec
- operator/( vec const & x, float y )
- {
- return boost::qvm::operator/(x,y);
- }
-
- quat
- operator/( quat const & x, float y )
- {
- return boost::qvm::operator/(x,y);
- }
-
- mat
- operator*( mat const & x, float y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- vec
- operator*( vec const & x, float y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- quat
- operator*( quat const & x, float y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- mat &
- operator*=( mat & x, mat const & y )
- {
- return boost::qvm::operator*=(x,y);
- }
-
- mat
- operator*=( mat const & x, mat const & y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- vec
- operator*( mat const & x, vec const & y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- vec
- operator*( quat const & x, vec const & y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- vec
- operator*( vec const & x, mat const & y )
- {
- return boost::qvm::operator*(x,y);
- }
-
- bool
- operator==( mat const & x, mat const & y )
- {
- return boost::qvm::operator==(x,y);
- }
-
- bool
- operator!=( mat const & x, mat const & y )
- {
- return boost::qvm::operator!=(x,y);
- }
-
- bool
- operator==( vec const & x, vec const & y )
- {
- return boost::qvm::operator==(x,y);
- }
-
- bool
- operator!=( vec const & x, vec const & y )
- {
- return boost::qvm::operator!=(x,y);
- }
-
- bool
- operator==( quat const & x, quat const & y )
- {
- return boost::qvm::operator==(x,y);
- }
-
- bool
- operator!=( quat const & x, quat const & y )
- {
- return boost::qvm::operator!=(x,y);
- }
- }
-
-int
-main()
- {
- using namespace boost::qvm::sfinae;
- using namespace my_stuff;
- typedef boost::qvm::mat<double,3,3> mat2;
- typedef boost::qvm::vec<double,3> vec2;
- typedef boost::qvm::quat<double> quat2;
-
- mat ma1, mb1; set_zero(ma1); set_zero(mb1);
- vec va1, vb1; set_zero(va1); set_zero(vb1);
- quat qa1, qb1; set_zero(qa1); set_zero(qb1);
- mat2 ma2, mb2; set_zero(ma2); set_zero(mb2);
- vec2 va2, vb2; set_zero(va2); set_zero(vb2);
- quat2 qa2, qb2; set_zero(qa2); set_zero(qb2);
-
- set_zero(ma1);
- set_zero(mb1);
- set_zero(va1);
- set_zero(vb1);
- set_zero(qa1);
- set_zero(qb1);
- set_zero(ma2);
- set_zero(mb2);
- set_zero(va2);
- set_zero(vb2);
- set_zero(qa2);
- set_zero(qb2);
-
- ma1/=2;
- va1/=2;
- qa1/=2;
- ma2/=2;
- va2/=2;
- qa2/=2;
-
- ma1*=2;
- va1*=2;
- qa1*=2;
- ma2*=2;
- va2*=2;
- qa2*=2;
-
- mb1=ma1/2;
- vb1=va1/2;
- qb1=qb1/2;
- mb2=convert_to<mat2>(ma1/2);
- vb2=convert_to<vec2>(va1/2);
- qb2=convert_to<quat2>(qa1/2);
- mb1=scalar_cast<float>(ma2/2);
- vb1=scalar_cast<float>(va2/2);
- qb1=scalar_cast<float>(qa2/2);
-
- mb1=ma1*2;
- vb1=va1*2;
- qb1=qa1*2;
- mb2=convert_to<mat2>(ma1*2);
- vb2=convert_to<vec2>(va1*2);
- qb2=convert_to<quat2>(qa1*2);
- mb1=scalar_cast<float>(ma2*2);
- vb1=scalar_cast<float>(va2*2);
- qb1=scalar_cast<float>(qa2*2);
-
- ma1*=mb1;
- ma1*=scalar_cast<float>(ma2);
- ma2*=ma1;
-
- va1=ma1*va1;
- va1=qa1*va1;
- va1=scalar_cast<float>(ma2*va1);
- va1=scalar_cast<float>(ma1*va2);
- va1=scalar_cast<float>(ma2*va2);
- va1=scalar_cast<float>(qa2*va1);
- va1=scalar_cast<float>(qa1*va2);
- va1=scalar_cast<float>(qa2*va2);
-
- va2=convert_to<vec2>(ma1*va1);
- va2=convert_to<vec2>(qa1*va1);
- va2=ma2*va1;
- va2=ma1*va2;
- va2=ma2*va2;
- va2=qa2*va1;
- va2=qa1*va2;
- va2=qa2*va2;
-
- va1=va1*ma1;
- va1=scalar_cast<float>(va1*ma2);
- va1=scalar_cast<float>(va2*ma1);
- va1=scalar_cast<float>(va2*ma2);
-
- va2=convert_to<vec2>(va1*ma1);
- va2=va1*ma2;
- va2=va2*ma1;
- va2=va2*ma2;
-
- (void) (ma1==mb1);
- (void) (ma1==ma2);
- (void) (ma2==ma1);
-
- (void) (ma1!=mb1);
- (void) (ma1!=ma2);
- (void) (ma2!=ma1);
-
- (void) (va1==vb1);
- (void) (va1==va2);
- (void) (va2==va1);
-
- (void) (va1!=vb1);
- (void) (va1!=va2);
- (void) (va2!=va1);
-
- (void) (qa1==qb1);
- (void) (qa1==qa2);
- (void) (qa2==qa1);
-
- (void) (qa1!=qb1);
- (void) (qa1!=qa2);
- (void) (qa2!=qa1);
-
- return 0;
- }
+//Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.\r
+\r
+//Distributed under the Boost Software License, Version 1.0. (See accompanying\r
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
+\r
+#include <boost/qvm/operations.hpp>\r
+#include <boost/qvm/quat.hpp>\r
+#include <boost/qvm/vec.hpp>\r
+#include <boost/qvm/mat.hpp>\r
+\r
+namespace\r
+my_stuff\r
+ {\r
+ struct\r
+ mat\r
+ {\r
+ float a[3][3];\r
+ };\r
+\r
+ struct\r
+ vec\r
+ {\r
+ float a[3];\r
+ };\r
+\r
+ struct\r
+ quat\r
+ {\r
+ float a[4];\r
+ };\r
+ }\r
+\r
+namespace\r
+boost\r
+ {\r
+ namespace\r
+ qvm\r
+ {\r
+ template <>\r
+ struct\r
+ mat_traits<my_stuff::mat>\r
+ {\r
+ typedef float scalar_type;\r
+ static int const rows=3;\r
+ static int const cols=3;\r
+\r
+ template <int R,int C>\r
+ static\r
+ scalar_type &\r
+ write_element( my_stuff::mat & m )\r
+ {\r
+ BOOST_QVM_STATIC_ASSERT(R>=0);\r
+ BOOST_QVM_STATIC_ASSERT(R<rows);\r
+ BOOST_QVM_STATIC_ASSERT(C>=0);\r
+ BOOST_QVM_STATIC_ASSERT(C<cols);\r
+ return m.a[R][C];\r
+ }\r
+\r
+ template <int R,int C>\r
+ static\r
+ scalar_type\r
+ read_element( my_stuff::mat const & m )\r
+ {\r
+ BOOST_QVM_STATIC_ASSERT(R>=0);\r
+ BOOST_QVM_STATIC_ASSERT(R<rows);\r
+ BOOST_QVM_STATIC_ASSERT(C>=0);\r
+ BOOST_QVM_STATIC_ASSERT(C<cols);\r
+ return m.a[R][C];\r
+ }\r
+\r
+ static\r
+ inline\r
+ scalar_type &\r
+ write_element_idx( int r, int c, my_stuff::mat & m )\r
+ {\r
+ BOOST_QVM_ASSERT(r>=0);\r
+ BOOST_QVM_ASSERT(r<rows);\r
+ BOOST_QVM_ASSERT(c>=0);\r
+ BOOST_QVM_ASSERT(c<cols);\r
+ return m.a[r][c];\r
+ }\r
+\r
+ static\r
+ inline\r
+ scalar_type\r
+ read_element_idx( int r, int c, my_stuff::mat const & m )\r
+ {\r
+ BOOST_QVM_ASSERT(r>=0);\r
+ BOOST_QVM_ASSERT(r<rows);\r
+ BOOST_QVM_ASSERT(c>=0);\r
+ BOOST_QVM_ASSERT(c<cols);\r
+ return m.a[r][c];\r
+ }\r
+ };\r
+\r
+ template <>\r
+ struct\r
+ vec_traits<my_stuff::vec>\r
+ {\r
+ static int const dim=3;\r
+ typedef float scalar_type;\r
+\r
+ template <int I>\r
+ static\r
+ scalar_type &\r
+ write_element( my_stuff::vec & m )\r
+ {\r
+ BOOST_QVM_STATIC_ASSERT(I>=0);\r
+ BOOST_QVM_STATIC_ASSERT(I<dim);\r
+ return m.a[I];\r
+ }\r
+\r
+ template <int I>\r
+ static\r
+ scalar_type\r
+ read_element( my_stuff::vec const & m )\r
+ {\r
+ BOOST_QVM_STATIC_ASSERT(I>=0);\r
+ BOOST_QVM_STATIC_ASSERT(I<dim);\r
+ return m.a[I];\r
+ }\r
+\r
+ static\r
+ inline\r
+ scalar_type &\r
+ write_element_idx( int i, my_stuff::vec & m )\r
+ {\r
+ BOOST_QVM_ASSERT(i>=0);\r
+ BOOST_QVM_ASSERT(i<dim);\r
+ return m.a[i];\r
+ }\r
+\r
+ static\r
+ inline\r
+ scalar_type\r
+ read_element_idx( int i, my_stuff::vec const & m )\r
+ {\r
+ BOOST_QVM_ASSERT(i>=0);\r
+ BOOST_QVM_ASSERT(i<dim);\r
+ return m.a[i];\r
+ }\r
+ };\r
+\r
+ template <>\r
+ struct\r
+ quat_traits<my_stuff::quat>\r
+ {\r
+ typedef float scalar_type;\r
+\r
+ template <int I>\r
+ static\r
+ scalar_type &\r
+ write_element( my_stuff::quat & m )\r
+ {\r
+ BOOST_QVM_STATIC_ASSERT(I>=0);\r
+ BOOST_QVM_STATIC_ASSERT(I<4);\r
+ return m.a[I];\r
+ }\r
+\r
+ template <int I>\r
+ static\r
+ scalar_type\r
+ read_element( my_stuff::quat const & m )\r
+ {\r
+ BOOST_QVM_STATIC_ASSERT(I>=0);\r
+ BOOST_QVM_STATIC_ASSERT(I<4);\r
+ return m.a[I];\r
+ }\r
+ };\r
+ }\r
+ }\r
+\r
+namespace\r
+my_stuff\r
+ {\r
+ mat &\r
+ operator/=( mat & x, float y )\r
+ {\r
+ return boost::qvm::operator/=(x,y);\r
+ }\r
+\r
+ vec &\r
+ operator/=( vec & x, float y )\r
+ {\r
+ return boost::qvm::operator/=(x,y);\r
+ }\r
+\r
+ quat &\r
+ operator/=( quat & x, float y )\r
+ {\r
+ return boost::qvm::operator/=(x,y);\r
+ }\r
+\r
+ mat &\r
+ operator*=( mat & x, float y )\r
+ {\r
+ return boost::qvm::operator*=(x,y);\r
+ }\r
+\r
+ vec &\r
+ operator*=( vec & x, float y )\r
+ {\r
+ return boost::qvm::operator*=(x,y);\r
+ }\r
+\r
+ quat &\r
+ operator*=( quat & x, float y )\r
+ {\r
+ return boost::qvm::operator*=(x,y);\r
+ }\r
+\r
+ mat\r
+ operator/( mat const & x, float y )\r
+ {\r
+ return boost::qvm::operator/(x,y);\r
+ }\r
+\r
+ vec\r
+ operator/( vec const & x, float y )\r
+ {\r
+ return boost::qvm::operator/(x,y);\r
+ }\r
+\r
+ quat\r
+ operator/( quat const & x, float y )\r
+ {\r
+ return boost::qvm::operator/(x,y);\r
+ }\r
+\r
+ mat\r
+ operator*( mat const & x, float y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ vec\r
+ operator*( vec const & x, float y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ quat\r
+ operator*( quat const & x, float y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ mat &\r
+ operator*=( mat & x, mat const & y )\r
+ {\r
+ return boost::qvm::operator*=(x,y);\r
+ }\r
+\r
+ mat\r
+ operator*=( mat const & x, mat const & y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ vec\r
+ operator*( mat const & x, vec const & y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ vec\r
+ operator*( quat const & x, vec const & y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ vec\r
+ operator*( vec const & x, mat const & y )\r
+ {\r
+ return boost::qvm::operator*(x,y);\r
+ }\r
+\r
+ bool\r
+ operator==( mat const & x, mat const & y )\r
+ {\r
+ return boost::qvm::operator==(x,y);\r
+ }\r
+\r
+ bool\r
+ operator!=( mat const & x, mat const & y )\r
+ {\r
+ return boost::qvm::operator!=(x,y);\r
+ }\r
+\r
+ bool\r
+ operator==( vec const & x, vec const & y )\r
+ {\r
+ return boost::qvm::operator==(x,y);\r
+ }\r
+\r
+ bool\r
+ operator!=( vec const & x, vec const & y )\r
+ {\r
+ return boost::qvm::operator!=(x,y);\r
+ }\r
+\r
+ bool\r
+ operator==( quat const & x, quat const & y )\r
+ {\r
+ return boost::qvm::operator==(x,y);\r
+ }\r
+\r
+ bool\r
+ operator!=( quat const & x, quat const & y )\r
+ {\r
+ return boost::qvm::operator!=(x,y);\r
+ }\r
+ }\r
+\r
+int\r
+main()\r
+ {\r
+ using namespace boost::qvm::sfinae;\r
+ using namespace my_stuff;\r
+ typedef boost::qvm::mat<double,3,3> mat2;\r
+ typedef boost::qvm::vec<double,3> vec2;\r
+ typedef boost::qvm::quat<double> quat2;\r
+\r
+ mat ma1, mb1; set_zero(ma1); set_zero(mb1);\r
+ vec va1, vb1; set_zero(va1); set_zero(vb1);\r
+ quat qa1, qb1; set_zero(qa1); set_zero(qb1);\r
+ mat2 ma2, mb2; set_zero(ma2); set_zero(mb2);\r
+ vec2 va2, vb2; set_zero(va2); set_zero(vb2);\r
+ quat2 qa2, qb2; set_zero(qa2); set_zero(qb2);\r
+\r
+ set_zero(ma1);\r
+ set_zero(mb1);\r
+ set_zero(va1);\r
+ set_zero(vb1);\r
+ set_zero(qa1);\r
+ set_zero(qb1);\r
+ set_zero(ma2);\r
+ set_zero(mb2);\r
+ set_zero(va2);\r
+ set_zero(vb2);\r
+ set_zero(qa2);\r
+ set_zero(qb2);\r
+\r
+ ma1/=2;\r
+ va1/=2;\r
+ qa1/=2;\r
+ ma2/=2;\r
+ va2/=2;\r
+ qa2/=2;\r
+\r
+ ma1*=2;\r
+ va1*=2;\r
+ qa1*=2;\r
+ ma2*=2;\r
+ va2*=2;\r
+ qa2*=2;\r
+\r
+ mb1=ma1/2;\r
+ vb1=va1/2;\r
+ qb1=qb1/2;\r
+ mb2=convert_to<mat2>(ma1/2);\r
+ vb2=convert_to<vec2>(va1/2);\r
+ qb2=convert_to<quat2>(qa1/2);\r
+ mb1=scalar_cast<float>(ma2/2);\r
+ vb1=scalar_cast<float>(va2/2);\r
+ qb1=scalar_cast<float>(qa2/2);\r
+\r
+ mb1=ma1*2;\r
+ vb1=va1*2;\r
+ qb1=qa1*2;\r
+ mb2=convert_to<mat2>(ma1*2);\r
+ vb2=convert_to<vec2>(va1*2);\r
+ qb2=convert_to<quat2>(qa1*2);\r
+ mb1=scalar_cast<float>(ma2*2);\r
+ vb1=scalar_cast<float>(va2*2);\r
+ qb1=scalar_cast<float>(qa2*2);\r
+\r
+ ma1*=mb1;\r
+ ma1*=scalar_cast<float>(ma2);\r
+ ma2*=ma1;\r
+\r
+ va1=ma1*va1;\r
+ va1=qa1*va1;\r
+ va1=scalar_cast<float>(ma2*va1);\r
+ va1=scalar_cast<float>(ma1*va2);\r
+ va1=scalar_cast<float>(ma2*va2);\r
+ va1=scalar_cast<float>(qa2*va1);\r
+ va1=scalar_cast<float>(qa1*va2);\r
+ va1=scalar_cast<float>(qa2*va2);\r
+\r
+ va2=convert_to<vec2>(ma1*va1);\r
+ va2=convert_to<vec2>(qa1*va1);\r
+ va2=ma2*va1;\r
+ va2=ma1*va2;\r
+ va2=ma2*va2;\r
+ va2=qa2*va1;\r
+ va2=qa1*va2;\r
+ va2=qa2*va2;\r
+\r
+ va1=va1*ma1;\r
+ va1=scalar_cast<float>(va1*ma2);\r
+ va1=scalar_cast<float>(va2*ma1);\r
+ va1=scalar_cast<float>(va2*ma2);\r
+\r
+ va2=convert_to<vec2>(va1*ma1);\r
+ va2=va1*ma2;\r
+ va2=va2*ma1;\r
+ va2=va2*ma2;\r
+\r
+ (void) (ma1==mb1);\r
+ (void) (ma1==ma2);\r
+ (void) (ma2==ma1);\r
+\r
+ (void) (ma1!=mb1);\r
+ (void) (ma1!=ma2);\r
+ (void) (ma2!=ma1);\r
+\r
+ (void) (va1==vb1);\r
+ (void) (va1==va2);\r
+ (void) (va2==va1);\r
+\r
+ (void) (va1!=vb1);\r
+ (void) (va1!=va2);\r
+ (void) (va2!=va1);\r
+\r
+ (void) (qa1==qb1);\r
+ (void) (qa1==qa2);\r
+ (void) (qa2==qa1);\r
+\r
+ (void) (qa1!=qb1);\r
+ (void) (qa1!=qa2);\r
+ (void) (qa2!=qa1);\r
+\r
+ return 0;\r
+ }\r