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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file v3math_test.cpp
  3.  * @author Adroit
  4.  * @date 2007-02
  5.  * @brief v3math test cases.
  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.  
  35. #include "linden_common.h"
  36. #include "../test/lltut.h"
  37. #include "llsd.h"
  38. #include "../llquaternion.h"
  39. #include "../llquantize.h"
  40. #include "../v3dmath.h"
  41. #include "../m3math.h"
  42. #include "../v4math.h"
  43. #include "../v3math.h"
  44. namespace tut
  45. {
  46. struct v3math_data
  47. {
  48. };
  49. typedef test_group<v3math_data> v3math_test;
  50. typedef v3math_test::object v3math_object;
  51. tut::v3math_test v3math_testcase("v3math");
  52. template<> template<>
  53. void v3math_object::test<1>()
  54. {
  55. LLVector3 vec3;
  56. ensure("1:LLVector3:Fail to initialize ", ((0.f == vec3.mV[VX]) && (0.f == vec3.mV[VY]) && (0.f == vec3.mV[VZ])));
  57. F32 x = 2.32f, y = 1.212f, z = -.12f;
  58. LLVector3 vec3a(x,y,z);
  59. ensure("2:LLVector3:Fail to initialize ", ((2.32f == vec3a.mV[VX]) && (1.212f == vec3a.mV[VY]) && (-.12f == vec3a.mV[VZ])));
  60. const F32 vec[3] = {1.2f ,3.2f, -4.2f};
  61. LLVector3 vec3b(vec);
  62. ensure("3:LLVector3:Fail to initialize ", ((1.2f == vec3b.mV[VX]) && (3.2f == vec3b.mV[VY]) && (-4.2f == vec3b.mV[VZ])));
  63. }
  64. template<> template<>
  65. void v3math_object::test<2>()
  66. {
  67. F32 x = 2.32f, y = 1.212f, z = -.12f;
  68. LLVector3 vec3(x,y,z);
  69. LLVector3d vector3d(vec3);
  70. LLVector3 vec3a(vector3d);
  71. ensure("1:LLVector3:Fail to initialize ", vec3 == vec3a);
  72. LLVector4 vector4(vec3);
  73. LLVector3 vec3b(vector4);
  74. ensure("2:LLVector3:Fail to initialize ", vec3 == vec3b);
  75. }
  76. template<> template<>
  77. void v3math_object::test<3>()
  78. {
  79. S32 a = 231;
  80. LLSD llsd(a);
  81. LLVector3 vec3(llsd);
  82. LLSD sd = vec3.getValue();
  83. LLVector3 vec3a(sd);
  84. ensure("1:LLVector3:Fail to initialize ", (vec3 == vec3a));
  85. }
  86. template<> template<>
  87. void v3math_object::test<4>()
  88. {
  89. S32 a = 231;
  90. LLSD llsd(a);
  91. LLVector3 vec3(llsd),vec3a;
  92. vec3a = vec3;
  93. ensure("1:Operator= Fail to initialize " ,(vec3 == vec3a));
  94. }
  95. template<> template<>
  96. void v3math_object::test<5>()
  97. {
  98. F32 x = 2.32f, y = 1.212f, z = -.12f;
  99. LLVector3 vec3(x,y,z);
  100. ensure("1:isFinite= Fail to initialize ", (TRUE == vec3.isFinite()));//need more test cases:
  101. vec3.clearVec();
  102. ensure("2:clearVec:Fail to set values ", ((0.f == vec3.mV[VX]) && (0.f == vec3.mV[VY]) && (0.f == vec3.mV[VZ])));
  103. vec3.setVec(x,y,z);
  104. ensure("3:setVec:Fail to set values ", ((2.32f == vec3.mV[VX]) && (1.212f == vec3.mV[VY]) && (-.12f == vec3.mV[VZ])));
  105. vec3.zeroVec();
  106. ensure("4:zeroVec:Fail to set values ", ((0.f == vec3.mV[VX]) && (0.f == vec3.mV[VY]) && (0.f == vec3.mV[VZ])));
  107. }
  108. template<> template<>
  109. void v3math_object::test<6>()
  110. {
  111. F32 x = 2.32f, y = 1.212f, z = -.12f;
  112. LLVector3 vec3(x,y,z),vec3a;
  113. vec3.abs();
  114. ensure("1:abs:Fail ", ((x == vec3.mV[VX]) && (y == vec3.mV[VY]) && (-z == vec3.mV[VZ])));
  115. vec3a.setVec(vec3);
  116. ensure("2:setVec:Fail to initialize ", (vec3a == vec3));
  117. const F32 vec[3] = {1.2f ,3.2f, -4.2f};
  118. vec3.clearVec();
  119. vec3.setVec(vec);
  120. ensure("3:setVec:Fail to initialize ", ((1.2f == vec3.mV[VX]) && (3.2f == vec3.mV[VY]) && (-4.2f == vec3.mV[VZ])));
  121. vec3a.clearVec();
  122. LLVector3d vector3d(vec3);
  123. vec3a.setVec(vector3d);
  124. ensure("4:setVec:Fail to initialize ", (vec3 == vec3a));
  125. LLVector4 vector4(vec3);
  126. vec3a.clearVec();
  127. vec3a.setVec(vector4);
  128. ensure("5:setVec:Fail to initialize ", (vec3 == vec3a));
  129. }
  130. template<> template<>
  131. void v3math_object::test<7>()
  132. {
  133. F32 x = 2.32f, y = 3.212f, z = -.12f;
  134. F32 min = 0.0001f, max = 3.0f;
  135. LLVector3 vec3(x,y,z);
  136. ensure("1:clamp:Fail  ", TRUE == vec3.clamp(min, max) && x == vec3.mV[VX] && max == vec3.mV[VY] && min == vec3.mV[VZ]);
  137. x = 1.f, y = 2.2f, z = 2.8f;
  138. vec3.setVec(x,y,z);
  139. ensure("2:clamp:Fail  ", FALSE == vec3.clamp(min, max));
  140. }
  141. template<> template<>
  142. void v3math_object::test<8>()
  143. {
  144. F32 x = 2.32f, y = 1.212f, z = -.12f;
  145. LLVector3 vec3(x,y,z);
  146. ensure("1:magVecSquared:Fail ", is_approx_equal(vec3.magVecSquared(), (x*x + y*y + z*z)));
  147. ensure("2:magVec:Fail ", is_approx_equal(vec3.magVec(), fsqrtf(x*x + y*y + z*z)));
  148. }
  149. template<> template<>
  150. void v3math_object::test<9>()
  151. {
  152. F32 x =-2.0f, y = -3.0f, z = 1.23f ;
  153. LLVector3 vec3(x,y,z);
  154. ensure("1:abs():Fail ", (TRUE == vec3.abs()));
  155. ensure("2:isNull():Fail", (FALSE == vec3.isNull())); //Returns TRUE if vector has a _very_small_ length
  156. x =.00000001f, y = .000001001f, z = .000001001f;
  157. vec3.setVec(x,y,z);
  158. ensure("3:isNull(): Fail ", (TRUE == vec3.isNull()));
  159. }
  160. template<> template<>
  161. void v3math_object::test<10>()
  162. {
  163. F32 x =-2.0f, y = -3.0f, z = 1.f ;
  164. LLVector3 vec3(x,y,z),vec3a;
  165. ensure("1:isExactlyZero():Fail ", (TRUE == vec3a.isExactlyZero()));
  166. vec3a = vec3a.scaleVec(vec3);
  167. ensure("2:scaleVec: Fail ", vec3a.mV[VX] == 0.f && vec3a.mV[VY] == 0.f && vec3a.mV[VZ] == 0.f);
  168. vec3a.setVec(x,y,z);
  169. vec3a = vec3a.scaleVec(vec3);
  170. ensure("3:scaleVec: Fail ", ((4 == vec3a.mV[VX]) && (9 == vec3a.mV[VY]) &&(1 == vec3a.mV[VZ])));
  171. ensure("4:isExactlyZero():Fail ", (FALSE == vec3.isExactlyZero()));
  172. }
  173. template<> template<>
  174. void v3math_object::test<11>()
  175. {
  176. F32 x =20.0f, y = 30.0f, z = 15.f ;
  177. F32 angle = 100.f;
  178. LLVector3 vec3(x,y,z),vec3a(1.f,2.f,3.f);
  179. vec3a = vec3a.rotVec(angle, vec3);
  180. LLVector3 vec3b(1.f,2.f,3.f);
  181. vec3b = vec3b.rotVec(angle, vec3);
  182. ensure_equals("rotVec():Fail" ,vec3b,vec3a);
  183. }
  184. template<> template<>
  185. void v3math_object::test<12>()
  186. {
  187. F32 x =-2.0f, y = -3.0f, z = 1.f ;
  188. LLVector3 vec3(x,y,z);
  189. ensure("1:operator [] failed",( x ==  vec3[0]));
  190. ensure("2:operator [] failed",( y ==  vec3[1]));
  191. ensure("3:operator [] failed",( z ==  vec3[2]));
  192. vec3.clearVec();
  193. x = 23.f, y = -.2361f, z = 3.25;
  194. vec3.setVec(x,y,z);
  195. F32 &ref1 = vec3[0];
  196. ensure("4:operator [] failed",( ref1 ==  vec3[0]));
  197. F32 &ref2 = vec3[1];
  198. ensure("5:operator [] failed",( ref2 ==  vec3[1]));
  199. F32 &ref3 = vec3[2];
  200. ensure("6:operator [] failed",( ref3 ==  vec3[2]));
  201. }
  202. template<> template<>
  203. void v3math_object::test<13>()
  204. {
  205. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f;
  206. F32 val1, val2, val3;
  207. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2), vec3b;
  208. vec3b = vec3 + vec3a ;
  209. val1 = x1+x2;
  210. val2 = y1+y2;
  211. val3 = z1+z2;
  212. ensure("1:operator+ failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ])); 
  213. vec3.clearVec();
  214. vec3a.clearVec();
  215. vec3b.clearVec();
  216. x1 = -.235f, y1 = -24.32f,z1 = 2.13f,  x2 = -2.3f, y2 = 1.f, z2 = 34.21f;
  217. vec3.setVec(x1,y1,z1);
  218. vec3a.setVec(x2,y2,z2);
  219. vec3b = vec3 + vec3a;
  220. val1 = x1+x2;
  221. val2 = y1+y2;
  222. val3 = z1+z2;
  223. ensure("2:operator+ failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ])); 
  224. }
  225. template<> template<>
  226. void v3math_object::test<14>()
  227. {
  228. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f;
  229. F32 val1, val2, val3;
  230. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2), vec3b;
  231. vec3b = vec3 - vec3a ;
  232. val1 = x1-x2;
  233. val2 = y1-y2;
  234. val3 = z1-z2;
  235. ensure("1:operator- failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ])); 
  236. vec3.clearVec();
  237. vec3a.clearVec();
  238. vec3b.clearVec();
  239. x1 = -.235f, y1 = -24.32f,z1 = 2.13f,  x2 = -2.3f, y2 = 1.f, z2 = 34.21f;
  240. vec3.setVec(x1,y1,z1);
  241. vec3a.setVec(x2,y2,z2);
  242. vec3b = vec3 - vec3a;
  243. val1 = x1-x2;
  244. val2 = y1-y2;
  245. val3 = z1-z2;
  246. ensure("2:operator- failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ])); 
  247. }
  248. template<> template<>
  249. void v3math_object::test<15>()
  250. {
  251. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f;
  252. F32 val1, val2, val3;
  253. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2);
  254. val1 = vec3 * vec3a;
  255. val2 = x1*x2 + y1*y2 + z1*z2;
  256. ensure_equals("1:operator* failed",val1,val2);
  257. vec3a.clearVec();
  258. F32 mulVal = 4.332f;
  259. vec3a = vec3 * mulVal;
  260. val1 = x1*mulVal;
  261. val2 = y1*mulVal;
  262. val3 = z1*mulVal;
  263. ensure("2:operator* failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ]));
  264. vec3a.clearVec();
  265. vec3a = mulVal * vec3;
  266. ensure("3:operator* failed ", (val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ]));
  267. }
  268. template<> template<>
  269. void v3math_object::test<16>()
  270. {
  271. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f;
  272. F32 val1, val2, val3;
  273. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2), vec3b;
  274. vec3b = vec3 % vec3a ;
  275. val1 = y1*z2 - y2*z1;
  276. val2 = z1*x2 -z2*x1;
  277. val3 = x1*y2-x2*y1;
  278. ensure("1:operator% failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ])); 
  279. vec3.clearVec();
  280. vec3a.clearVec();
  281. vec3b.clearVec();
  282. x1 =112.f, y1 = 22.3f,z1 = 1.2f, x2 = -2.3f, y2 = 341.11f, z2 = 1234.234f;
  283. vec3.setVec(x1,y1,z1);
  284. vec3a.setVec(x2,y2,z2);
  285. vec3b = vec3 % vec3a ;
  286. val1 = y1*z2 - y2*z1;
  287. val2 = z1*x2 -z2*x1;
  288. val3 = x1*y2-x2*y1;
  289. ensure("2:operator% failed ", (val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ])); 
  290. }
  291. template<> template<>
  292. void v3math_object::test<17>()
  293. {
  294. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, div = 3.2f;
  295. F32 t = 1.f / div, val1, val2, val3;
  296. LLVector3 vec3(x1,y1,z1), vec3a;
  297. vec3a = vec3 / div;
  298. val1 = x1 * t;
  299. val2 = y1 * t;
  300. val3 = z1 *t;
  301. ensure("1:operator/ failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY]) && (val3 == vec3a.mV[VZ]));
  302. vec3a.clearVec();
  303. x1 = -.235f, y1 = -24.32f, z1 = .342f, div = -2.2f;
  304. t = 1.f / div;
  305. vec3.setVec(x1,y1,z1);
  306. vec3a = vec3 / div;
  307. val1 = x1 * t;
  308. val2 = y1 * t;
  309. val3 = z1 *t;
  310. ensure("2:operator/ failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY]) && (val3 == vec3a.mV[VZ]));
  311. }
  312. template<> template<>
  313. void v3math_object::test<18>()
  314. {
  315. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f;
  316. LLVector3 vec3(x1,y1,z1), vec3a(x1,y1,z1);
  317. ensure("1:operator== failed",(vec3 == vec3a));
  318. vec3a.clearVec();
  319. x1 = -.235f, y1 = -24.32f, z1 = .342f;
  320. vec3.clearVec();
  321. vec3a.clearVec();
  322. vec3.setVec(x1,y1,z1);
  323. vec3a.setVec(x1,y1,z1);
  324. ensure("2:operator== failed ", (vec3 == vec3a));
  325. }
  326. template<> template<>
  327. void v3math_object::test<19>()
  328. {
  329. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 =112.f, y2 = 2.234f,z2 = 11.2f;;
  330. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2);
  331. ensure("1:operator!= failed",(vec3a != vec3));
  332. vec3.clearVec();
  333. vec3.clearVec();
  334. vec3a.setVec(vec3);
  335. ensure("2:operator!= failed", ( FALSE == (vec3a != vec3)));
  336. }
  337. template<> template<>
  338. void v3math_object::test<20>()
  339. {
  340. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 =112.f, y2 = 2.2f,z2 = 11.2f;;
  341. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2);
  342. vec3a += vec3;
  343. F32 val1, val2, val3;
  344. val1 = x1+x2;
  345. val2 = y1+y2;
  346. val3 = z1+z2;
  347. ensure("1:operator+= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ]));
  348. }
  349. template<> template<>
  350. void v3math_object::test<21>()
  351. {
  352. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 =112.f, y2 = 2.2f,z2 = 11.2f;;
  353. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2);
  354. vec3a -= vec3;
  355. F32 val1, val2, val3;
  356. val1 = x2-x1;
  357. val2 = y2-y1;
  358. val3 = z2-z1;
  359. ensure("1:operator-= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ]));
  360. }
  361. template<> template<>
  362. void v3math_object::test<22>()
  363. {
  364. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f;
  365. F32 val1,val2,val3;
  366. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2);
  367. vec3a *= vec3;
  368. val1 = x1*x2;
  369. val2 = y1*y2;
  370. val3 = z1*z2;
  371. ensure("1:operator*= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ]));
  372. F32 mulVal = 4.332f;
  373. vec3 *=mulVal;
  374. val1 = x1*mulVal;
  375. val2 = y1*mulVal;
  376. val3 = z1*mulVal;
  377. ensure("2:operator*= failed ", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]) && is_approx_equal(val3, vec3.mV[VZ]));
  378. }
  379. template<> template<>
  380. void v3math_object::test<23>()
  381. {
  382. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f;
  383. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2),vec3b;
  384. vec3b = vec3a % vec3;
  385. vec3a %= vec3;
  386. ensure_equals("1:operator%= failed",vec3a,vec3b); 
  387. }
  388. template<> template<>
  389. void v3math_object::test<24>()
  390. {
  391. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, div = 3.2f;
  392. F32 t = 1.f / div, val1, val2, val3;
  393. LLVector3 vec3a(x1,y1,z1);
  394. vec3a /= div;
  395. val1 = x1 * t;
  396. val2 = y1 * t;
  397. val3 = z1 *t;
  398. ensure("1:operator/= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY]) && (val3 == vec3a.mV[VZ]));
  399. }
  400. template<> template<>
  401. void v3math_object::test<25>()
  402. {
  403. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f;
  404. LLVector3 vec3(x1,y1,z1), vec3a;
  405. vec3a = -vec3;
  406. ensure("1:operator- failed",(-vec3a == vec3));
  407. }
  408. template<> template<>
  409. void v3math_object::test<26>()
  410. {
  411. F32 x1 =1.f, y1 = 2.f,z1 = 1.2f;
  412. std::ostringstream stream1, stream2;
  413. LLVector3 vec3(x1,y1,z1), vec3a;
  414. stream1 << vec3;
  415. vec3a.setVec(x1,y1,z1);
  416. stream2 << vec3a;
  417. ensure("1:operator << failed",(stream1.str() == stream2.str()));
  418. }
  419. template<> template<>
  420. void v3math_object::test<27>()
  421. {
  422. F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.11f, z2 = 1234.234f;
  423. LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2);
  424. ensure("1:operator< failed", (TRUE == (vec3 < vec3a)));
  425. x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 2.f, z2 = 1234.234f;
  426. vec3.setVec(x1,y1,z1);
  427. vec3a.setVec(x2,y2,z2);
  428. ensure("2:operator< failed ", (TRUE == (vec3 < vec3a)));
  429. x1 =2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f,
  430. vec3.setVec(x1,y1,z1);
  431. vec3a.setVec(x2,y2,z2);
  432. ensure("3:operator< failed ", (FALSE == (vec3 < vec3a)));
  433. }
  434. template<> template<>
  435. void v3math_object::test<28>()
  436. {
  437. F32 x1 =1.23f, y1 = 2.f,z1 = 4.f;
  438. std::string buf("1.23 2. 4");
  439. LLVector3 vec3, vec3a(x1,y1,z1);
  440. LLVector3::parseVector3(buf, &vec3);
  441. ensure_equals("1:parseVector3 failed", vec3, vec3a);
  442. }
  443. template<> template<>
  444. void v3math_object::test<29>()
  445. {
  446. F32 x1 =1.f, y1 = 2.f,z1 = 4.f;
  447. LLVector3 vec3(x1,y1,z1),vec3a,vec3b;
  448. vec3a.setVec(1,1,1);
  449. vec3a.scaleVec(vec3);
  450. ensure_equals("1:scaleVec failed", vec3, vec3a);
  451. vec3a.clearVec();
  452. vec3a.setVec(x1,y1,z1);
  453. vec3a.scaleVec(vec3);
  454. ensure("2:scaleVec failed", ((1.f ==vec3a.mV[VX])&& (4.f ==vec3a.mV[VY]) && (16.f ==vec3a.mV[VZ])));
  455. }
  456. template<> template<>
  457. void v3math_object::test<30>()
  458. {
  459. F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.11f, z2 = 1234.234f;
  460. F32 val = 2.3f,val1,val2,val3;
  461. val1 = x1 + (x2 - x1)* val;
  462. val2 = y1 + (y2 - y1)* val;
  463. val3 = z1 + (z2 - z1)* val;
  464. LLVector3 vec3(x1,y1,z1),vec3a(x2,y2,z2);
  465. LLVector3 vec3b = lerp(vec3,vec3a,val);
  466. ensure("1:lerp failed", ((val1 ==vec3b.mV[VX])&& (val2 ==vec3b.mV[VY]) && (val3 ==vec3b.mV[VZ])));
  467. }
  468. template<> template<>
  469. void v3math_object::test<31>()
  470. {
  471. F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.f, z2 = 1.f;
  472. F32 val1,val2;
  473. LLVector3 vec3(x1,y1,z1),vec3a(x2,y2,z2);
  474. val1 = dist_vec(vec3,vec3a);
  475. val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
  476. ensure_equals("1:dist_vec: Fail ",val2, val1);
  477. val1 = dist_vec_squared(vec3,vec3a);
  478. val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
  479. ensure_equals("2:dist_vec_squared: Fail ",val2, val1);
  480. val1 = dist_vec_squared2D(vec3, vec3a);
  481. val2 =(x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2);
  482. ensure_equals("3:dist_vec_squared2D: Fail ",val2, val1);
  483. }
  484. template<> template<>
  485. void v3math_object::test<32>()
  486. {
  487. F32 x =12.3524f, y = -342.f,z = 4.126341f;
  488. LLVector3 vec3(x,y,z);
  489. F32 mag = vec3.normVec();
  490. mag = 1.f/ mag;
  491. F32 val1 = x* mag, val2 = y* mag, val3 = z* mag;
  492. ensure("1:normVec: Fail ", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]) && is_approx_equal(val3, vec3.mV[VZ]));
  493. x = 0.000000001f, y = 0.f, z = 0.f;
  494. vec3.clearVec();
  495. vec3.setVec(x,y,z);
  496. mag = vec3.normVec();
  497. val1 = x* mag, val2 = y* mag, val3 = z* mag;
  498. ensure("2:normVec: Fail ", (mag == 0.) && (0. == vec3.mV[VX]) && (0. == vec3.mV[VY])&& (0. == vec3.mV[VZ]));
  499. }
  500. template<> template<>
  501. void v3math_object::test<33>()
  502. {
  503. F32 x = -202.23412f, y = 123.2312f, z = -89.f;
  504. LLVector3 vec(x,y,z);
  505. vec.snap(2);
  506. ensure("1:snap: Fail ", is_approx_equal(-202.23f, vec.mV[VX]) && is_approx_equal(123.23f, vec.mV[VY]) && is_approx_equal(-89.f, vec.mV[VZ]));
  507. }
  508. template<> template<>
  509. void v3math_object::test<34>()
  510. {
  511. F32 x = 10.f, y = 20.f, z = -15.f;
  512. F32 x1, y1, z1;
  513. F32 lowerxy = 0.f, upperxy = 1.0f, lowerz = -1.0f, upperz = 1.f;
  514. LLVector3 vec3(x,y,z);
  515. vec3.quantize16(lowerxy,upperxy,lowerz,upperz);
  516. x1 = U16_to_F32(F32_to_U16(x, lowerxy, upperxy), lowerxy, upperxy);
  517. y1 = U16_to_F32(F32_to_U16(y, lowerxy, upperxy), lowerxy, upperxy);
  518. z1 = U16_to_F32(F32_to_U16(z, lowerz,  upperz),  lowerz,  upperz);
  519. ensure("1:quantize16: Fail ", is_approx_equal(x1, vec3.mV[VX]) && is_approx_equal(y1, vec3.mV[VY]) && is_approx_equal(z1, vec3.mV[VZ]));
  520. LLVector3 vec3a(x,y,z);
  521. vec3a.quantize8(lowerxy,upperxy,lowerz,upperz);
  522. x1 = U8_to_F32(F32_to_U8(x, lowerxy, upperxy), lowerxy, upperxy);
  523. y1 = U8_to_F32(F32_to_U8(y, lowerxy, upperxy), lowerxy, upperxy);
  524. z1 = U8_to_F32(F32_to_U8(z, lowerz, upperz), lowerz, upperz);
  525. ensure("2:quantize8: Fail ", is_approx_equal(x1, vec3a.mV[VX]) && is_approx_equal(y1, vec3a.mV[VY]) && is_approx_equal(z1, vec3a.mV[VZ]));
  526. }
  527. }