openMSX
gl_vec_Test.cc
Go to the documentation of this file.
1 #include "gl_vec.hh"
2 #include <cassert>
3 #include <iostream>
4 
5 using namespace gl;
6 
7 // Not used in test, but useful to debug.
8 template<int N, typename T> void print(const vecN<N, T>& x)
9 {
10  for (int i = 0; i < N; ++i) {
11  std::cout << x[i] << " ";
12  }
13  std::cout << std::endl;
14 }
15 
16 // Test approximations.
17 template<typename T>
18 bool approxEq(T x, T y)
19 {
20  return fabs(x - y) < 1.0e-5f;
21 }
22 template<int N, typename T>
23 bool approxEq(const vecN<N, T>& x, const vecN<N, T>&y)
24 {
25  return length2(x - y) < 1.0e-4f;
26 }
27 
28 int main()
29 {
30  {
31  // rsqrt
32  assert(rsqrt(16.0f) == 0.25f);
33  assert(rsqrt(16.0 ) == 0.25 );
34  }
35  {
36  // radians, degrees
37  assert(approxEq(radians( 0.0), 0.0 ));
38  assert(approxEq(radians( 90.0), M_PI / 2));
39  assert(approxEq(radians(180.0), M_PI ));
40  assert(approxEq(degrees(0.0 ), 0.0));
41  assert(approxEq(degrees(M_PI / 2), 90.0));
42  assert(approxEq(degrees(M_PI ), 180.0));
43  }
44  // It's useful to test both integer and float variants because the
45  // former are implemented in plain C++ and (only) the latter have SSE
46  // optimizations.
47  {
48  // default constructor
49  vec2 v2;
50  assert(v2[0] == 0);
51  assert(v2[1] == 0);
52  ivec2 i2;
53  assert(i2[0] == 0);
54  assert(i2[1] == 0);
55 
56  vec3 v3;
57  assert(v3[0] == 0);
58  assert(v3[1] == 0);
59  assert(v3[2] == 0);
60  ivec3 i3;
61  assert(i3[0] == 0);
62  assert(i3[1] == 0);
63  assert(i3[2] == 0);
64 
65  vec4 v4;
66  assert(v4[0] == 0);
67  assert(v4[1] == 0);
68  assert(v4[2] == 0);
69  assert(v4[3] == 0);
70  ivec4 i4;
71  assert(i4[0] == 0);
72  assert(i4[1] == 0);
73  assert(i4[2] == 0);
74  assert(i4[3] == 0);
75  }
76  {
77  // broadcast constructor
78  vec2 v2(2);
79  assert(v2[0] == 2);
80  assert(v2[1] == 2);
81  ivec2 i2(2);
82  assert(i2[0] == 2);
83  assert(i2[1] == 2);
84 
85  vec3 v3(3);
86  assert(v3[0] == 3);
87  assert(v3[1] == 3);
88  assert(v3[2] == 3);
89  ivec3 i3(3);
90  assert(i3[0] == 3);
91  assert(i3[1] == 3);
92  assert(i3[2] == 3);
93 
94  vec4 v4(4);
95  assert(v4[0] == 4);
96  assert(v4[1] == 4);
97  assert(v4[2] == 4);
98  assert(v4[3] == 4);
99  ivec4 i4(4);
100  assert(i4[0] == 4);
101  assert(i4[1] == 4);
102  assert(i4[2] == 4);
103  assert(i4[3] == 4);
104  }
105  {
106  // per-element constructor
107  vec2 v2(2,3);
108  assert(v2[0] == 2);
109  assert(v2[1] == 3);
110  ivec2 i2(2,3);
111  assert(i2[0] == 2);
112  assert(i2[1] == 3);
113 
114  vec3 v3(3,4,5);
115  assert(v3[0] == 3);
116  assert(v3[1] == 4);
117  assert(v3[2] == 5);
118  ivec3 i3(3,4,5);
119  assert(i3[0] == 3);
120  assert(i3[1] == 4);
121  assert(i3[2] == 5);
122 
123  vec4 v4(4,5,6,7);
124  assert(v4[0] == 4);
125  assert(v4[1] == 5);
126  assert(v4[2] == 6);
127  assert(v4[3] == 7);
128  ivec4 i4(4,5,6,7);
129  assert(i4[0] == 4);
130  assert(i4[1] == 5);
131  assert(i4[2] == 6);
132  assert(i4[3] == 7);
133  }
134  {
135  // construct from smaller vectors/scalar
136  vec3 v3(3, vec2(4,5));
137  assert(v3[0] == 3);
138  assert(v3[1] == 4);
139  assert(v3[2] == 5);
140  ivec3 i3(ivec2(4,5), 3);
141  assert(i3[0] == 4);
142  assert(i3[1] == 5);
143  assert(i3[2] == 3);
144 
145  vec4 v4(4, vec3(5,6,7));
146  assert(v4[0] == 4);
147  assert(v4[1] == 5);
148  assert(v4[2] == 6);
149  assert(v4[3] == 7);
150  ivec4 i4(ivec3(5,6,7), 4);
151  assert(i4[0] == 5);
152  assert(i4[1] == 6);
153  assert(i4[2] == 7);
154  assert(i4[3] == 4);
155 
156  vec4 w4(vec2(5,6), vec2(7,8));
157  assert(w4[0] == 5);
158  assert(w4[1] == 6);
159  assert(w4[2] == 7);
160  assert(w4[3] == 8);
161  ivec4 j4(ivec2(5,6), ivec2(7,8));
162  assert(j4[0] == 5);
163  assert(j4[1] == 6);
164  assert(j4[2] == 7);
165  assert(j4[3] == 8);
166  }
167  {
168  // modify elements
169  vec2 v2;
170  v2[0] = 5;
171  assert(v2[0] == 5);
172  assert(v2[1] == 0);
173  v2[1] = 7;
174  assert(v2[0] == 5);
175  assert(v2[1] == 7);
176  ivec2 i2;
177  i2[0] = 5;
178  assert(i2[0] == 5);
179  assert(i2[1] == 0);
180  i2[1] = 7;
181  assert(i2[0] == 5);
182  assert(i2[1] == 7);
183 
184  vec3 v3(1);
185  v3[1] = 2;
186  assert(v3[0] == 1);
187  assert(v3[1] == 2);
188  assert(v3[2] == 1);
189  ivec3 i3(1);
190  i3[1] = 2;
191  assert(i3[0] == 1);
192  assert(i3[1] == 2);
193  assert(i3[2] == 1);
194 
195  vec4 v4(1,2,3,4);
196  v4[0] = 9; v4[2] = 8;
197  assert(v4[0] == 9);
198  assert(v4[1] == 2);
199  assert(v4[2] == 8);
200  assert(v4[3] == 4);
201  ivec4 i4(1,2,3,4);
202  i4[0] = 9; i4[2] = 8;
203  assert(i4[0] == 9);
204  assert(i4[1] == 2);
205  assert(i4[2] == 8);
206  assert(i4[3] == 4);
207  }
208  {
209  // (in)equality
210  assert( vec2(1,2) == vec2(1,2));
211  assert( vec2(1,2) != vec2(1,4));
212  assert( vec2(1,2) != vec2(3,2));
213  assert( vec2(1,2) != vec2(3,4));
214  assert(ivec2(1,2) == ivec2(1,2));
215  assert(ivec2(1,2) != ivec2(1,4));
216  assert(ivec2(1,2) != ivec2(3,2));
217  assert(ivec2(1,2) != ivec2(3,4));
218 
219  assert( vec3(1,2,3) == vec3(1,2,3));
220  assert( vec3(1,2,3) != vec3(1,2,4));
221  assert(ivec3(1,2,3) == ivec3(1,2,3));
222  assert(ivec3(1,2,3) != ivec3(1,2,4));
223 
224  assert( vec4(1,2,3,4) == vec4(1,2,3,4));
225  assert( vec4(1,2,3,4) != vec4(1,2,4,4));
226  assert(ivec4(1,2,3,4) == ivec4(1,2,3,4));
227  assert(ivec4(1,2,3,4) != ivec4(1,2,4,4));
228  }
229  {
230  // copy constructor, assignment
231  vec2 v2(2,3);
232  vec2 w2(v2);
233  assert(v2 == w2);
234  v2[0] = 9; w2 = v2;
235  assert(v2 == w2);
236 
237  ivec2 i2(2,3);
238  ivec2 j2(i2);
239  assert(i2 == j2);
240  i2[1] = 9; j2 = i2;
241  assert(i2 == j2);
242 
243  vec3 v3(3,4,5);
244  vec3 w3(v3);
245  assert(v3 == w3);
246  v3[2] = 8; w3 = v3;
247  assert(v3 == w3);
248 
249  ivec3 i3(3,4,5);
250  ivec3 j3(i3);
251  assert(i3 == j3);
252  i3[1] = 8; j3 = i3;
253  assert(i3 == j3);
254 
255  vec4 v4(4,5,6,7);
256  vec4 w4(v4);
257  assert(v4 == w4);
258  v3[3] = 0; w4 = v4;
259  assert(v4 == w4);
260 
261  ivec4 i4(4,5,6,7);
262  ivec4 j4(i4);
263  assert(i4 == j4);
264  i3[0] = 1; j4 = i4;
265  assert(i4 == j4);
266  }
267  {
268  // construct from larger vector
269  vec4 v4(1,2,3,4);
270  vec3 v3(7,8,9);
271  assert(vec3(v4) == vec3(1,2,3));
272  assert(vec2(v4) == vec2(1,2));
273  assert(vec2(v3) == vec2(7,8));
274 
275  ivec4 i4(1,2,3,4);
276  ivec3 i3(7,8,9);
277  assert(ivec3(i4) == ivec3(1,2,3));
278  assert(ivec2(i4) == ivec2(1,2));
279  assert(ivec2(i3) == ivec2(7,8));
280  }
281  // From here on I'll skip tests on vec2 and ivec2.
282  // Vectors of dimension 2 and 3 are handled by the same C++ code, so
283  // if there's a bug it should show up in both types.
284  {
285  // vector add
286  vec3 v3(1,2,3); vec4 v4(1,2,3,4);
287  ivec3 i3(1,2,3); ivec4 i4(1,2,3,4);
288  assert((v3 + vec3(4,5,6)) == vec3(5,7,9));
289  assert((i3 + ivec3(4,5,6)) == ivec3(5,7,9));
290  assert((v4 + vec4(4,5,6,7)) == vec4(5,7,9,11));
291  assert((i4 + ivec4(4,5,6,7)) == ivec4(5,7,9,11));
292 
293  v3 += vec3(2,3,4);
294  i3 += ivec3(2,3,4);
295  v4 += vec4(2,3,4,5);
296  i4 += ivec4(2,3,4,5);
297  assert(v3 == vec3(3,5,7));
298  assert(i3 == ivec3(3,5,7));
299  assert(v4 == vec4(3,5,7,9));
300  assert(i4 == ivec4(3,5,7,9));
301  }
302  {
303  // vector subtract
304  vec3 v3(1,2,3); vec4 v4(1,2,3,4);
305  ivec3 i3(1,2,3); ivec4 i4(1,2,3,4);
306  assert((v3 - vec3(4,3,2)) == vec3(-3,-1,1));
307  assert((i3 - ivec3(4,3,2)) == ivec3(-3,-1,1));
308  assert((v4 - vec4(4,3,2,1)) == vec4(-3,-1,1,3));
309  assert((i4 - ivec4(4,3,2,1)) == ivec4(-3,-1,1,3));
310 
311  v3 -= vec3(2,4,6);
312  i3 -= ivec3(2,4,6);
313  v4 -= vec4(2,4,6,8);
314  i4 -= ivec4(2,4,6,8);
315  assert(v3 == vec3(-1,-2,-3));
316  assert(i3 == ivec3(-1,-2,-3));
317  assert(v4 == vec4(-1,-2,-3,-4));
318  assert(i4 == ivec4(-1,-2,-3,-4));
319  }
320  {
321  // vector negate
322  assert((- vec3(4,-3,2)) == vec3(-4,3,-2));
323  assert((-ivec3(4,-3,2)) == ivec3(-4,3,-2));
324  assert((- vec4(4,-3,2,-1)) == vec4(-4,3,-2,1));
325  assert((-ivec4(4,-3,2,-1)) == ivec4(-4,3,-2,1));
326  }
327  {
328  // component-wise vector multiplication
329  vec3 v3(0,2,-3); vec4 v4(0,2,-3,4);
330  ivec3 i3(0,2,-3); ivec4 i4(0,2,-3,4);
331  // scalar * vector
332  assert((2.0f * v3) == vec3(0,4,-6));
333  assert((2 * i3) == ivec3(0,4,-6));
334  assert((2.0f * v4) == vec4(0,4,-6,8));
335  assert((2 * i4) == ivec4(0,4,-6,8));
336  // vector * scalar
337  assert((v3 * 2.0f) == vec3(0,4,-6));
338  assert((i3 * 2 ) == ivec3(0,4,-6));
339  assert((v4 * 2.0f) == vec4(0,4,-6,8));
340  assert((i4 * 2 ) == ivec4(0,4,-6,8));
341  // vector * vector
342  vec3 w3(-1,2,-3); vec4 w4(-1,2,-3,-4);
343  ivec3 j3(-1,2,-3); ivec4 j4(-1,2,-3,-4);
344  assert((v3 * w3) == vec3(0,4,9));
345  assert((i3 * j3) == ivec3(0,4,9));
346  assert((v4 * w4) == vec4(0,4,9,-16));
347  assert((i4 * j4) == ivec4(0,4,9,-16));
348  // *= scalar
349  v3 *= 2.0f; assert(v3 == vec3(0,4,-6));
350  i3 *= 2; assert(i3 == ivec3(0,4,-6));
351  v4 *= 2.0f; assert(v4 == vec4(0,4,-6,8));
352  i4 *= 2; assert(i4 == ivec4(0,4,-6,8));
353  // *= vector
354  v3 *= w3; assert(v3 == vec3(0,8,18));
355  i3 *= j3; assert(i3 == ivec3(0,8,18));
356  v4 *= w4; assert(v4 == vec4(0,8,18,-32));
357  i4 *= j4; assert(i4 == ivec4(0,8,18,-32));
358  }
359  {
360  // reciprocal, only floating point
361  assert(approxEq(recip(vec3(4,2,0.5)), vec3(0.25,0.5,2)));
362  assert(approxEq(recip(vec4(4,2,0.5,1)), vec4(0.25,0.5,2,1)));
363  }
364  {
365  // component-wise division, only floating point
366  vec3 v3( 0, 1,-4);
367  vec3 w3(-1,-2, 2);
368  assert((v3 / 2.0f) == vec3(0,0.5f,-2));
369  assert((6.0f / w3) == vec3(-6,-3,3));
370  assert((v3 / w3) == vec3(0,-0.5f,-2));
371 
372  vec4 v4( 2, 1,-4,-3);
373  vec4 w4(-1, 2, 2,-6);
374  assert(approxEq((v4 / -2.0f), vec4(-1,-0.5f,2,1.5f)));
375  assert(approxEq((6.0f / w4), vec4(-6,3,3,-1)));
376  assert(approxEq((v4 / w4), vec4(-2,0.5f,-2,0.5f)));
377  }
378  {
379  // component-wise min/max
380  assert(min( vec3(2,3,4), vec3(1,-5,7)) == vec3(1,-5,4));
381  assert(min(ivec3(2,3,4), ivec3(1,-5,7)) == ivec3(1,-5,4));
382  assert(min( vec4(1,-2,5,-7), vec4(0,2,-4,-3)) == vec4(0,-2,-4,-7));
383  assert(min(ivec4(1,-2,5,-7), ivec4(0,2,-4,-3)) == ivec4(0,-2,-4,-7));
384 
385  assert(max( vec3(2,3,4), vec3(1,-5,7)) == vec3(2,3,7));
386  assert(max(ivec3(2,3,4), ivec3(1,-5,7)) == ivec3(2,3,7));
387  assert(max( vec4(1,-2,5,-7), vec4(0,2,-4,-3)) == vec4(1,2,5,-3));
388  assert(max(ivec4(1,-2,5,-7), ivec4(0,2,-4,-3)) == ivec4(1,2,5,-3));
389  }
390  {
391  // clamp
392  assert(clamp( vec3(2,3,4), vec3(0,4,-4), vec3(4,7,0)) == vec3(2,4,0));
393  assert(clamp(ivec3(2,3,4), ivec3(0,4,-4), ivec3(4,7,0)) == ivec3(2,4,0));
394  assert(clamp( vec4(4,2,7,1), vec4(0,3,2,1), vec4(4,6,8,3)) == vec4(4,3,7,1));
395  assert(clamp(ivec4(4,2,7,1), ivec4(0,3,2,1), ivec4(4,6,8,3)) == ivec4(4,3,7,1));
396 
397  assert(clamp( vec3(2,3,4), 1.0f, 3.0f) == vec3(2,3,3));
398  assert(clamp(ivec3(2,3,4), 1, 3 ) == ivec3(2,3,3));
399  assert(clamp( vec4(4,2,7,1), 2.0f, 6.0f) == vec4(4,2,6,2));
400  assert(clamp(ivec4(4,2,7,1), 2, 6 ) == ivec4(4,2,6,2));
401  }
402  {
403  // sum of vector components
404  assert(sum( vec3(4,-3,2)) == 3.0f);
405  assert(sum(ivec3(4,-3,2)) == 3 );
406  assert(sum( vec4(4,-3,2,-1)) == 2.0f);
407  assert(sum(ivec4(4,-3,2,-1)) == 2 );
408 
409  assert(sum_broadcast(vec3(4,-3,2)) == vec3(3.0f));
410  assert(sum_broadcast(vec4(4,-3,2,-1)) == vec4(2.0f));
411  }
412  {
413  // dot product
414  assert(dot( vec3(4,-3,2), vec3(-1,3,2) ) == -9.0f);
415  assert(dot(ivec3(4,-3,2), ivec3(-1,3,2) ) == -9 );
416  assert(dot( vec4(4,-3,2,-1), vec4(-1,3,2,-2)) == -7.0f);
417  assert(dot(ivec4(4,-3,2,-1), ivec4(-1,3,2,-2)) == -7 );
418 
419  assert(dot_broadcast(vec3(4,-3,2), vec3(-1,3,2) ) == vec3(-9.0f));
420  assert(dot_broadcast(vec4(4,-3,2,-1), vec4(-1,3,2,-2)) == vec4(-7.0f));
421  }
422  {
423  // cross product (only for vectors of length 3)
424  assert(cross( vec3(4,-3,2), vec3(-1,3,2)) == vec3(-12,-10,9));
425  assert(cross(ivec3(4,-3,2), ivec3(-1,3,2)) == ivec3(-12,-10,9));
426  }
427  {
428  // vector length squared (2-norm squared)
429  assert(length2( vec3(4,-3,2 )) == 29.0f);
430  assert(length2(ivec3(4,-3,2 )) == 29 );
431  assert(length2( vec4(4,-3,2,-1)) == 30.0f);
432  assert(length2(ivec4(4,-3,2,-1)) == 30 );
433  }
434  {
435  // vector length (2-norm), only makes sense for floating point
436  assert(length(vec3(4,-3,2 )) == sqrtf(29.0f));
437  assert(length(vec4(4,-3,2,-1)) == sqrtf(30.0f));
438  }
439  {
440  // vector normalization, only floating point
441  assert(normalize(vec3(0,4,-3 )) == vec3(0.0f,0.8f,-0.6f));
442  assert(normalize(vec4(-4,0,0,3)) == vec4(-0.8f,0.0f,0.0f,0.6f));
443  }
444  {
445  // round
446  assert(round(vec3(1.1f,2.5f,-3.8f)) == ivec3(1,3,-4));
447  assert(round(vec4(-1.1f,2.5f,3.8f,-4.5f)) == ivec4(-1,3,4,-5));
448  // round integers, nop
449  assert(round(ivec4(1,-2,3,-4)) == ivec4(1,-2,3,-4));
450  }
451  {
452  // trunc
453  assert(trunc(vec3(1.1f,2.5f,-3.8f)) == ivec3(1,2,-3));
454  assert(trunc(vec4(-1.1f,2.5f,3.8f,-4.5f)) == ivec4(-1,2,3,-4));
455  // trunc integers, nop
456  assert(trunc(ivec4(1,-2,3,-4)) == ivec4(1,-2,3,-4));
457  }
458 }
459 
460 
461 // The following functions are not part of the actual test. They get compiled,
462 // but never executed. I used them to (manually) inspect the quality of the
463 // generated code. Mostly only for vec4, because the code was only optimized
464 // for that type.
465 
467 {
468  z = vec4();
469 }
470 void test_constr(float x, vec4& z)
471 {
472  z = vec4(x);
473 }
474 void test_constr(float a, float b, float c, float d, vec4& z)
475 {
476  z = vec4(a, b, c, d);
477 }
478 
479 void test_change0(float x, vec4& z)
480 {
481  z[0] = x;
482 }
483 void test_change2(float x, vec4& z)
484 {
485  z[2] = x;
486 }
487 
488 void test_extract0(const vec4& x, float& z)
489 {
490  z = x[0];
491 }
492 void test_extract2(const vec4& x, float& z)
493 {
494  z = x[2];
495 }
496 
497 bool test_equal(const vec4& x, const vec4& y)
498 {
499  return x == y;
500 }
501 bool test_not_equal(const vec4& x, const vec4& y)
502 {
503  return x != y;
504 }
505 
506 void test_add(const vec4& x, const vec4& y, vec4& z)
507 {
508  z = x + y;
509 }
510 void test_add(vec4& x, const vec4& y)
511 {
512  x += y;
513 }
514 
515 void test_negate(const vec4& x, vec4& y)
516 {
517  y = -x;
518 }
519 
520 void test_mul(const vec4& x, const vec4& y, vec4& z)
521 {
522  z = x * y;
523 }
524 void test_mul(float x, const vec4& y, vec4& z)
525 {
526  z = x * y;
527 }
528 
529 void test_div(const vec4& x, const vec4& y, vec4& z)
530 {
531  z = x / y;
532 }
533 void test_div(float x, const vec4& y, vec4& z)
534 {
535  z = x / y;
536 }
537 void test_div(const vec4& x, float y, vec4& z)
538 {
539  z = x / y;
540 }
541 
542 void test_sum(const vec4& x, float& y)
543 {
544  y = sum(x);
545 }
546 void test_sum_broadcast(const vec4& x, vec4& y)
547 {
548  y = sum_broadcast(x);
549 }
550 
551 void test_dot(const vec4& x, const vec4& y, float& z)
552 {
553  z = dot(x, y);
554 }
555 void test_dot_broadcast(const vec4& x, const vec4& y, vec4& z)
556 {
557  z = dot_broadcast(x, y);
558 }
559 
560 void test_length2(const vec4& x, float& y)
561 {
562  y = length2(x);
563 }
564 
565 void test_length(const vec4& x, float& y)
566 {
567  y = length(x);
568 }
569 
570 void test_normalize(const vec4& x, vec4& y)
571 {
572  y = normalize(x);
573 }
574 
575 void test_recip(const vec4& x, vec4& y)
576 {
577  y = recip(x);
578 }
579 
580 
582 {
583  z = vec3();
584 }
585 void test_constr(float x, vec3& z)
586 {
587  z = vec3(x);
588 }
589 void test_constr(float a, float b, float c, vec3& z)
590 {
591  z = vec3(a, b, c);
592 }
593 void test_constr(vec4 x, vec3& y)
594 {
595  y = vec3(x);
596 }
597 
598 void test_change0(float x, vec3& z)
599 {
600  z[0] = x;
601 }
602 void test_change2(float x, vec3& z)
603 {
604  z[2] = x;
605 }
606 
607 void test_extract0(const vec3& x, float& z)
608 {
609  z = x[0];
610 }
611 void test_extract2(const vec3& x, float& z)
612 {
613  z = x[2];
614 }
615 
616 bool test_equal(const vec3& x, const vec3& y)
617 {
618  return x == y;
619 }
620 bool test_not_equal(const vec3& x, const vec3& y)
621 {
622  return x != y;
623 }
624 
625 void test_add(const vec3& x, const vec3& y, vec3& z)
626 {
627  z = x + y;
628 }
629 void test_add(vec3& x, const vec3& y)
630 {
631  x += y;
632 }
633 
634 void test_negate(const vec3& x, vec3& y)
635 {
636  y = -x;
637 }
638 
639 void test_mul(const vec3& x, const vec3& y, vec3& z)
640 {
641  z = x * y;
642 }
643 void test_mul(float x, const vec3& y, vec3& z)
644 {
645  z = x * y;
646 }
647 
648 void test_div(const vec3& x, const vec3& y, vec3& z)
649 {
650  z = x / y;
651 }
652 void test_div(float x, const vec3& y, vec3& z)
653 {
654  z = x / y;
655 }
656 void test_div(const vec3& x, float y, vec3& z)
657 {
658  z = x / y;
659 }
660 
661 void test_min(const vec3& x, const vec3& y, vec3& z)
662 {
663  z = min(x, y);
664 }
665 
666 void test_min(const vec4& x, const vec4& y, vec4& z)
667 {
668  z = min(x, y);
669 }
670 
671 void test_clamp(const vec3& x, const vec3& y, const vec3& z, vec3& w)
672 {
673  w = clamp(x, y, z);
674 }
675 
676 void test_clamp(const vec4& x, const vec4& y, const vec4& z, vec4& w)
677 {
678  w = clamp(x, y, z);
679 }
680 
681 void test_clamp(const vec3& x, float y, float z, vec3& w)
682 {
683  w = clamp(x, y, z);
684 }
685 
686 void test_clamp(const vec4& x, float y, float z, vec4& w)
687 {
688  w = clamp(x, y, z);
689 }
690 
691 void test_clamp(const vec4& x, vec4& y)
692 {
693  y = clamp(x, 0.0f, 1.0f);
694 }
695 
696 void test_sum(const vec3& x, float& y)
697 {
698  y = sum(x);
699 }
700 
701 void test_dot(const vec3& x, const vec3& y, float& z)
702 {
703  z = dot(x, y);
704 }
705 
706 void test_length2(const vec3& x, float& y)
707 {
708  y = length2(x);
709 }
710 
711 void test_length(const vec3& x, float& y)
712 {
713  y = length(x);
714 }
715 
716 void test_normalize(const vec3& x, vec3& y)
717 {
718  y = normalize(x);
719 }
720 
721 void test_round(const vec4& x, ivec4& y)
722 {
723  y = round(x);
724 }
725 void test_trunc(const vec4& x, ivec4& y)
726 {
727  y = trunc(x);
728 }
vecN< 4, int > ivec4
Definition: gl_vec.hh:143
T length(const vecN< N, T > &x)
Definition: gl_vec.hh:333
float rsqrt(float x)
Definition: gl_vec.hh:149
T length2(const vecN< N, T > &x)
Definition: gl_vec.hh:326
void test_extract0(const vec4 &x, float &z)
Definition: gl_vec_Test.cc:488
bool approxEq(T x, T y)
Definition: gl_vec_Test.cc:18
vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
Definition: gl_vec.hh:268
void test_change0(float x, vec4 &z)
Definition: gl_vec_Test.cc:479
#define M_PI
Definition: Math.hh:27
vecN< N, int > trunc(const vecN< N, T > &x)
Definition: gl_vec.hh:368
vecN< N, T > normalize(const vecN< N, T > &x)
Definition: gl_vec.hh:340
void test_sum(const vec4 &x, float &y)
Definition: gl_vec_Test.cc:542
T degrees(T r)
Definition: gl_vec.hh:163
void test_extract2(const vec4 &x, float &z)
Definition: gl_vec_Test.cc:492
T radians(T d)
Definition: gl_vec.hh:159
vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
Definition: gl_vec.hh:277
void test_recip(const vec4 &x, vec4 &y)
Definition: gl_vec_Test.cc:575
T sum(const vecN< N, T > &x)
Definition: gl_vec.hh:300
vecN< 3, T > cross(const vecN< 3, T > &x, const vecN< 3, T > &y)
Definition: gl_vec.hh:347
vecN< 3, int > ivec3
Definition: gl_vec.hh:142
void test_div(const vec4 &x, const vec4 &y, vec4 &z)
Definition: gl_vec_Test.cc:529
int main()
Definition: gl_vec_Test.cc:28
vecN< N, T > recip(const vecN< N, T > &x)
Definition: gl_vec.hh:238
void test_sum_broadcast(const vec4 &x, vec4 &y)
Definition: gl_vec_Test.cc:546
bool test_equal(const vec4 &x, const vec4 &y)
Definition: gl_vec_Test.cc:497
vecN< N, int > round(const vecN< N, T > &x)
Definition: gl_vec.hh:356
vecN< 4, float > vec4
Definition: gl_vec.hh:140
void test_length(const vec4 &x, float &y)
Definition: gl_vec_Test.cc:565
void print(const vecN< N, T > &x)
Definition: gl_vec_Test.cc:8
void test_normalize(const vec4 &x, vec4 &y)
Definition: gl_vec_Test.cc:570
vecN< 2, int > ivec2
Definition: gl_vec.hh:141
T dot(const vecN< N, T > &x, const vecN< N, T > &y)
Definition: gl_vec.hh:314
vecN< N, T > clamp(const vecN< N, T > &x, const vecN< N, T > &minVal, const vecN< N, T > &maxVal)
Definition: gl_vec.hh:286
void test_trunc(const vec4 &x, ivec4 &y)
Definition: gl_vec_Test.cc:725
void test_length2(const vec4 &x, float &y)
Definition: gl_vec_Test.cc:560
void test_change2(float x, vec4 &z)
Definition: gl_vec_Test.cc:483
void test_dot(const vec4 &x, const vec4 &y, float &z)
Definition: gl_vec_Test.cc:551
void test_min(const vec3 &x, const vec3 &y, vec3 &z)
Definition: gl_vec_Test.cc:661
void test_add(const vec4 &x, const vec4 &y, vec4 &z)
Definition: gl_vec_Test.cc:506
vecN< N, T > dot_broadcast(const vecN< N, T > &x, const vecN< N, T > &y)
Definition: gl_vec.hh:319
vecN< 3, float > vec3
Definition: gl_vec.hh:139
bool test_not_equal(const vec4 &x, const vec4 &y)
Definition: gl_vec_Test.cc:501
void test_clamp(const vec3 &x, const vec3 &y, const vec3 &z, vec3 &w)
Definition: gl_vec_Test.cc:671
void test_constr(vec4 &z)
Definition: gl_vec_Test.cc:466
vecN< 2, float > vec2
Definition: gl_vec.hh:138
void test_dot_broadcast(const vec4 &x, const vec4 &y, vec4 &z)
Definition: gl_vec_Test.cc:555
void test_mul(const vec4 &x, const vec4 &y, vec4 &z)
Definition: gl_vec_Test.cc:520
Definition: gl_mat.hh:24
vecN< N, T > sum_broadcast(const vecN< N, T > &x)
Definition: gl_vec.hh:307
void test_round(const vec4 &x, ivec4 &y)
Definition: gl_vec_Test.cc:721
void test_negate(const vec4 &x, vec4 &y)
Definition: gl_vec_Test.cc:515