00001
00034 #include <tut/tut.h>
00035 #include "linden_common.h"
00036 #include "lltut.h"
00037 #include "llquaternion.h"
00038 #include "llsd.h"
00039 #include "m4math.h"
00040 #include "v4math.h"
00041
00042 namespace tut
00043 {
00044 struct v4math_data
00045 {
00046 };
00047 typedef test_group<v4math_data> v4math_test;
00048 typedef v4math_test::object v4math_object;
00049 tut::v4math_test v4math_testcase("v4math");
00050
00051 template<> template<>
00052 void v4math_object::test<1>()
00053 {
00054 LLVector4 vec4;
00055 ensure("1:LLVector4:Fail to initialize " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (1.0f == vec4.mV[VW])));
00056 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00057 LLVector4 vec4a(x,y,z);
00058 ensure("2:LLVector4:Fail to initialize " ,((x == vec4a.mV[VX]) && (y == vec4a.mV[VY]) && (z == vec4a.mV[VZ])&& (1.0f == vec4a.mV[VW])));
00059 LLVector4 vec4b(x,y,z,w);
00060 ensure("3:LLVector4:Fail to initialize " ,((x == vec4b.mV[VX]) && (y == vec4b.mV[VY]) && (z == vec4b.mV[VZ])&& (w == vec4b.mV[VW])));
00061 const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f};
00062 LLVector4 vec4c(vec);
00063 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])));
00064 LLVector3 vec3(-2.23f,1.01f,42.3f);
00065 LLVector4 vec4d(vec3);
00066 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])));
00067 F32 w1 = -.234f;
00068 LLVector4 vec4e(vec3,w1);
00069 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])));
00070 }
00071
00072 template<> template<>
00073 void v4math_object::test<2>()
00074 {
00075 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00076 LLVector4 vec4;
00077 vec4.setVec(x,y,z);
00078 ensure("1:setVec:Fail to initialize " ,((x == vec4.mV[VX]) && (y == vec4.mV[VY]) && (z == vec4.mV[VZ])&& (1.0f == vec4.mV[VW])));
00079 vec4.clearVec();
00080 ensure("2:clearVec:Fail " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (1.0f == vec4.mV[VW])));
00081 vec4.setVec(x,y,z,w);
00082 ensure("3:setVec:Fail to initialize " ,((x == vec4.mV[VX]) && (y == vec4.mV[VY]) && (z == vec4.mV[VZ])&& (w == vec4.mV[VW])));
00083 vec4.zeroVec();
00084 ensure("4:zeroVec:Fail " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (0 == vec4.mV[VW])));
00085 LLVector3 vec3(-2.23f,1.01f,42.3f);
00086 vec4.clearVec();
00087 vec4.setVec(vec3);
00088 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])));
00089 F32 w1 = -.234f;
00090 vec4.zeroVec();
00091 vec4.setVec(vec3,w1);
00092 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])));
00093 const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f};
00094 LLVector4 vec4a;
00095 vec4a.setVec(vec);
00096 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])));
00097 }
00098
00099 template<> template<>
00100 void v4math_object::test<3>()
00101 {
00102 F32 x = 10.f, y = -2.3f, z = -.023f;
00103 LLVector4 vec4(x,y,z);
00104 ensure("magVec:Fail ", is_approx_equal(vec4.magVec(), fsqrtf(x*x + y*y + z*z)));
00105 ensure("magVecSquared:Fail ", is_approx_equal(vec4.magVecSquared(), (x*x + y*y + z*z)));
00106 }
00107
00108 template<> template<>
00109 void v4math_object::test<4>()
00110 {
00111 F32 x = 10.f, y = -2.3f, z = -.023f;
00112 LLVector4 vec4(x,y,z);
00113 F32 mag = vec4.normVec();
00114 mag = 1.f/ mag;
00115 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]));
00116 x = 0.000000001f, y = 0.000000001f, z = 0.000000001f;
00117 vec4.clearVec();
00118 vec4.setVec(x,y,z);
00119 mag = vec4.normVec();
00120 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]));
00121 }
00122
00123 template<> template<>
00124 void v4math_object::test<5>()
00125 {
00126 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00127 LLVector4 vec4(x,y,z,w);
00128 vec4.abs();
00129 ensure("abs:Fail " ,((x == vec4.mV[VX]) && (-y == vec4.mV[VY]) && (-z == vec4.mV[VZ])&& (-w == vec4.mV[VW])));
00130 vec4.clearVec();
00131 ensure("isExactlyClear:Fail " ,(TRUE == vec4.isExactlyClear()));
00132 vec4.zeroVec();
00133 ensure("isExactlyZero:Fail " ,(TRUE == vec4.isExactlyZero()));
00134 }
00135
00136 template<> template<>
00137 void v4math_object::test<6>()
00138 {
00139 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00140 LLVector4 vec4(x,y,z,w),vec4a;
00141 vec4a = vec4.scaleVec(vec4);
00142 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])));
00143 }
00144
00145 template<> template<>
00146 void v4math_object::test<7>()
00147 {
00148 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00149 LLVector4 vec4(x,y,z,w);
00150 ensure("1:operator [] failed " ,( x == vec4[0]));
00151 ensure("2:operator [] failed " ,( y == vec4[1]));
00152 ensure("3:operator [] failed " ,( z == vec4[2]));
00153 ensure("4:operator [] failed " ,( w == vec4[3]));
00154 x = 23.f, y = -.2361f, z = 3.25;
00155 vec4.setVec(x,y,z);
00156 F32 &ref1 = vec4[0];
00157 ensure("5:operator [] failed " ,( ref1 == vec4[0]));
00158 F32 &ref2 = vec4[1];
00159 ensure("6:operator [] failed " ,( ref2 == vec4[1]));
00160 F32 &ref3 = vec4[2];
00161 ensure("7:operator [] failed " ,( ref3 == vec4[2]));
00162 F32 &ref4 = vec4[3];
00163 ensure("8:operator [] failed " ,( ref4 == vec4[3]));
00164 }
00165
00166 template<> template<>
00167 void v4math_object::test<8>()
00168 {
00169 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00170 const F32 val[10] = {1.f,2.f,3.f,.34f,.1f,-.5f,2.f,1.23f,1.234f,.89f};
00171 LLMatrix4 mat(val);
00172 LLVector4 vec4(x,y,z,w),vec4a;
00173 vec4.rotVec(mat);
00174 vec4a.setVec(x,y,z,w);
00175 vec4a.rotVec(mat);
00176 ensure_equals("1:rotVec: Fail " ,vec4a, vec4);
00177 F32 a = 2.32f, b = -23.2f, c = -34.1112f, d = 1.010112f;
00178 LLQuaternion q(a,b,c,d);
00179 LLVector4 vec4b(a,b,c,d),vec4c;
00180 vec4b.rotVec(q);
00181 vec4c.setVec(a, b, c, d);
00182 vec4c.rotVec(q);
00183 ensure_equals("2:rotVec: Fail " ,vec4b, vec4c);
00184 }
00185
00186 template<> template<>
00187 void v4math_object::test<9>()
00188 {
00189 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
00190 LLVector4 vec4(x,y,z,w),vec4a;;
00191 std::ostringstream stream1, stream2;
00192 stream1 << vec4;
00193 vec4a.setVec(x,y,z,w);
00194 stream2 << vec4a;
00195 ensure("operator << failed",(stream1.str() == stream2.str()));
00196 }
00197
00198 template<> template<>
00199 void v4math_object::test<10>()
00200 {
00201 F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f, w1 = .23f;
00202 F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f, w2 = 1.3f;
00203 LLVector4 vec4(x1,y1,z1,w1),vec4a(x2,y2,z2,w2),vec4b;
00204 vec4b = vec4a + vec4;
00205 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])));
00206 x1 = -2.45f, y1 = 2.1f, z1 = 3.0f;
00207 vec4.clearVec();
00208 vec4a.clearVec();
00209 vec4.setVec(x1,y1,z1);
00210 vec4a +=vec4;
00211 ensure_equals("2:operator+=: Fail to initialize", vec4a,vec4);
00212 vec4a += vec4;
00213 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])));
00214 }
00215 template<> template<>
00216 void v4math_object::test<11>()
00217 {
00218 F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f, w1 = .23f;
00219 F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f, w2 = 1.3f;
00220 LLVector4 vec4(x1,y1,z1,w1),vec4a(x2,y2,z2,w2),vec4b;
00221 vec4b = vec4a - vec4;
00222 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])));
00223 x1 = -2.45f, y1 = 2.1f, z1 = 3.0f;
00224 vec4.clearVec();
00225 vec4a.clearVec();
00226 vec4.setVec(x1,y1,z1);
00227 vec4a -=vec4;
00228 ensure_equals("2:operator-=: Fail to initialize" , vec4a,-vec4);
00229 vec4a -=vec4;
00230 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])));
00231 }
00232
00233 template<> template<>
00234 void v4math_object::test<12>()
00235 {
00236 F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f;
00237 F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f;
00238 LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2);
00239 F32 res = vec4 * vec4a;
00240 ensure("1:operator* failed " ,is_approx_equal(res, x1*x2 + y1*y2 + z1*z2));
00241 vec4a.clearVec();
00242 F32 mulVal = 4.2f;
00243 vec4a = vec4 * mulVal;
00244 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]));
00245 vec4a.clearVec();
00246 vec4a = mulVal * vec4 ;
00247 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]));
00248 vec4 *= mulVal;
00249 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]));
00250 }
00251
00252 template<> template<>
00253 void v4math_object::test<13>()
00254 {
00255 F32 x1 = 1.f, y1 = 2.f, z1 = -1.1f;
00256 F32 x2 = 1.2f, y2 = 2.5f, z2 = 1.f;
00257 LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2),vec4b;
00258 vec4b = vec4 % vec4a;
00259 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]));
00260 vec4 %= vec4a;
00261 ensure_equals("operator%= failed " ,vec4,vec4b);
00262 }
00263
00264 template<> template<>
00265 void v4math_object::test<14>()
00266 {
00267 F32 x = 1.f, y = 2.f, z = -1.1f,div = 4.2f;
00268 F32 t = 1.f / div;
00269 LLVector4 vec4(x,y,z), vec4a;
00270 vec4a = vec4/div;
00271 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]));
00272 x = 1.23f, y = 4.f, z = -2.32f;
00273 vec4.clearVec();
00274 vec4a.clearVec();
00275 vec4.setVec(x,y,z);
00276 vec4a = vec4/div;
00277 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]));
00278 vec4 /= div;
00279 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]));
00280 }
00281
00282 template<> template<>
00283 void v4math_object::test<15>()
00284 {
00285 F32 x = 1.f, y = 2.f, z = -1.1f;
00286 LLVector4 vec4(x,y,z), vec4a;
00287 ensure("operator!= failed " ,(vec4 != vec4a));
00288 vec4a = vec4;
00289 ensure("operator== failed " ,(vec4 ==vec4a));
00290 }
00291
00292 template<> template<>
00293 void v4math_object::test<16>()
00294 {
00295 F32 x = 1.f, y = 2.f, z = -1.1f;
00296 LLVector4 vec4(x,y,z), vec4a;
00297 vec4a = - vec4;
00298 ensure("operator- failed " , (vec4 == - vec4a));
00299 }
00300
00301 template<> template<>
00302 void v4math_object::test<17>()
00303 {
00304 F32 x = 1.f, y = 2.f, z = -1.1f,epsilon = .23425f;
00305 LLVector4 vec4(x,y,z), vec4a(x,y,z);
00306 ensure("1:are_parallel: Fail " ,(TRUE == are_parallel(vec4a,vec4,epsilon)));
00307 x = 21.f, y = 12.f, z = -123.1f;
00308 vec4a.clearVec();
00309 vec4a.setVec(x,y,z);
00310 ensure("2:are_parallel: Fail " ,(FALSE == are_parallel(vec4a,vec4,epsilon)));
00311 }
00312
00313 template<> template<>
00314 void v4math_object::test<18>()
00315 {
00316 F32 x = 1.f, y = 2.f, z = -1.1f;
00317 F32 angle1, angle2;
00318 LLVector4 vec4(x,y,z), vec4a(x,y,z);
00319 angle1 = angle_between(vec4, vec4a);
00320 vec4.normVec();
00321 vec4a.normVec();
00322 angle2 = acos(vec4 * vec4a);
00323 ensure_approximately_equals("1:angle_between: Fail " ,angle1,angle2,8);
00324 F32 x1 = 21.f, y1 = 2.23f, z1 = -1.1f;
00325 LLVector4 vec4b(x,y,z), vec4c(x1,y1,z1);
00326 angle1 = angle_between(vec4b, vec4c);
00327 vec4b.normVec();
00328 vec4c.normVec();
00329 angle2 = acos(vec4b * vec4c);
00330 ensure_approximately_equals("2:angle_between: Fail " ,angle1,angle2,8);
00331 }
00332
00333 template<> template<>
00334 void v4math_object::test<19>()
00335 {
00336 F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.f, z2 = 1.f;
00337 F32 val1,val2;
00338 LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2);
00339 val1 = dist_vec(vec4,vec4a);
00340 val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
00341 ensure_equals("dist_vec: Fail ",val2, val1);
00342 val1 = dist_vec_squared(vec4,vec4a);
00343 val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
00344 ensure_equals("dist_vec_squared: Fail ",val2, val1);
00345 }
00346
00347 template<> template<>
00348 void v4math_object::test<20>()
00349 {
00350 F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, w1 = -.23f, x2 = 1.3f, y2 = 1.f, z2 = 1.f,w2 = .12f;
00351 F32 val = 2.3f,val1,val2,val3,val4;
00352 LLVector4 vec4(x1,y1,z1,w1),vec4a(x2,y2,z2,w2);
00353 val1 = x1 + (x2 - x1)* val;
00354 val2 = y1 + (y2 - y1)* val;
00355 val3 = z1 + (z2 - z1)* val;
00356 val4 = w1 + (w2 - w1)* val;
00357 LLVector4 vec4b = lerp(vec4,vec4a,val);
00358 ensure("lerp failed", ((val1 ==vec4b.mV[VX])&& (val2 ==vec4b.mV[VY]) && (val3 ==vec4b.mV[VZ])&& (val4 ==vec4b.mV[VW])));
00359 }
00360
00361 template<> template<>
00362 void v4math_object::test<21>()
00363 {
00364 F32 x = 1.f, y = 2.f, z = -1.1f;
00365 LLVector4 vec4(x,y,z);
00366 LLVector3 vec3 = vec4to3(vec4);
00367 ensure("vec4to3 failed", ((x == vec3.mV[VX])&& (y == vec3.mV[VY]) && (z == vec3.mV[VZ])));
00368 LLVector4 vec4a = vec3to4(vec3);
00369 ensure_equals("vec3to4 failed",vec4a,vec4);
00370 }
00371
00372 template<> template<>
00373 void v4math_object::test<22>()
00374 {
00375 F32 x = 1.f, y = 2.f, z = -1.1f;
00376 LLVector4 vec4(x,y,z);
00377 LLSD llsd = vec4.getValue();
00378 LLVector3 vec3(llsd);
00379 LLVector4 vec4a = vec3to4(vec3);
00380 ensure_equals("getValue failed",vec4a,vec4);
00381 }
00382 }