interop_test.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
  2. //Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #include <boost/qvm/operations.hpp>
  5. #include <boost/qvm/quat.hpp>
  6. #include <boost/qvm/vec.hpp>
  7. #include <boost/qvm/mat.hpp>
  8. namespace
  9. my_stuff
  10. {
  11. struct
  12. mat
  13. {
  14. float a[3][3];
  15. };
  16. struct
  17. vec
  18. {
  19. float a[3];
  20. };
  21. struct
  22. quat
  23. {
  24. float a[4];
  25. };
  26. }
  27. namespace
  28. boost
  29. {
  30. namespace
  31. qvm
  32. {
  33. template <>
  34. struct
  35. mat_traits<my_stuff::mat>
  36. {
  37. typedef float scalar_type;
  38. static int const rows=3;
  39. static int const cols=3;
  40. template <int R,int C>
  41. static
  42. scalar_type &
  43. write_element( my_stuff::mat & m )
  44. {
  45. BOOST_QVM_STATIC_ASSERT(R>=0);
  46. BOOST_QVM_STATIC_ASSERT(R<rows);
  47. BOOST_QVM_STATIC_ASSERT(C>=0);
  48. BOOST_QVM_STATIC_ASSERT(C<cols);
  49. return m.a[R][C];
  50. }
  51. template <int R,int C>
  52. static
  53. scalar_type
  54. read_element( my_stuff::mat const & m )
  55. {
  56. BOOST_QVM_STATIC_ASSERT(R>=0);
  57. BOOST_QVM_STATIC_ASSERT(R<rows);
  58. BOOST_QVM_STATIC_ASSERT(C>=0);
  59. BOOST_QVM_STATIC_ASSERT(C<cols);
  60. return m.a[R][C];
  61. }
  62. static
  63. inline
  64. scalar_type &
  65. write_element_idx( int r, int c, my_stuff::mat & m )
  66. {
  67. BOOST_QVM_ASSERT(r>=0);
  68. BOOST_QVM_ASSERT(r<rows);
  69. BOOST_QVM_ASSERT(c>=0);
  70. BOOST_QVM_ASSERT(c<cols);
  71. return m.a[r][c];
  72. }
  73. static
  74. inline
  75. scalar_type
  76. read_element_idx( int r, int c, my_stuff::mat const & m )
  77. {
  78. BOOST_QVM_ASSERT(r>=0);
  79. BOOST_QVM_ASSERT(r<rows);
  80. BOOST_QVM_ASSERT(c>=0);
  81. BOOST_QVM_ASSERT(c<cols);
  82. return m.a[r][c];
  83. }
  84. };
  85. template <>
  86. struct
  87. vec_traits<my_stuff::vec>
  88. {
  89. static int const dim=3;
  90. typedef float scalar_type;
  91. template <int I>
  92. static
  93. scalar_type &
  94. write_element( my_stuff::vec & m )
  95. {
  96. BOOST_QVM_STATIC_ASSERT(I>=0);
  97. BOOST_QVM_STATIC_ASSERT(I<dim);
  98. return m.a[I];
  99. }
  100. template <int I>
  101. static
  102. scalar_type
  103. read_element( my_stuff::vec const & m )
  104. {
  105. BOOST_QVM_STATIC_ASSERT(I>=0);
  106. BOOST_QVM_STATIC_ASSERT(I<dim);
  107. return m.a[I];
  108. }
  109. static
  110. inline
  111. scalar_type &
  112. write_element_idx( int i, my_stuff::vec & m )
  113. {
  114. BOOST_QVM_ASSERT(i>=0);
  115. BOOST_QVM_ASSERT(i<dim);
  116. return m.a[i];
  117. }
  118. static
  119. inline
  120. scalar_type
  121. read_element_idx( int i, my_stuff::vec const & m )
  122. {
  123. BOOST_QVM_ASSERT(i>=0);
  124. BOOST_QVM_ASSERT(i<dim);
  125. return m.a[i];
  126. }
  127. };
  128. template <>
  129. struct
  130. quat_traits<my_stuff::quat>
  131. {
  132. typedef float scalar_type;
  133. template <int I>
  134. static
  135. scalar_type &
  136. write_element( my_stuff::quat & m )
  137. {
  138. BOOST_QVM_STATIC_ASSERT(I>=0);
  139. BOOST_QVM_STATIC_ASSERT(I<4);
  140. return m.a[I];
  141. }
  142. template <int I>
  143. static
  144. scalar_type
  145. read_element( my_stuff::quat const & m )
  146. {
  147. BOOST_QVM_STATIC_ASSERT(I>=0);
  148. BOOST_QVM_STATIC_ASSERT(I<4);
  149. return m.a[I];
  150. }
  151. };
  152. }
  153. }
  154. namespace
  155. my_stuff
  156. {
  157. mat &
  158. operator/=( mat & x, float y )
  159. {
  160. return boost::qvm::operator/=(x,y);
  161. }
  162. vec &
  163. operator/=( vec & x, float y )
  164. {
  165. return boost::qvm::operator/=(x,y);
  166. }
  167. quat &
  168. operator/=( quat & x, float y )
  169. {
  170. return boost::qvm::operator/=(x,y);
  171. }
  172. mat &
  173. operator*=( mat & x, float y )
  174. {
  175. return boost::qvm::operator*=(x,y);
  176. }
  177. vec &
  178. operator*=( vec & x, float y )
  179. {
  180. return boost::qvm::operator*=(x,y);
  181. }
  182. quat &
  183. operator*=( quat & x, float y )
  184. {
  185. return boost::qvm::operator*=(x,y);
  186. }
  187. mat
  188. operator/( mat const & x, float y )
  189. {
  190. return boost::qvm::operator/(x,y);
  191. }
  192. vec
  193. operator/( vec const & x, float y )
  194. {
  195. return boost::qvm::operator/(x,y);
  196. }
  197. quat
  198. operator/( quat const & x, float y )
  199. {
  200. return boost::qvm::operator/(x,y);
  201. }
  202. mat
  203. operator*( mat const & x, float y )
  204. {
  205. return boost::qvm::operator*(x,y);
  206. }
  207. vec
  208. operator*( vec const & x, float y )
  209. {
  210. return boost::qvm::operator*(x,y);
  211. }
  212. quat
  213. operator*( quat const & x, float y )
  214. {
  215. return boost::qvm::operator*(x,y);
  216. }
  217. mat &
  218. operator*=( mat & x, mat const & y )
  219. {
  220. return boost::qvm::operator*=(x,y);
  221. }
  222. mat
  223. operator*=( mat const & x, mat const & y )
  224. {
  225. return boost::qvm::operator*(x,y);
  226. }
  227. vec
  228. operator*( mat const & x, vec const & y )
  229. {
  230. return boost::qvm::operator*(x,y);
  231. }
  232. vec
  233. operator*( quat const & x, vec const & y )
  234. {
  235. return boost::qvm::operator*(x,y);
  236. }
  237. vec
  238. operator*( vec const & x, mat const & y )
  239. {
  240. return boost::qvm::operator*(x,y);
  241. }
  242. bool
  243. operator==( mat const & x, mat const & y )
  244. {
  245. return boost::qvm::operator==(x,y);
  246. }
  247. bool
  248. operator!=( mat const & x, mat const & y )
  249. {
  250. return boost::qvm::operator!=(x,y);
  251. }
  252. bool
  253. operator==( vec const & x, vec const & y )
  254. {
  255. return boost::qvm::operator==(x,y);
  256. }
  257. bool
  258. operator!=( vec const & x, vec const & y )
  259. {
  260. return boost::qvm::operator!=(x,y);
  261. }
  262. bool
  263. operator==( quat const & x, quat const & y )
  264. {
  265. return boost::qvm::operator==(x,y);
  266. }
  267. bool
  268. operator!=( quat const & x, quat const & y )
  269. {
  270. return boost::qvm::operator!=(x,y);
  271. }
  272. }
  273. int
  274. main()
  275. {
  276. using namespace boost::qvm::sfinae;
  277. using namespace my_stuff;
  278. typedef boost::qvm::mat<double,3,3> mat2;
  279. typedef boost::qvm::vec<double,3> vec2;
  280. typedef boost::qvm::quat<double> quat2;
  281. mat ma1, mb1; set_zero(ma1); set_zero(mb1);
  282. vec va1, vb1; set_zero(va1); set_zero(vb1);
  283. quat qa1, qb1; set_zero(qa1); set_zero(qb1);
  284. mat2 ma2, mb2; set_zero(ma2); set_zero(mb2);
  285. vec2 va2, vb2; set_zero(va2); set_zero(vb2);
  286. quat2 qa2, qb2; set_zero(qa2); set_zero(qb2);
  287. set_zero(ma1);
  288. set_zero(mb1);
  289. set_zero(va1);
  290. set_zero(vb1);
  291. set_zero(qa1);
  292. set_zero(qb1);
  293. set_zero(ma2);
  294. set_zero(mb2);
  295. set_zero(va2);
  296. set_zero(vb2);
  297. set_zero(qa2);
  298. set_zero(qb2);
  299. ma1/=2;
  300. va1/=2;
  301. qa1/=2;
  302. ma2/=2;
  303. va2/=2;
  304. qa2/=2;
  305. ma1*=2;
  306. va1*=2;
  307. qa1*=2;
  308. ma2*=2;
  309. va2*=2;
  310. qa2*=2;
  311. mb1=ma1/2;
  312. vb1=va1/2;
  313. qb1=qb1/2;
  314. mb2=convert_to<mat2>(ma1/2);
  315. vb2=convert_to<vec2>(va1/2);
  316. qb2=convert_to<quat2>(qa1/2);
  317. mb1=scalar_cast<float>(ma2/2);
  318. vb1=scalar_cast<float>(va2/2);
  319. qb1=scalar_cast<float>(qa2/2);
  320. mb1=ma1*2;
  321. vb1=va1*2;
  322. qb1=qa1*2;
  323. mb2=convert_to<mat2>(ma1*2);
  324. vb2=convert_to<vec2>(va1*2);
  325. qb2=convert_to<quat2>(qa1*2);
  326. mb1=scalar_cast<float>(ma2*2);
  327. vb1=scalar_cast<float>(va2*2);
  328. qb1=scalar_cast<float>(qa2*2);
  329. ma1*=mb1;
  330. ma1*=scalar_cast<float>(ma2);
  331. ma2*=ma1;
  332. va1=ma1*va1;
  333. va1=qa1*va1;
  334. va1=scalar_cast<float>(ma2*va1);
  335. va1=scalar_cast<float>(ma1*va2);
  336. va1=scalar_cast<float>(ma2*va2);
  337. va1=scalar_cast<float>(qa2*va1);
  338. va1=scalar_cast<float>(qa1*va2);
  339. va1=scalar_cast<float>(qa2*va2);
  340. va2=convert_to<vec2>(ma1*va1);
  341. va2=convert_to<vec2>(qa1*va1);
  342. va2=ma2*va1;
  343. va2=ma1*va2;
  344. va2=ma2*va2;
  345. va2=qa2*va1;
  346. va2=qa1*va2;
  347. va2=qa2*va2;
  348. va1=va1*ma1;
  349. va1=scalar_cast<float>(va1*ma2);
  350. va1=scalar_cast<float>(va2*ma1);
  351. va1=scalar_cast<float>(va2*ma2);
  352. va2=convert_to<vec2>(va1*ma1);
  353. va2=va1*ma2;
  354. va2=va2*ma1;
  355. va2=va2*ma2;
  356. (void) (ma1==mb1);
  357. (void) (ma1==ma2);
  358. (void) (ma2==ma1);
  359. (void) (ma1!=mb1);
  360. (void) (ma1!=ma2);
  361. (void) (ma2!=ma1);
  362. (void) (va1==vb1);
  363. (void) (va1==va2);
  364. (void) (va2==va1);
  365. (void) (va1!=vb1);
  366. (void) (va1!=va2);
  367. (void) (va2!=va1);
  368. (void) (qa1==qb1);
  369. (void) (qa1==qa2);
  370. (void) (qa2==qa1);
  371. (void) (qa1!=qb1);
  372. (void) (qa1!=qa2);
  373. (void) (qa2!=qa1);
  374. return 0;
  375. }