m3math_test.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:10k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file m3math_test.cpp
  3.  * @author Adroit
  4.  * @date 2007-03
  5.  * @brief Test cases of m3math.h
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "linden_common.h"
  35. #include "../m3math.h"
  36. #include "../v3math.h"
  37. #include "../v4math.h"
  38. #include "../m4math.h"
  39. #include "../llquaternion.h"
  40. #include "../v3dmath.h"
  41. #include "../test/lltut.h"
  42. namespace tut
  43. {
  44. struct m3math_test
  45. {
  46. };
  47. typedef test_group<m3math_test> m3math_test_t;
  48. typedef m3math_test_t::object m3math_test_object_t;
  49. tut::m3math_test_t tut_m3math_test("m3math_test");
  50. //test case for setIdentity() fn.
  51. template<> template<>
  52. void m3math_test_object_t::test<1>()
  53. {
  54. LLMatrix3 llmat3_obj;
  55. llmat3_obj.setIdentity();
  56. ensure("LLMatrix3::setIdentity failed", 1.f == llmat3_obj.mMatrix[0][0] &&
  57. 0.f == llmat3_obj.mMatrix[0][1] &&
  58. 0.f == llmat3_obj.mMatrix[0][2] &&
  59. 0.f == llmat3_obj.mMatrix[1][0] &&
  60. 1.f == llmat3_obj.mMatrix[1][1] &&
  61. 0.f == llmat3_obj.mMatrix[1][2] &&
  62. 0.f == llmat3_obj.mMatrix[2][0] &&
  63. 0.f == llmat3_obj.mMatrix[2][1] &&
  64. 1.f == llmat3_obj.mMatrix[2][2]);
  65. }
  66. //test case for LLMatrix3& setZero() fn.
  67. template<> template<>
  68. void m3math_test_object_t::test<2>()
  69. {
  70. LLMatrix3 llmat3_obj(30, 1, 2, 3);
  71. llmat3_obj.setZero();
  72. ensure("LLMatrix3::setZero failed", 0.f == llmat3_obj.setZero().mMatrix[0][0] &&
  73. 0.f == llmat3_obj.setZero().mMatrix[0][1] &&
  74. 0.f == llmat3_obj.setZero().mMatrix[0][2] &&
  75. 0.f == llmat3_obj.setZero().mMatrix[1][0] &&
  76. 0.f == llmat3_obj.setZero().mMatrix[1][1] &&
  77. 0.f == llmat3_obj.setZero().mMatrix[1][2] &&
  78. 0.f == llmat3_obj.setZero().mMatrix[2][0] &&
  79. 0.f == llmat3_obj.setZero().mMatrix[2][1] &&
  80. 0.f == llmat3_obj.setZero().mMatrix[2][2]);
  81. }
  82. //test case for setRows(const LLVector3 &x_axis, const LLVector3 &y_axis, const LLVector3 &z_axis) fns.
  83. template<> template<>
  84. void m3math_test_object_t::test<3>()
  85. {
  86. LLMatrix3 llmat3_obj;
  87. LLVector3 vect1(2, 1, 4);
  88. LLVector3 vect2(3, 5, 7);
  89. LLVector3 vect3(6, 9, 7);
  90. llmat3_obj.setRows(vect1, vect2, vect3);
  91. ensure("LLVector3::setRows failed ", 2 == llmat3_obj.mMatrix[0][0] &&
  92. 1 == llmat3_obj.mMatrix[0][1] &&
  93. 4 == llmat3_obj.mMatrix[0][2] &&
  94. 3 == llmat3_obj.mMatrix[1][0] &&
  95. 5 == llmat3_obj.mMatrix[1][1] &&
  96. 7 == llmat3_obj.mMatrix[1][2] &&
  97. 6 == llmat3_obj.mMatrix[2][0] &&
  98. 9 == llmat3_obj.mMatrix[2][1] &&
  99. 7 == llmat3_obj.mMatrix[2][2]);
  100. }
  101. //test case for getFwdRow(), getLeftRow(), getUpRow() fns.
  102. template<> template<>
  103. void m3math_test_object_t::test<4>()
  104. {
  105. LLMatrix3 llmat3_obj;
  106. LLVector3 vect1(2, 1, 4);
  107. LLVector3 vect2(3, 5, 7);
  108. LLVector3 vect3(6, 9, 7);
  109. llmat3_obj.setRows(vect1, vect2, vect3);
  110. ensure("LLVector3::getFwdRow failed ", vect1 == llmat3_obj.getFwdRow());
  111. ensure("LLVector3::getLeftRow failed ", vect2 == llmat3_obj.getLeftRow());
  112. ensure("LLVector3::getUpRow failed ", vect3 == llmat3_obj.getUpRow());
  113. }
  114. //test case for operator*(const LLMatrix3 &a, const LLMatrix3 &b)
  115. template<> template<>
  116. void m3math_test_object_t::test<5>()
  117. {
  118. LLMatrix3 llmat_obj1;
  119. LLMatrix3 llmat_obj2;
  120. LLMatrix3 llmat_obj3;
  121. LLVector3 llvec1(1, 3, 5);
  122. LLVector3 llvec2(3, 6, 1);
  123. LLVector3 llvec3(4, 6, 9);
  124. LLVector3 llvec4(1, 1, 5);
  125. LLVector3 llvec5(3, 6, 8);
  126. LLVector3 llvec6(8, 6, 2);
  127. LLVector3 llvec7(0, 0, 0);
  128. LLVector3 llvec8(0, 0, 0);
  129. LLVector3 llvec9(0, 0, 0);
  130. llmat_obj1.setRows(llvec1, llvec2, llvec3);
  131. llmat_obj2.setRows(llvec4, llvec5, llvec6);
  132. llmat_obj3.setRows(llvec7, llvec8, llvec9);
  133. llmat_obj3 = llmat_obj1 * llmat_obj2;
  134. ensure("LLMatrix3::operator*(const LLMatrix3 &a, const LLMatrix3 &b) failed", 
  135. 50 == llmat_obj3.mMatrix[0][0] &&
  136. 49 == llmat_obj3.mMatrix[0][1] &&
  137. 39 == llmat_obj3.mMatrix[0][2] &&
  138. 29 == llmat_obj3.mMatrix[1][0] &&
  139. 45 == llmat_obj3.mMatrix[1][1] &&
  140. 65 == llmat_obj3.mMatrix[1][2] &&
  141. 94 == llmat_obj3.mMatrix[2][0] &&
  142. 94 == llmat_obj3.mMatrix[2][1] &&
  143. 86 == llmat_obj3.mMatrix[2][2]);
  144. }
  145. //test case for operator*(const LLVector3 &a, const LLMatrix3 &b)
  146. template<> template<>
  147. void m3math_test_object_t::test<6>()
  148. {
  149. LLMatrix3 llmat_obj1;
  150. LLVector3 llvec(1, 3, 5);
  151. LLVector3 res_vec(0, 0, 0);
  152. LLVector3 llvec1(1, 3, 5);
  153. LLVector3 llvec2(3, 6, 1);
  154. LLVector3 llvec3(4, 6, 9);
  155. llmat_obj1.setRows(llvec1, llvec2, llvec3);
  156. res_vec = llvec * llmat_obj1;
  157. LLVector3 expected_result(30, 51, 53);
  158. ensure("LLMatrix3::operator*(const LLVector3 &a, const LLMatrix3 &b) failed", res_vec == expected_result);
  159. }
  160. //test case for operator*(const LLVector3d &a, const LLMatrix3 &b) 
  161. template<> template<>
  162. void m3math_test_object_t::test<7>()
  163. {
  164. LLMatrix3 llmat_obj1;
  165. LLVector3d llvec3d1;
  166. LLVector3d llvec3d2(0, 3, 4);
  167. LLVector3 llvec1(1, 3, 5);
  168. LLVector3 llvec2(3, 2, 1);
  169. LLVector3 llvec3(4, 6, 0);
  170. llmat_obj1.setRows(llvec1, llvec2, llvec3);
  171. llvec3d1 = llvec3d2 * llmat_obj1;
  172. LLVector3d expected_result(25, 30, 3);
  173. ensure("LLMatrix3::operator*(const LLVector3 &a, const LLMatrix3 &b) failed", llvec3d1 == expected_result);
  174. }
  175. // test case for operator==(const LLMatrix3 &a, const LLMatrix3 &b)
  176. template<> template<>
  177. void m3math_test_object_t::test<8>()
  178. {
  179. LLMatrix3 llmat_obj1;
  180. LLMatrix3 llmat_obj2;
  181. LLVector3 llvec1(1, 3, 5);
  182. LLVector3 llvec2(3, 6, 1);
  183. LLVector3 llvec3(4, 6, 9);
  184. llmat_obj1.setRows(llvec1, llvec2, llvec3);
  185. llmat_obj2.setRows(llvec1, llvec2, llvec3);
  186. ensure("LLMatrix3::operator==(const LLMatrix3 &a, const LLMatrix3 &b) failed", llmat_obj1 == llmat_obj2);
  187. llmat_obj2.setRows(llvec2, llvec2, llvec3);
  188. ensure("LLMatrix3::operator!=(const LLMatrix3 &a, const LLMatrix3 &b) failed", llmat_obj1 != llmat_obj2);
  189. }
  190. //test case for quaternion() fn.
  191. template<> template<>
  192. void m3math_test_object_t::test<9>()
  193. {
  194. LLMatrix3 llmat_obj1;
  195. LLQuaternion llmat_quat;
  196. LLVector3 llmat1(2.0f, 1.0f, 6.0f);
  197. LLVector3 llmat2(1.0f, 1.0f, 3.0f);
  198. LLVector3 llmat3(1.0f, 7.0f, 5.0f);
  199. llmat_obj1.setRows(llmat1, llmat2, llmat3);
  200. llmat_quat = llmat_obj1.quaternion();
  201. ensure("LLMatrix3::quaternion failed ", is_approx_equal(-0.66666669f, llmat_quat.mQ[0]) &&
  202. is_approx_equal(-0.83333337f, llmat_quat.mQ[1]) &&
  203. is_approx_equal(0.0f, llmat_quat.mQ[2]) &&
  204. is_approx_equal(1.5f, llmat_quat.mQ[3]));
  205. }
  206. //test case for transpose() fn.
  207. template<> template<>
  208. void m3math_test_object_t::test<10>()
  209. {
  210. LLMatrix3 llmat_obj;
  211. LLVector3 llvec1(1, 2, 3);
  212. LLVector3 llvec2(3, 2, 1);
  213. LLVector3 llvec3(2, 2, 2);
  214. llmat_obj.setRows(llvec1, llvec2, llvec3);
  215. llmat_obj.transpose();
  216. LLVector3 resllvec1(1, 3, 2);
  217. LLVector3 resllvec2(2, 2, 2);
  218. LLVector3 resllvec3(3, 1, 2);
  219. LLMatrix3 expectedllmat_obj;
  220. expectedllmat_obj.setRows(resllvec1, resllvec2, resllvec3);
  221. ensure("LLMatrix3::transpose failed ", llmat_obj == expectedllmat_obj);
  222. }
  223. //test case for determinant() fn.
  224. template<> template<>
  225. void m3math_test_object_t::test<11>()
  226. {
  227. LLMatrix3 llmat_obj1;
  228. LLVector3 llvec1(1, 2, 3);
  229. LLVector3 llvec2(3, 2, 1);
  230. LLVector3 llvec3(2, 2, 2);
  231. llmat_obj1.setRows(llvec1, llvec2, llvec3);
  232. ensure("LLMatrix3::determinant failed ",  0.0f == llmat_obj1.determinant());
  233. }
  234. //test case for orthogonalize() fn.
  235. template<> template<>
  236. void m3math_test_object_t::test<12>()
  237. {
  238. LLMatrix3 llmat_obj;
  239. LLVector3 llvec1(1, 0, 0);
  240. LLVector3 llvec2(1, 2, 0);
  241. LLVector3 llvec3(2, 4, 2);
  242. llmat_obj.setRows(llvec1, llvec2, llvec3);
  243. llmat_obj.orthogonalize();
  244. ensure("LLMatrix3::orthogonalize failed ",
  245.        is_approx_equal(1.0f, llmat_obj.mMatrix[0][0]) &&
  246.        is_approx_equal(0.0f, llmat_obj.mMatrix[0][1]) &&
  247.        is_approx_equal(0.0f, llmat_obj.mMatrix[0][2]) &&
  248.        is_approx_equal(0.0f, llmat_obj.mMatrix[1][0]) &&
  249.        is_approx_equal(1.0f, llmat_obj.mMatrix[1][1]) &&
  250.        is_approx_equal(0.0f, llmat_obj.mMatrix[1][2]) &&
  251.        is_approx_equal(0.0f, llmat_obj.mMatrix[2][0]) &&
  252.        is_approx_equal(0.0f, llmat_obj.mMatrix[2][1]) &&
  253.        is_approx_equal(1.0f, llmat_obj.mMatrix[2][2]));
  254. }
  255. //test case for adjointTranspose() fn.
  256. template<> template<>
  257. void m3math_test_object_t::test<13>()
  258. {
  259. LLMatrix3 llmat_obj;
  260. LLVector3 llvec1(3, 2, 1);
  261. LLVector3 llvec2(6, 2, 1);
  262. LLVector3 llvec3(3, 6, 8);
  263. llmat_obj.setRows(llvec1, llvec2, llvec3);
  264. llmat_obj.adjointTranspose();
  265. ensure("LLMatrix3::adjointTranspose failed ", 10 == llmat_obj.mMatrix[0][0] &&
  266. -45 == llmat_obj.mMatrix[1][0] &&
  267. 30 == llmat_obj.mMatrix[2][0] &&
  268. -10 == llmat_obj.mMatrix[0][1] &&
  269. 21 == llmat_obj.mMatrix[1][1] &&
  270. -12 == llmat_obj.mMatrix[2][1] &&
  271. 0  == llmat_obj.mMatrix[0][2] &&
  272. 3 == llmat_obj.mMatrix[1][2] &&
  273. -6 == llmat_obj.mMatrix[2][2]);
  274. }
  275. /* TBD: Need to add test cases for getEulerAngles() and setRot() functions */
  276. }