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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llquaternion_test.cpp
  3.  * @author Adroit
  4.  * @date 2007-03
  5.  * @brief Test cases of llquaternion.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 "../test/lltut.h"
  36. #include "../llquaternion.h"
  37. #include "../v4math.h"
  38. #include "../v3math.h"
  39. #include "../v3dmath.h"
  40. #include "../m4math.h"
  41. #include "../m3math.h"
  42. namespace tut
  43. {
  44. struct llquat_test
  45. {
  46. };
  47. typedef test_group<llquat_test> llquat_test_t;
  48. typedef llquat_test_t::object llquat_test_object_t;
  49. tut::llquat_test_t tut_llquat_test("llquat");
  50. //test case for LLQuaternion::LLQuaternion(void) fn.
  51. template<> template<>
  52. void llquat_test_object_t::test<1>()
  53. {
  54. LLQuaternion llquat;
  55. ensure("LLQuaternion::LLQuaternion() failed", 0.f == llquat.mQ[0] &&
  56.   0.f == llquat.mQ[1] &&
  57.   0.f == llquat.mQ[2] &&
  58. 1.f == llquat.mQ[3]);
  59. }
  60. //test case for explicit LLQuaternion(const LLMatrix4 &mat) fn.
  61. template<> template<>
  62. void llquat_test_object_t::test<2>()
  63. {
  64. LLMatrix4 llmat;
  65. LLVector4 vector1(2.0f, 1.0f, 3.0f, 6.0f);
  66. LLVector4 vector2(5.0f, 6.0f, 0.0f, 1.0f);
  67. LLVector4 vector3(2.0f, 1.0f, 2.0f, 9.0f);
  68. LLVector4 vector4(3.0f, 8.0f, 1.0f, 5.0f);
  69. llmat.initRows(vector1, vector2, vector3, vector4);
  70. ensure("explicit LLQuaternion(const LLMatrix4 &mat) failed", 2.0f == llmat.mMatrix[0][0] &&
  71.   1.0f == llmat.mMatrix[0][1] &&
  72. 3.0f == llmat.mMatrix[0][2] &&
  73. 6.0f == llmat.mMatrix[0][3] &&
  74. 5.0f == llmat.mMatrix[1][0] &&
  75. 6.0f == llmat.mMatrix[1][1] &&
  76. 0.0f == llmat.mMatrix[1][2] &&
  77. 1.0f == llmat.mMatrix[1][3] &&
  78. 2.0f == llmat.mMatrix[2][0] &&
  79. 1.0f == llmat.mMatrix[2][1] &&
  80. 2.0f == llmat.mMatrix[2][2] &&
  81. 9.0f == llmat.mMatrix[2][3] &&
  82. 3.0f == llmat.mMatrix[3][0] &&
  83. 8.0f == llmat.mMatrix[3][1] &&
  84. 1.0f == llmat.mMatrix[3][2] &&
  85. 5.0f == llmat.mMatrix[3][3]);
  86. }
  87. template<> template<>
  88. void llquat_test_object_t::test<3>()
  89. {
  90. LLMatrix3 llmat;
  91. LLVector3 vect1(3.4028234660000000f , 234.56f, 4234.442234f);
  92. LLVector3 vect2(741.434f, 23.00034f, 6567.223423f);
  93. LLVector3 vect3(566.003034f, 12.98705f, 234.764423f);
  94. llmat.setRows(vect1, vect2, vect3);
  95. ensure("LLMatrix3::setRows fn failed.", 3.4028234660000000f == llmat.mMatrix[0][0] &&
  96. 234.56f == llmat.mMatrix[0][1] &&
  97. 4234.442234f == llmat.mMatrix[0][2] &&
  98. 741.434f == llmat.mMatrix[1][0] &&
  99. 23.00034f == llmat.mMatrix[1][1] &&
  100. 6567.223423f == llmat.mMatrix[1][2] &&
  101. 566.003034f == llmat.mMatrix[2][0] &&
  102. 12.98705f == llmat.mMatrix[2][1] &&
  103. 234.764423f == llmat.mMatrix[2][2]);
  104. }
  105. //test case for LLQuaternion(F32 x, F32 y, F32 z, F32 w), setQuatInit() and normQuat() fns.
  106. template<> template<>
  107. void llquat_test_object_t::test<4>()
  108. {
  109. F32 x_val = 3.0f;
  110. F32 y_val = 2.0f;
  111. F32 z_val = 6.0f;
  112. F32 w_val = 1.0f;
  113. LLQuaternion res_quat;
  114. res_quat.setQuatInit(x_val, y_val, z_val, w_val);
  115. res_quat.normQuat();
  116. ensure("LLQuaternion::normQuat() fn failed", 
  117. is_approx_equal(0.42426407f, res_quat.mQ[0]) &&
  118. is_approx_equal(0.28284273f, res_quat.mQ[1]) &&
  119. is_approx_equal(0.84852815f, res_quat.mQ[2]) &&
  120. is_approx_equal(0.14142136f, res_quat.mQ[3]));
  121. x_val = 0.0f;
  122. y_val = 0.0f;
  123. z_val = 0.0f;
  124. w_val = 0.0f;
  125. res_quat.setQuatInit(x_val, y_val, z_val, w_val);
  126. res_quat.normQuat();
  127. ensure("LLQuaternion::normQuat() fn. failed.", 
  128. is_approx_equal(0.0f, res_quat.mQ[0]) &&
  129. is_approx_equal(0.0f, res_quat.mQ[1]) &&
  130. is_approx_equal(0.0f, res_quat.mQ[2]) &&
  131. is_approx_equal(1.0f, res_quat.mQ[3]));
  132. ensure("LLQuaternion::normQuat() fn. failed.", 
  133. is_approx_equal(0.0f, res_quat.mQ[0]) &&
  134. is_approx_equal(0.0f, res_quat.mQ[1]) &&
  135. is_approx_equal(0.0f, res_quat.mQ[2]) &&
  136. is_approx_equal(1.0f, res_quat.mQ[3]));
  137. }
  138. //test case for conjQuat() and transQuat() fns.
  139. template<> template<>
  140. void llquat_test_object_t::test<5>()
  141. {
  142. F32 x_val = 3.0f;
  143. F32 y_val = 2.0f;
  144. F32 z_val = 6.0f;
  145. F32 w_val = 1.0f;
  146. LLQuaternion res_quat;
  147. LLQuaternion result, result1;
  148. result1 = result = res_quat.setQuatInit(x_val, y_val, z_val, w_val);
  149. result.conjQuat();
  150. result1.transQuat();
  151. ensure("LLQuaternion::conjQuat and LLQuaternion::transQuat failed ", 
  152. is_approx_equal(result1.mQ[0], result.mQ[0]) &&
  153. is_approx_equal(result1.mQ[1], result.mQ[1]) &&
  154. is_approx_equal(result1.mQ[2], result.mQ[2]));
  155. }
  156. //test case for dot(const LLQuaternion &a, const LLQuaternion &b) fn.
  157. template<> template<>
  158. void llquat_test_object_t::test<6>()
  159. {
  160. LLQuaternion quat1(3.0f, 2.0f, 6.0f, 0.0f), quat2(1.0f, 1.0f, 1.0f, 1.0f);
  161. ensure("1. The two values are different", llround(12.000000f, 2) == llround(dot(quat1, quat2), 2));
  162. LLQuaternion quat0(3.0f, 9.334f, 34.5f, 23.0f), quat(34.5f, 23.23f, 2.0f, 45.5f);
  163. ensure("2. The two values are different", llround(1435.828807f, 2) == llround(dot(quat0, quat), 2));
  164. }
  165. //test case for LLQuaternion &LLQuaternion::constrain(F32 radians) fn.
  166. template<> template<>
  167. void llquat_test_object_t::test<7>()
  168. {
  169. F32 radian = 60.0f;
  170. LLQuaternion quat(3.0f, 2.0f, 6.0f, 0.0f);
  171. LLQuaternion quat1;
  172. quat1 = quat.constrain(radian);
  173. ensure("1. LLQuaternion::constrain(F32 radians) failed", 
  174. is_approx_equal_fraction(-0.423442f, quat1.mQ[0], 8) &&
  175. is_approx_equal_fraction(-0.282295f, quat1.mQ[1], 8) &&
  176. is_approx_equal_fraction(-0.846884f, quat1.mQ[2], 8) &&
  177. is_approx_equal_fraction(0.154251f, quat1.mQ[3], 8));
  178. radian = 30.0f;
  179. LLQuaternion quat0(37.50f, 12.0f, 86.023f, 40.32f);
  180. quat1 = quat0.constrain(radian);
  181. ensure("2. LLQuaternion::constrain(F32 radians) failed", 
  182. is_approx_equal_fraction(37.500000f, quat1.mQ[0], 8) &&
  183. is_approx_equal_fraction(12.0000f, quat1.mQ[1], 8) &&
  184. is_approx_equal_fraction(86.0230f, quat1.mQ[2], 8) &&
  185. is_approx_equal_fraction(40.320000f, quat1.mQ[3], 8));
  186. }
  187. template<> template<>
  188. void llquat_test_object_t::test<8>()
  189. {
  190. F32 value1 = 15.0f;
  191. LLQuaternion quat1(1.0f, 2.0f, 4.0f, 1.0f);
  192. LLQuaternion quat2(4.0f, 3.0f, 6.5f, 9.7f);
  193. LLQuaternion res_lerp, res_slerp, res_nlerp;
  194. //test case for lerp(F32 t, const LLQuaternion &q) fn. 
  195. res_lerp = lerp(value1, quat1);
  196. ensure("1. LLQuaternion lerp(F32 t, const LLQuaternion &q) failed", 
  197. is_approx_equal_fraction(0.181355f, res_lerp.mQ[0], 16) &&
  198. is_approx_equal_fraction(0.362711f, res_lerp.mQ[1], 16) &&
  199. is_approx_equal_fraction(0.725423f, res_lerp.mQ[2], 16) &&
  200. is_approx_equal_fraction(0.556158f, res_lerp.mQ[3], 16));
  201. //test case for lerp(F32 t, const LLQuaternion &p, const LLQuaternion &q) fn.
  202. res_lerp = lerp(value1, quat1, quat2);
  203. ensure("2. LLQuaternion lerp(F32 t, const LLQuaternion &p, const LLQuaternion &q) failed",
  204. is_approx_equal_fraction(0.314306f, res_lerp.mQ[0], 16) &&
  205. is_approx_equal_fraction(0.116156f, res_lerp.mQ[1], 16) &&
  206. is_approx_equal_fraction(0.283559f, res_lerp.mQ[2], 16) &&
  207. is_approx_equal_fraction(0.898506f, res_lerp.mQ[3], 16));
  208. //test case for slerp( F32 u, const LLQuaternion &a, const LLQuaternion &b ) fn.
  209. res_slerp = slerp(value1, quat1, quat2);
  210. ensure("3. LLQuaternion slerp( F32 u, const LLQuaternion &a, const LLQuaternion &b) failed", 
  211. is_approx_equal_fraction(46.000f, res_slerp.mQ[0], 16) &&
  212. is_approx_equal_fraction(17.00f, res_slerp.mQ[1], 16) &&
  213. is_approx_equal_fraction(41.5f, res_slerp.mQ[2], 16) &&
  214. is_approx_equal_fraction(131.5f, res_slerp.mQ[3], 16));
  215. //test case for nlerp(F32 t, const LLQuaternion &a, const LLQuaternion &b) fn.
  216. res_nlerp = nlerp(value1, quat1, quat2);
  217. ensure("4. LLQuaternion nlerp(F32 t, const LLQuaternion &a, const LLQuaternion &b) failed",  
  218. is_approx_equal_fraction(0.314306f, res_nlerp.mQ[0], 16) &&
  219. is_approx_equal_fraction(0.116157f, res_nlerp.mQ[1], 16) &&
  220. is_approx_equal_fraction(0.283559f, res_nlerp.mQ[2], 16) &&
  221. is_approx_equal_fraction(0.898506f, res_nlerp.mQ[3], 16));
  222. //test case for nlerp(F32 t, const LLQuaternion &q) fn.
  223. res_slerp = slerp(value1, quat1);
  224. ensure("5. LLQuaternion slerp(F32 t, const LLQuaternion &q) failed", 
  225. is_approx_equal_fraction(1.0f, res_slerp.mQ[0], 16) &&
  226. is_approx_equal_fraction(2.0f, res_slerp.mQ[1], 16) &&
  227. is_approx_equal_fraction(4.0000f, res_slerp.mQ[2], 16) &&
  228. is_approx_equal_fraction(1.000f, res_slerp.mQ[3], 16));
  229. LLQuaternion quat3(2.0f, 1.0f, 5.5f, 10.5f);
  230. LLQuaternion res_nlerp1;
  231. value1 = 100.0f;
  232. res_nlerp1 = nlerp(value1, quat3);
  233. ensure("6. LLQuaternion nlerp(F32 t, const LLQuaternion &q)  failed", 
  234. is_approx_equal_fraction(0.268245f, res_nlerp1.mQ[0], 16) && is_approx_equal_fraction(0.134122f, res_nlerp1.mQ[1], 2) &&
  235. is_approx_equal_fraction(0.737673f, res_nlerp1.mQ[2], 16) &&
  236. is_approx_equal_fraction(0.604892f, res_nlerp1.mQ[3], 16));
  237. //test case for lerp(F32 t, const LLQuaternion &q) fn. 
  238. res_lerp = lerp(value1, quat2);
  239. ensure("7. LLQuaternion lerp(F32 t, const LLQuaternion &q) failed", 
  240. is_approx_equal_fraction(0.404867f, res_lerp.mQ[0], 16) &&
  241. is_approx_equal_fraction(0.303650f, res_lerp.mQ[1], 16) &&
  242. is_approx_equal_fraction(0.657909f, res_lerp.mQ[2], 16) &&
  243. is_approx_equal_fraction(0.557704f, res_lerp.mQ[3], 16));
  244. }
  245. template<> template<>
  246. void llquat_test_object_t::test<9>()
  247. {
  248. //test case for LLQuaternion operator*(const LLQuaternion &a, const LLQuaternion &b) fn
  249. LLQuaternion quat1(1.0f, 2.5f, 3.5f, 5.5f);
  250. LLQuaternion quat2(4.0f, 3.0f, 5.0f, 1.0f);
  251. LLQuaternion result = quat1 *  quat2;
  252. ensure("1. LLQuaternion Operator* failed", (21.0f == result.mQ[0]) &&
  253. (10.0f == result.mQ[1]) &&
  254. (38.0f == result.mQ[2]) && 
  255. (-23.5f == result.mQ[3]));
  256. LLQuaternion quat3(2341.340f, 2352.345f, 233.25f, 7645.5f);
  257. LLQuaternion quat4(674.067f, 893.0897f, 578.0f, 231.0f);
  258. result = quat3 * quat4;
  259. ensure("2. LLQuaternion Operator* failed", (4543086.5f == result.mQ[0]) &&
  260. (8567578.0f == result.mQ[1]) &&
  261. (3967591.25f == result.mQ[2]) &&
  262. is_approx_equal(-2047783.25f, result.mQ[3]));
  263. //inline LLQuaternion operator+(const LLQuaternion &a, const LLQuaternion &b)fn.
  264. result = quat1 + quat2;
  265. ensure("3. LLQuaternion operator+ failed", (5.0f == result.mQ[0]) &&
  266. (5.5f == result.mQ[1]) &&
  267. (8.5f == result.mQ[2]) &&
  268. (6.5f == result.mQ[3]));
  269. result = quat3 + quat4;
  270. ensure(
  271. "4. LLQuaternion operator+ failed",
  272. is_approx_equal(3015.407227f, result.mQ[0]) &&
  273. is_approx_equal(3245.434570f, result.mQ[1]) &&
  274. (811.25f == result.mQ[2]) &&
  275. (7876.5f == result.mQ[3]));
  276. //inline LLQuaternion operator-(const LLQuaternion &a, const LLQuaternion &b) fn
  277. result = quat1 - quat2;
  278. ensure(
  279. "5. LLQuaternion operator-(const LLQuaternion &a, const LLQuaternion &b) failed", 
  280. (-3.0f == result.mQ[0]) &&
  281. (-0.5f == result.mQ[1]) &&
  282. (-1.5f == result.mQ[2]) &&
  283. (4.5f == result.mQ[3]));
  284. result = quat3 - quat4;
  285. ensure(
  286. "6. LLQuaternion operator-(const LLQuaternion &a, const LLQuaternion &b) failed", 
  287. is_approx_equal(1667.273071f, result.mQ[0]) &&
  288. is_approx_equal(1459.255249f, result.mQ[1]) &&
  289. (-344.75f == result.mQ[2]) &&
  290. (7414.50f == result.mQ[3]));
  291. }
  292. //test case for LLVector4 operator*(const LLVector4 &a, const LLQuaternion &rot) fn.
  293. template<> template<>
  294. void llquat_test_object_t::test<10>()
  295. {
  296. LLVector4 vect(12.0f, 5.0f, 60.0f, 75.1f);
  297. LLQuaternion quat(2323.034f, 23.5f, 673.23f, 57667.5f);
  298. LLVector4 result = vect * quat;
  299. ensure(
  300. "1. LLVector4 operator*(const LLVector4 &a, const LLQuaternion &rot) failed", 
  301. is_approx_equal(39928406016.0f, result.mV[0]) &&
  302. // gcc on x86 actually gives us more precision than we were expecting, verified with -ffloat-store - we forgive this
  303. (1457802240.0f >= result.mV[1]) && // gcc+x86+linux
  304. (1457800960.0f <= result.mV[1]) && // elsewhere
  305. is_approx_equal(200580612096.0f, result.mV[2]) &&
  306. (75.099998f == result.mV[3]));
  307. LLVector4 vect1(22.0f, 45.0f, 40.0f, 78.1f);
  308. LLQuaternion quat1(2.034f, 45.5f, 37.23f, 7.5f);
  309. result = vect1 * quat1;
  310. ensure(
  311. "2. LLVector4 operator*(const LLVector4 &a, const LLQuaternion &rot) failed", 
  312. is_approx_equal(-58153.5390f, result.mV[0]) &&
  313. (183787.8125f == result.mV[1]) &&
  314. (116864.164063f == result.mV[2]) &&
  315. (78.099998f == result.mV[3]));
  316. }
  317. //test case for LLVector3 operator*(const LLVector3 &a, const LLQuaternion &rot) fn.
  318. template<> template<>
  319. void llquat_test_object_t::test<11>()
  320. {
  321. LLVector3 vect(12.0f, 5.0f, 60.0f);
  322. LLQuaternion quat(23.5f, 6.5f, 3.23f, 56.5f);
  323. LLVector3 result = vect * quat;
  324. ensure(
  325. "1. LLVector3 operator*(const LLVector3 &a, const LLQuaternion &rot) failed", 
  326. is_approx_equal(97182.953125f,result.mV[0]) &&
  327. is_approx_equal(-135405.640625f, result.mV[1]) &&
  328. is_approx_equal(162986.140f, result.mV[2]));
  329. LLVector3 vect1(5.0f, 40.0f, 78.1f);
  330. LLQuaternion quat1(2.034f, 45.5f, 37.23f, 7.5f);
  331. result = vect1 * quat1;
  332. ensure(
  333. "2. LLVector3 operator*(const LLVector3 &a, const LLQuaternion &rot) failed", 
  334. is_approx_equal(33217.703f, result.mV[0]) &&
  335. is_approx_equal(295383.8125f, result.mV[1]) &&
  336. is_approx_equal(84718.140f, result.mV[2]));
  337. }
  338. //test case for LLVector3d operator*(const LLVector3d &a, const LLQuaternion &rot) fn.
  339. template<> template<>
  340. void llquat_test_object_t::test<12>()
  341. {
  342. LLVector3d vect(-2.0f, 5.0f, -6.0f);
  343. LLQuaternion quat(-3.5f, 4.5f, 3.5f, 6.5f);
  344. LLVector3d result = vect * quat;
  345. ensure(
  346. "1. LLVector3d operator*(const LLVector3d &a, const LLQuaternion &rot) failed ", 
  347. (-633.0f == result.mdV[0]) &&
  348. (-300.0f == result.mdV[1]) &&
  349. (-36.0f == result.mdV[2]));
  350. LLVector3d vect1(5.0f, -4.5f, 8.21f);
  351. LLQuaternion quat1(2.0f, 4.5f, -7.2f, 9.5f);
  352. result = vect1 * quat1;
  353. ensure(
  354. "2. LLVector3d operator*(const LLVector3d &a, const LLQuaternion &rot) failed", 
  355. is_approx_equal_fraction(-120.29f, (F32) result.mdV[0], 8) &&
  356. is_approx_equal_fraction(-1683.958f, (F32) result.mdV[1], 8) &&
  357. is_approx_equal_fraction(516.56f, (F32) result.mdV[2], 8));
  358. LLVector3d vect2(2.0f, 3.5f, 1.1f);
  359. LLQuaternion quat2(1.0f, 4.0f, 2.0f, 5.0f);
  360. result = vect2 * quat2;
  361. ensure(
  362. "3. LLVector3d operator*(const LLVector3d &a, const LLQuaternion &rot) failed", 
  363. is_approx_equal_fraction(18.400001f, (F32) result.mdV[0], 8) &&
  364. is_approx_equal_fraction(188.6f, (F32) result.mdV[1], 8) &&
  365. is_approx_equal_fraction(32.20f, (F32) result.mdV[2], 8));
  366. }
  367. //test case for inline LLQuaternion operator-(const LLQuaternion &a) fn.
  368. template<> template<>
  369. void llquat_test_object_t::test<13>()
  370. {
  371. LLQuaternion quat(23.5f, 34.5f, 16723.4f, 324.7f);
  372. LLQuaternion result = -quat;
  373. ensure(
  374. "1. LLQuaternion operator-(const LLQuaternion &a) failed", 
  375. (-23.5f == result.mQ[0]) &&
  376. (-34.5f == result.mQ[1]) &&
  377. (-16723.4f == result.mQ[2]) &&
  378. (-324.7f == result.mQ[3]));
  379. LLQuaternion quat1(-3.5f, -34.5f, -16.4f, -154.7f);
  380. result = -quat1;
  381. ensure(
  382. "2. LLQuaternion operator-(const LLQuaternion &a) failed.", 
  383. (3.5f == result.mQ[0]) &&
  384. (34.5f == result.mQ[1]) &&
  385. (16.4f == result.mQ[2]) &&
  386. (154.7f == result.mQ[3]));
  387. }
  388. //test case for inline LLQuaternion operator*(F32 a, const LLQuaternion &q) and
  389. //inline LLQuaternion operator*(F32 a, const LLQuaternion &q) fns.
  390. template<> template<>
  391. void llquat_test_object_t::test<14>()
  392. {
  393. LLQuaternion quat_value(9.0f, 8.0f, 7.0f, 6.0f);
  394. F32 a =3.5f;
  395. LLQuaternion result = a * quat_value;
  396. LLQuaternion result1 = quat_value * a;
  397. ensure(
  398. "1. LLQuaternion operator* failed",
  399. (result.mQ[0] == result1.mQ[0]) &&
  400. (result.mQ[1] == result1.mQ[1]) &&
  401. (result.mQ[2] == result1.mQ[2]) &&
  402. (result.mQ[3] == result1.mQ[3]));
  403. LLQuaternion quat_val(9454.0f, 43568.3450f, 456343247.0343f, 2346.03434f);
  404. a =-3324.3445f;
  405. result = a * quat_val;
  406. result1 = quat_val * a;
  407. ensure(
  408. "2. LLQuaternion operator* failed",
  409. (result.mQ[0] == result1.mQ[0]) &&
  410. (result.mQ[1] == result1.mQ[1]) &&
  411. (result.mQ[2] == result1.mQ[2]) &&
  412. (result.mQ[3] == result1.mQ[3]));
  413. }
  414. template<> template<>
  415. void llquat_test_object_t::test<15>()
  416. {
  417. // test cases for inline LLQuaternion operator~(const LLQuaternion &a)
  418. LLQuaternion quat_val(2323.634f, -43535.4f, 3455.88f, -32232.45f);
  419. LLQuaternion result = ~quat_val;
  420. ensure(
  421. "1. LLQuaternion operator~(const LLQuaternion &a) failed ", 
  422. (-2323.634f == result.mQ[0]) &&
  423. (43535.4f == result.mQ[1]) &&
  424. (-3455.88f == result.mQ[2]) &&
  425. (-32232.45f == result.mQ[3]));
  426. //test case for inline bool LLQuaternion::operator==(const LLQuaternion &b) const
  427. LLQuaternion quat_val1(2323.634f, -43535.4f, 3455.88f, -32232.45f);
  428. LLQuaternion quat_val2(2323.634f, -43535.4f, 3455.88f, -32232.45f);
  429. ensure(
  430. "2. LLQuaternion::operator==(const LLQuaternion &b) failed",
  431. quat_val1 == quat_val2);
  432. }
  433. template<> template<>
  434. void llquat_test_object_t::test<16>()
  435. {
  436. //test case for inline bool LLQuaternion::operator!=(const LLQuaternion &b) const
  437. LLQuaternion quat_val1(2323.634f, -43535.4f, 3455.88f, -32232.45f);
  438. LLQuaternion quat_val2(0, -43535.4f, 3455.88f, -32232.45f);
  439. ensure("LLQuaternion::operator!=(const LLQuaternion &b) failed", quat_val1 != quat_val2);
  440. }
  441. template<> template<>
  442. void llquat_test_object_t::test<17>()
  443. {
  444. //test case for LLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order)
  445. F32 x = 2.0f;
  446. F32 y = 1.0f;
  447. F32 z = 3.0f;
  448. LLQuaternion result = mayaQ(x, y, z, LLQuaternion::XYZ);
  449. ensure(
  450. "1. LLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order) failed for XYZ",
  451. is_approx_equal_fraction(0.0172174f, result.mQ[0], 16) &&
  452. is_approx_equal_fraction(0.009179f, result.mQ[1], 16) &&
  453. is_approx_equal_fraction(0.026020f, result.mQ[2], 16) &&
  454. is_approx_equal_fraction(0.999471f, result.mQ[3], 16));
  455. LLQuaternion result1 = mayaQ(x, y, z, LLQuaternion::YZX);
  456. ensure(
  457. "2. LLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order) failed for XYZ",
  458. is_approx_equal_fraction(0.017217f, result1.mQ[0], 16) &&
  459. is_approx_equal_fraction(0.008265f, result1.mQ[1], 16) &&
  460. is_approx_equal_fraction(0.026324f, result1.mQ[2], 16) &&
  461. is_approx_equal_fraction(0.999471f, result1.mQ[3], 16));
  462. LLQuaternion result2 = mayaQ(x, y, z, LLQuaternion::ZXY);
  463. ensure(
  464. "3. LLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order) failed for ZXY", 
  465. is_approx_equal_fraction(0.017674f, result2.mQ[0], 16) &&
  466. is_approx_equal_fraction(0.008265f, result2.mQ[1], 16) &&
  467. is_approx_equal_fraction(0.026020f, result2.mQ[2], 16) &&
  468. is_approx_equal_fraction(0.999471f, result2.mQ[3], 16));
  469. LLQuaternion result3 = mayaQ(x, y, z, LLQuaternion::XZY);
  470. ensure(
  471. "4. TLLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order) failed for XZY", 
  472. is_approx_equal_fraction(0.017674f, result3.mQ[0], 16) &&
  473. is_approx_equal_fraction(0.009179f, result3.mQ[1], 16) &&
  474. is_approx_equal_fraction(0.026020f, result3.mQ[2], 16) &&
  475. is_approx_equal_fraction(0.999463f, result3.mQ[3], 16));
  476. LLQuaternion result4 = mayaQ(x, y, z, LLQuaternion::YXZ);
  477. ensure(
  478. "5. LLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order) failed for YXZ", 
  479. is_approx_equal_fraction(0.017217f, result4.mQ[0], 16) &&
  480. is_approx_equal_fraction(0.009179f, result4.mQ[1], 16) &&
  481. is_approx_equal_fraction(0.026324f, result4.mQ[2], 16) &&
  482. is_approx_equal_fraction(0.999463f, result4.mQ[3], 16));
  483. LLQuaternion result5 = mayaQ(x, y, z, LLQuaternion::ZYX);
  484. ensure(
  485. "6. LLQuaternion mayaQ(F32 xRot, F32 yRot, F32 zRot, LLQuaternion::Order order) failed for ZYX", 
  486. is_approx_equal_fraction(0.017674f, result5.mQ[0], 16) &&
  487. is_approx_equal_fraction(0.008265f, result5.mQ[1], 16) &&
  488. is_approx_equal_fraction(0.026324f, result5.mQ[2], 16) &&
  489. is_approx_equal_fraction(0.999463f, result5.mQ[3], 16));
  490. }
  491. template<> template<>
  492. void llquat_test_object_t::test<18>()
  493. {
  494. // test case for friend std::ostream& operator<<(std::ostream &s, const LLQuaternion &a) fn
  495. LLQuaternion a(1.0f, 1.0f, 1.0f, 1.0f); 
  496. std::ostringstream result_value;
  497. result_value << a;
  498. ensure_equals("1. Operator << failed", result_value.str(), "{ 1, 1, 1, 1 }");
  499. LLQuaternion b(-31.034f, 231.2340f, 3451.344320f, -341.0f); 
  500. std::ostringstream result_value1;
  501. result_value1 << b;
  502. ensure_equals("2. Operator << failed", result_value1.str(), "{ -31.034, 231.234, 3451.34, -341 }");
  503. LLQuaternion c(1.0f, 2.2f, 3.3f, 4.4f); 
  504. result_value << c;
  505. ensure_equals("3. Operator << failed", result_value.str(), "{ 1, 1, 1, 1 }{ 1, 2.2, 3.3, 4.4 }");
  506. }
  507. template<> template<>
  508. void llquat_test_object_t::test<19>()
  509. {
  510. //test case for const char *OrderToString( const LLQuaternion::Order order ) fn
  511. const char* result = OrderToString(LLQuaternion::XYZ);
  512. ensure("1. OrderToString failed for XYZ",  (0 == strcmp("XYZ", result)));
  513. result = OrderToString(LLQuaternion::YZX);
  514. ensure("2. OrderToString failed for YZX",  (0 == strcmp("YZX", result)));
  515. result = OrderToString(LLQuaternion::ZXY);
  516. ensure(
  517. "3. OrderToString failed for ZXY",
  518. (0 == strcmp("ZXY", result)) &&
  519. (0 != strcmp("XYZ", result)) &&
  520. (0 != strcmp("YXZ", result)) &&
  521. (0 != strcmp("ZYX", result)) &&
  522. (0 != strcmp("XYZ", result)));
  523. result = OrderToString(LLQuaternion::XZY);
  524. ensure("4. OrderToString failed for XZY",  (0 == strcmp("XZY", result)));
  525. result = OrderToString(LLQuaternion::ZYX);
  526. ensure("5. OrderToString failed for ZYX",  (0 == strcmp("ZYX", result)));
  527. result = OrderToString(LLQuaternion::YXZ);
  528. ensure("6.OrderToString failed for YXZ",  (0 == strcmp("YXZ", result)));
  529. }
  530. template<> template<>
  531. void llquat_test_object_t::test<20>()
  532. {
  533. //test case for LLQuaternion::Order StringToOrder( const char *str ) fn
  534. int result = StringToOrder("XYZ");
  535. ensure("1. LLQuaternion::Order StringToOrder(const char *str ) failed for XYZ", 0 == result);
  536. result = StringToOrder("YZX");
  537. ensure("2. LLQuaternion::Order StringToOrder(const char *str) failed for YZX", 1 == result);
  538. result = StringToOrder("ZXY");
  539. ensure("3. LLQuaternion::Order StringToOrder(const char *str) failed for ZXY", 2 == result);
  540. result = StringToOrder("XZY");
  541. ensure("4. LLQuaternion::Order StringToOrder(const char *str) failed for XZY", 3 == result);
  542. result = StringToOrder("YXZ");
  543. ensure("5. LLQuaternion::Order StringToOrder(const char *str) failed for YXZ", 4 == result);
  544. result = StringToOrder("ZYX");
  545. ensure("6. LLQuaternion::Order StringToOrder(const char *str) failed for  ZYX", 5 == result);
  546. }
  547. template<> template<>
  548. void llquat_test_object_t::test<21>()
  549. {
  550. //void LLQuaternion::getAngleAxis(F32* angle, LLVector3 &vec) const fn
  551. F32 angle_value = 90.0f;
  552. LLVector3 vect(12.0f, 4.0f, 1.0f);
  553. LLQuaternion llquat(angle_value, vect);
  554. llquat.getAngleAxis(&angle_value, vect); 
  555. ensure(
  556. "LLQuaternion::getAngleAxis(F32* angle, LLVector3 &vec) failed", 
  557. is_approx_equal_fraction(2.035406f, angle_value, 16) &&
  558. is_approx_equal_fraction(0.315244f, vect.mV[1], 16) &&
  559. is_approx_equal_fraction(0.078811f, vect.mV[2], 16) &&
  560. is_approx_equal_fraction(0.945733f, vect.mV[0], 16));
  561. }
  562. template<> template<>
  563. void llquat_test_object_t::test<22>()
  564. {
  565. //test case for void LLQuaternion::getEulerAngles(F32 *roll, F32 *pitch, F32 *yaw) const fn
  566. F32 roll = -12.0f;
  567. F32 pitch = -22.43f;
  568. F32 yaw = 11.0f;
  569. LLQuaternion llquat;
  570. llquat.getEulerAngles(&roll, &pitch, &yaw);
  571. ensure(
  572. "LLQuaternion::getEulerAngles(F32 *roll, F32 *pitch, F32 *yaw) failed",
  573. is_approx_equal(0.000f, llquat.mQ[0]) &&
  574. is_approx_equal(0.000f, llquat.mQ[1]) &&
  575. is_approx_equal(0.000f, llquat.mQ[2]) &&
  576. is_approx_equal(1.000f, llquat.mQ[3]));
  577. }
  578. }