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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file v4math_test.cpp
  3.  * @author Adroit
  4.  * @date 2007-03
  5.  * @brief v4math 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 "../m4math.h"
  40. #include "../v4math.h"
  41. namespace tut
  42. {
  43. struct v4math_data
  44. {
  45. };
  46. typedef test_group<v4math_data> v4math_test;
  47. typedef v4math_test::object v4math_object;
  48. tut::v4math_test v4math_testcase("v4math");
  49. template<> template<>
  50. void v4math_object::test<1>()
  51. {
  52. LLVector4 vec4;
  53. ensure("1:LLVector4:Fail to initialize " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (1.0f == vec4.mV[VW])));
  54. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  55. LLVector4 vec4a(x,y,z);
  56. ensure("2:LLVector4:Fail to initialize " ,((x == vec4a.mV[VX]) && (y == vec4a.mV[VY]) && (z == vec4a.mV[VZ])&& (1.0f == vec4a.mV[VW])));
  57. LLVector4 vec4b(x,y,z,w);
  58. ensure("3:LLVector4:Fail to initialize " ,((x == vec4b.mV[VX]) && (y == vec4b.mV[VY]) && (z == vec4b.mV[VZ])&& (w == vec4b.mV[VW])));
  59. const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f};
  60. LLVector4 vec4c(vec);
  61. ensure("4:LLVector4:Fail to initialize " ,((vec[0] == vec4c.mV[VX]) && (vec[1] == vec4c.mV[VY]) && (vec[2] == vec4c.mV[VZ])&& (vec[3] == vec4c.mV[VW])));
  62. LLVector3 vec3(-2.23f,1.01f,42.3f);
  63. LLVector4 vec4d(vec3);
  64. ensure("5:LLVector4:Fail to initialize " ,((vec3.mV[VX] == vec4d.mV[VX]) && (vec3.mV[VY] == vec4d.mV[VY]) && (vec3.mV[VZ] == vec4d.mV[VZ])&& (1.f == vec4d.mV[VW])));
  65. F32 w1 = -.234f;
  66. LLVector4 vec4e(vec3,w1);
  67. ensure("6:LLVector4:Fail to initialize " ,((vec3.mV[VX] == vec4e.mV[VX]) && (vec3.mV[VY] == vec4e.mV[VY]) && (vec3.mV[VZ] == vec4e.mV[VZ])&& (w1 == vec4e.mV[VW])));
  68. }
  69. template<> template<>
  70. void v4math_object::test<2>()
  71. {
  72. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  73. LLVector4 vec4;
  74. vec4.setVec(x,y,z);
  75. ensure("1:setVec:Fail to initialize " ,((x == vec4.mV[VX]) && (y == vec4.mV[VY]) && (z == vec4.mV[VZ])&& (1.0f == vec4.mV[VW])));
  76. vec4.clearVec();
  77. ensure("2:clearVec:Fail " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (1.0f == vec4.mV[VW])));
  78. vec4.setVec(x,y,z,w);
  79. ensure("3:setVec:Fail to initialize " ,((x == vec4.mV[VX]) && (y == vec4.mV[VY]) && (z == vec4.mV[VZ])&& (w == vec4.mV[VW])));
  80. vec4.zeroVec();
  81. ensure("4:zeroVec:Fail " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (0 == vec4.mV[VW])));
  82. LLVector3 vec3(-2.23f,1.01f,42.3f);
  83. vec4.clearVec();
  84. vec4.setVec(vec3);
  85. ensure("5:setVec:Fail to initialize " ,((vec3.mV[VX] == vec4.mV[VX]) && (vec3.mV[VY] == vec4.mV[VY]) && (vec3.mV[VZ] == vec4.mV[VZ])&& (1.f == vec4.mV[VW])));
  86. F32 w1 = -.234f;
  87. vec4.zeroVec();
  88. vec4.setVec(vec3,w1);
  89. ensure("6:setVec:Fail to initialize " ,((vec3.mV[VX] == vec4.mV[VX]) && (vec3.mV[VY] == vec4.mV[VY]) && (vec3.mV[VZ] == vec4.mV[VZ])&& (w1 == vec4.mV[VW])));
  90. const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f};
  91. LLVector4 vec4a;
  92. vec4a.setVec(vec);
  93. ensure("7:setVec:Fail to initialize " ,((vec[0] == vec4a.mV[VX]) && (vec[1] == vec4a.mV[VY]) && (vec[2] == vec4a.mV[VZ])&& (vec[3] == vec4a.mV[VW])));
  94. }
  95. template<> template<>
  96. void v4math_object::test<3>()
  97. {
  98. F32 x = 10.f, y = -2.3f, z = -.023f;
  99. LLVector4 vec4(x,y,z);
  100. ensure("magVec:Fail ", is_approx_equal(vec4.magVec(), fsqrtf(x*x + y*y + z*z)));
  101. ensure("magVecSquared:Fail ", is_approx_equal(vec4.magVecSquared(), (x*x + y*y + z*z)));
  102. }
  103. template<> template<>
  104. void v4math_object::test<4>()
  105. {
  106. F32 x = 10.f, y = -2.3f, z = -.023f;
  107. LLVector4 vec4(x,y,z);
  108. F32 mag = vec4.normVec();
  109. mag = 1.f/ mag;
  110. ensure("1:normVec: Fail " ,is_approx_equal(mag*x,vec4.mV[VX]) && is_approx_equal(mag*y, vec4.mV[VY])&& is_approx_equal(mag*z, vec4.mV[VZ]));
  111. x = 0.000000001f, y = 0.000000001f, z = 0.000000001f;
  112. vec4.clearVec();
  113. vec4.setVec(x,y,z);
  114. mag = vec4.normVec();
  115. ensure("2:normVec: Fail " ,is_approx_equal(mag*x,vec4.mV[VX]) && is_approx_equal(mag*y, vec4.mV[VY])&& is_approx_equal(mag*z, vec4.mV[VZ]));
  116. }
  117. template<> template<>
  118. void v4math_object::test<5>()
  119. {
  120. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  121. LLVector4 vec4(x,y,z,w);
  122. vec4.abs();
  123. ensure("abs:Fail " ,((x == vec4.mV[VX]) && (-y == vec4.mV[VY]) && (-z == vec4.mV[VZ])&& (-w == vec4.mV[VW])));
  124. vec4.clearVec();
  125. ensure("isExactlyClear:Fail " ,(TRUE == vec4.isExactlyClear()));
  126. vec4.zeroVec();
  127. ensure("isExactlyZero:Fail " ,(TRUE == vec4.isExactlyZero()));
  128. }
  129. template<> template<>
  130. void v4math_object::test<6>()
  131. {
  132. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  133. LLVector4 vec4(x,y,z,w),vec4a;
  134. vec4a = vec4.scaleVec(vec4);
  135. ensure("scaleVec:Fail " ,(is_approx_equal(x*x, vec4a.mV[VX]) && is_approx_equal(y*y, vec4a.mV[VY]) && is_approx_equal(z*z, vec4a.mV[VZ])&& is_approx_equal(w*w, vec4a.mV[VW])));
  136. }
  137. template<> template<>
  138. void v4math_object::test<7>()
  139. {
  140. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  141. LLVector4 vec4(x,y,z,w);
  142. ensure("1:operator [] failed " ,( x ==  vec4[0]));
  143. ensure("2:operator [] failed " ,( y ==  vec4[1]));
  144. ensure("3:operator [] failed " ,( z ==  vec4[2]));
  145. ensure("4:operator [] failed " ,( w ==  vec4[3]));
  146. x = 23.f, y = -.2361f, z = 3.25;
  147. vec4.setVec(x,y,z);
  148. F32 &ref1 = vec4[0];
  149. ensure("5:operator [] failed " ,( ref1 ==  vec4[0]));
  150. F32 &ref2 = vec4[1];
  151. ensure("6:operator [] failed " ,( ref2 ==  vec4[1]));
  152. F32 &ref3 = vec4[2];
  153. ensure("7:operator [] failed " ,( ref3 ==  vec4[2]));
  154. F32 &ref4 = vec4[3];
  155. ensure("8:operator [] failed " ,( ref4 ==  vec4[3]));
  156. }
  157. template<> template<>
  158. void v4math_object::test<8>()
  159. {
  160. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  161. const  F32 val[16] = {
  162.             1.f,  2.f,   3.f,    0.f,
  163.             .34f, .1f,   -.5f,   0.f,
  164.             2.f,  1.23f, 1.234f, 0.f,
  165.             .89f, 0.f,   0.f,    0.f
  166.         };
  167. LLMatrix4 mat(val);
  168. LLVector4 vec4(x,y,z,w),vec4a;
  169. vec4.rotVec(mat);
  170. vec4a.setVec(x,y,z,w);
  171. vec4a.rotVec(mat);
  172. ensure_equals("1:rotVec: Fail " ,vec4a, vec4);
  173. F32 a = 2.32f, b = -23.2f, c = -34.1112f, d = 1.010112f;
  174. LLQuaternion q(a,b,c,d);
  175. LLVector4 vec4b(a,b,c,d),vec4c;
  176. vec4b.rotVec(q);
  177. vec4c.setVec(a, b, c, d);
  178. vec4c.rotVec(q);
  179. ensure_equals("2:rotVec: Fail " ,vec4b, vec4c);
  180. }
  181. template<> template<>
  182. void v4math_object::test<9>()
  183. {
  184. F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
  185. LLVector4 vec4(x,y,z,w),vec4a;;
  186. std::ostringstream stream1, stream2;
  187. stream1 << vec4;
  188. vec4a.setVec(x,y,z,w);
  189. stream2 << vec4a;
  190. ensure("operator << failed",(stream1.str() == stream2.str()));
  191. }
  192. template<> template<>
  193. void v4math_object::test<10>()
  194. {
  195. F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f, w1 = .23f;
  196. F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f, w2 = 1.3f;
  197. LLVector4 vec4(x1,y1,z1,w1),vec4a(x2,y2,z2,w2),vec4b;
  198. vec4b = vec4a + vec4;
  199. ensure("1:operator+:Fail to initialize " ,(is_approx_equal(x1+x2,vec4b.mV[VX]) && is_approx_equal(y1+y2,vec4b.mV[VY]) && is_approx_equal(z1+z2,vec4b.mV[VZ])));
  200. x1 = -2.45f, y1 = 2.1f, z1 = 3.0f;
  201. vec4.clearVec();
  202. vec4a.clearVec();
  203. vec4.setVec(x1,y1,z1);
  204. vec4a +=vec4;
  205. ensure_equals("2:operator+=: Fail to initialize", vec4a,vec4);
  206. vec4a += vec4;
  207. ensure("3:operator+=:Fail to initialize " ,(is_approx_equal(2*x1,vec4a.mV[VX]) && is_approx_equal(2*y1,vec4a.mV[VY]) && is_approx_equal(2*z1,vec4a.mV[VZ])));
  208. }
  209. template<> template<>
  210. void v4math_object::test<11>()
  211. {
  212. F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f, w1 = .23f;
  213. F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f, w2 = 1.3f;
  214. LLVector4 vec4(x1,y1,z1,w1),vec4a(x2,y2,z2,w2),vec4b;
  215. vec4b = vec4a - vec4;
  216. ensure("1:operator-:Fail to initialize " ,(is_approx_equal(x2-x1,vec4b.mV[VX]) && is_approx_equal(y2-y1,vec4b.mV[VY]) && is_approx_equal(z2-z1,vec4b.mV[VZ])));
  217. x1 = -2.45f, y1 = 2.1f, z1 = 3.0f;
  218. vec4.clearVec();
  219. vec4a.clearVec();
  220. vec4.setVec(x1,y1,z1);
  221. vec4a -=vec4;
  222. ensure_equals("2:operator-=: Fail to initialize" , vec4a,-vec4);
  223. vec4a -=vec4;
  224. ensure("3:operator-=:Fail to initialize " ,(is_approx_equal(-2*x1,vec4a.mV[VX]) && is_approx_equal(-2*y1,vec4a.mV[VY]) && is_approx_equal(-2*z1,vec4a.mV[VZ])));
  225. }
  226. template<> template<>
  227. void v4math_object::test<12>()
  228. {
  229. F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f;
  230. F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f;
  231. LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2);
  232. F32 res = vec4 * vec4a;
  233. ensure("1:operator* failed " ,is_approx_equal(res, x1*x2 + y1*y2 + z1*z2));
  234. vec4a.clearVec();
  235. F32 mulVal = 4.2f;
  236. vec4a = vec4 * mulVal;
  237. ensure("2:operator* failed " ,is_approx_equal(x1*mulVal,vec4a.mV[VX]) && is_approx_equal(y1*mulVal, vec4a.mV[VY])&& is_approx_equal(z1*mulVal, vec4a.mV[VZ]));
  238. vec4a.clearVec();
  239. vec4a = mulVal *  vec4 ;
  240. ensure("3:operator* failed " ,is_approx_equal(x1*mulVal, vec4a.mV[VX]) && is_approx_equal(y1*mulVal, vec4a.mV[VY])&& is_approx_equal(z1*mulVal, vec4a.mV[VZ]));
  241. vec4 *= mulVal;
  242. ensure("4:operator*= failed " ,is_approx_equal(x1*mulVal, vec4.mV[VX]) && is_approx_equal(y1*mulVal, vec4.mV[VY])&& is_approx_equal(z1*mulVal, vec4.mV[VZ]));
  243. }
  244. template<> template<>
  245. void v4math_object::test<13>()
  246. {
  247. F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f;
  248. F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f;
  249. LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2),vec4b;
  250. vec4b = vec4 % vec4a;
  251. ensure("1:operator% failed " ,is_approx_equal(y1*z2 - y2*z1, vec4b.mV[VX]) && is_approx_equal(z1*x2 -z2*x1, vec4b.mV[VY]) && is_approx_equal(x1*y2-x2*y1, vec4b.mV[VZ])); 
  252. vec4 %= vec4a;
  253. ensure_equals("operator%= failed " ,vec4,vec4b); 
  254. }
  255. template<> template<>
  256. void v4math_object::test<14>()
  257. {
  258. F32 x = 1.f, y = 2.f, z = -1.1f,div = 4.2f;
  259. F32 t = 1.f / div;
  260. LLVector4 vec4(x,y,z), vec4a;
  261. vec4a = vec4/div;
  262. ensure("1:operator/ failed " ,is_approx_equal(x*t, vec4a.mV[VX]) && is_approx_equal(y*t, vec4a.mV[VY])&& is_approx_equal(z*t, vec4a.mV[VZ]));
  263. x = 1.23f, y = 4.f, z = -2.32f;
  264. vec4.clearVec();
  265. vec4a.clearVec();
  266. vec4.setVec(x,y,z);
  267. vec4a = vec4/div;
  268. ensure("2:operator/ failed " ,is_approx_equal(x*t, vec4a.mV[VX]) && is_approx_equal(y*t, vec4a.mV[VY])&& is_approx_equal(z*t, vec4a.mV[VZ]));
  269. vec4 /= div;
  270. ensure("3:operator/ failed " ,is_approx_equal(x*t, vec4.mV[VX]) && is_approx_equal(y*t, vec4.mV[VY])&& is_approx_equal(z*t, vec4.mV[VZ]));
  271. }
  272. template<> template<>
  273. void v4math_object::test<15>()
  274. {
  275. F32 x = 1.f, y = 2.f, z = -1.1f;
  276. LLVector4 vec4(x,y,z), vec4a;
  277. ensure("operator!= failed " ,(vec4 != vec4a));
  278. vec4a = vec4;
  279. ensure("operator== failed " ,(vec4 ==vec4a)); 
  280. }
  281. template<> template<>
  282. void v4math_object::test<16>()
  283. {
  284. F32 x = 1.f, y = 2.f, z = -1.1f;
  285. LLVector4 vec4(x,y,z), vec4a;
  286. vec4a = - vec4;
  287. ensure("operator- failed " , (vec4 == - vec4a));
  288. }
  289. template<> template<>
  290. void v4math_object::test<17>()
  291. {
  292. F32 x = 1.f, y = 2.f, z = -1.1f,epsilon = .23425f;
  293. LLVector4 vec4(x,y,z), vec4a(x,y,z);
  294. ensure("1:are_parallel: Fail " ,(TRUE == are_parallel(vec4a,vec4,epsilon)));
  295. x = 21.f, y = 12.f, z = -123.1f;
  296. vec4a.clearVec();
  297. vec4a.setVec(x,y,z);
  298. ensure("2:are_parallel: Fail " ,(FALSE == are_parallel(vec4a,vec4,epsilon)));
  299. }
  300. template<> template<>
  301. void v4math_object::test<18>()
  302. {
  303. F32 x = 1.f, y = 2.f, z = -1.1f;
  304. F32 angle1, angle2;
  305. LLVector4 vec4(x,y,z), vec4a(x,y,z);
  306. angle1 = angle_between(vec4, vec4a);
  307. vec4.normVec();
  308. vec4a.normVec();
  309. angle2 = acos(vec4 * vec4a);
  310. ensure_approximately_equals("1:angle_between: Fail " ,angle1,angle2,8);
  311. F32 x1 = 21.f, y1 = 2.23f, z1 = -1.1f;
  312. LLVector4 vec4b(x,y,z), vec4c(x1,y1,z1);
  313. angle1 = angle_between(vec4b, vec4c);
  314. vec4b.normVec();
  315. vec4c.normVec();
  316. angle2 = acos(vec4b * vec4c);
  317. ensure_approximately_equals("2:angle_between: Fail " ,angle1,angle2,8);
  318. }
  319. template<> template<>
  320. void v4math_object::test<19>()
  321. {
  322. F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.f, z2 = 1.f;
  323. F32 val1,val2;
  324. LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2);
  325. val1 = dist_vec(vec4,vec4a);
  326. val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
  327. ensure_equals("dist_vec: Fail ",val2, val1);
  328. val1 = dist_vec_squared(vec4,vec4a);
  329. val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
  330. ensure_equals("dist_vec_squared: Fail ",val2, val1);
  331. }
  332. template<> template<>
  333. void v4math_object::test<20>()
  334. {
  335. F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, w1 = -.23f, x2 = 1.3f, y2 = 1.f, z2 = 1.f,w2 = .12f;
  336. F32 val = 2.3f,val1,val2,val3,val4;
  337. LLVector4 vec4(x1,y1,z1,w1),vec4a(x2,y2,z2,w2);
  338. val1 = x1 + (x2 - x1)* val;
  339. val2 = y1 + (y2 - y1)* val;
  340. val3 = z1 + (z2 - z1)* val;
  341. val4 = w1 + (w2 - w1)* val;
  342. LLVector4 vec4b = lerp(vec4,vec4a,val);
  343. ensure("lerp failed", ((val1 ==vec4b.mV[VX])&& (val2 ==vec4b.mV[VY]) && (val3 ==vec4b.mV[VZ])&& (val4 ==vec4b.mV[VW])));
  344. }
  345. template<> template<>
  346. void v4math_object::test<21>()
  347. {
  348. F32 x = 1.f, y = 2.f, z = -1.1f;
  349. LLVector4 vec4(x,y,z);
  350. LLVector3 vec3 = vec4to3(vec4);
  351. ensure("vec4to3 failed", ((x == vec3.mV[VX])&& (y == vec3.mV[VY]) && (z == vec3.mV[VZ])));
  352. LLVector4 vec4a = vec3to4(vec3);
  353. ensure_equals("vec3to4 failed",vec4a,vec4);
  354. }
  355. template<> template<>
  356. void v4math_object::test<22>()
  357. {
  358. F32 x = 1.f, y = 2.f, z = -1.1f;
  359. LLVector4 vec4(x,y,z);
  360. LLSD llsd = vec4.getValue();
  361. LLVector3 vec3(llsd);
  362. LLVector4 vec4a = vec3to4(vec3);
  363. ensure_equals("getValue failed",vec4a,vec4);
  364. }
  365. }