00001 #define BOOST_AUTO_TEST_MAIN
00002 #include <boost/test/auto_unit_test.hpp>
00003 #include <gslib/glsl_math/glsl_math.h>
00004
00005 using namespace gslib::glsl_math;
00006
00007 bool isNearEqual( float a, float b ) {
00008 return fabsf( a - b ) < 0.0001f;
00009 }
00010 template < size_t Size >
00011 bool isNearEqual( const tuple< Size >& a, const tuple< Size >& b ) {
00012 return distance( a, b ) < 0.0001f;
00013 }
00014
00015 BOOST_AUTO_UNIT_TEST( test_glsl_math ) {
00016 vec4 a( 1, 2, 3, 4 );
00017 vec4::iterator it = a.begin();
00018 float len = length( a );
00019 BOOST_CHECK( isNearEqual( sqrtf( 1 + 4 + 9 + 16 ), len ) );
00020 vec4 b( a );
00021 b.operator *= ( 2 );
00022 BOOST_CHECK( isNearEqual( vec4( 2, 4, 6, 8 ), b ) );
00023 a *= b;
00024 BOOST_CHECK( isNearEqual( vec4( 2, 8, 18, 32 ), a ) );
00025
00026
00027 BOOST_CHECK( isNearEqual( vec3( 0, 0, 1 ), cross( vec3( 1, 0, 0 ), vec3( 0, 1, 0 ) ) ) );
00028 BOOST_CHECK( isNearEqual( vec3( 1, 0, 0 ), cross( vec3( 0, 1, 0 ), vec3( 0, 0, 1 ) ) ) );
00029 BOOST_CHECK( isNearEqual( vec3( 0, 1, 0 ), cross( vec3( 0, 0, 1 ), vec3( 1, 0, 0 ) ) ) );
00030
00031 mat2 m( 1, 2, 3, 4 );
00032 vec2 v( 1, 2 );
00033
00034
00035
00036 BOOST_CHECK( isNearEqual( vec2( 7, 10 ), m * v ) );
00037
00038
00039
00040 BOOST_CHECK( isNearEqual( vec2( 5, 11 ), v * m ) );
00041
00042 mat2 m2( 5, 6, 7, 8 );
00043 BOOST_CHECK( isNearEqual( mat2( 19, 43, 22, 50 ), m * m2 ) );
00044 BOOST_CHECK( isNearEqual( mat2( 23, 31, 34, 46 ), m2 * m ) );
00045
00046
00047 quat q1( 1, 0, 0, 0 );
00048 quat r( vec3( 0, 0, 1 ), radians( 90 ) );
00049 BOOST_CHECK( isNearEqual( quat( 0, 1, 0, 0 ), r * q1 * conj( r ) ) );
00050 quat q2( 1, 2, 3, 4 );
00051 BOOST_CHECK( isNearEqual( quat::identity(), inverse( q2 ) * q2 ) );
00052
00053
00054 mat2 invM = inverse( m );
00055 BOOST_CHECK( isNearEqual( mat2::identity(), m * invM ) );
00056 mat3 m3( 1, 2, 3, 4, 0, 6, 7, 8, 9 );
00057 mat3 invM3 = inverse( m3 );
00058 BOOST_CHECK( isNearEqual( mat3::identity(), m3 * invM3 ) );
00059 mat4 m4( 1, 2, 3, 4, 0, 6, 7, 8, 9, 10, 11, 12, -13, 14, -15, 16 );
00060 mat4 invM4 = inverse( m4 );
00061 BOOST_CHECK( isNearEqual( mat4::identity(), m4 * invM4 ) );
00062
00063
00064 BOOST_CHECK( isNearEqual( 100, lerp( 100, 200, 0 ) ) );
00065 BOOST_CHECK( isNearEqual( 150, lerp( 100, 200, 0.5 ) ) );
00066 BOOST_CHECK( isNearEqual( 200, lerp( 100, 200, 1 ) ) );
00067 {
00068 vec3 a( 1, 2, 3 ), b( 4, 5, 6 );
00069 BOOST_CHECK( isNearEqual( a, lerp( a, b, 0 ) ) );
00070 BOOST_CHECK( isNearEqual( b, lerp( a, b, 1 ) ) );
00071 BOOST_CHECK( isNearEqual( ( a + b ) * 0.5f, lerp( a, b, 0.5f ) ) );
00072 }
00073 }