Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

test_glsl_math.cpp

Go to the documentation of this file.
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     //  test 'cross'
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     //  m * v = ( 1, 3 ) * ( 1 )
00035     //          ( 2, 4 )   ( 2 )
00036     BOOST_CHECK( isNearEqual( vec2( 7, 10 ), m * v ) );
00037 
00038     //  v * m = ( 1, 2 ) * ( 1, 3 )
00039     //                     ( 2, 4 )
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     //  quat
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     //  inverse
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     //  lerp
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 }

Generated on Fri Dec 24 00:51:36 2004 for glsl_math by doxygen 1.3.6