試作:GLSL互換ベクトルクラス

シェーダーのベクトルはswizzle機能が最高です。これをC++で実現するのは長年の夢でした。さらに、SIMDを実装に用いれれば...最高です!
一応、こんなことができるところまで行きました。

using namespace glsl_math;

vec4 a( 1, 2, 3, 4 ), b( 5, 6, 7, 8 );
vec4 c( a );
c += b;
BOOST_CHECK( vec4( 6, 8, 10, 12 ) == c );
BOOST_CHECK( a.wzyx() == vec4( 4, 3, 2, 1 ) );
vec4 d( a.wyxz() );
BOOST_CHECK( vec4( 4, 2, 1, 3 ) == d );
d.yzwx() = b.xywz();
BOOST_CHECK( vec4( 7, 5, 6, 8 ) == d );

vec3 e( d );
BOOST_CHECK( vec3( 7, 5, 6 ) == e );

swizzle に () が必要なこと以外は、glsl互換です。ただ、断念しました。
理由は、コンパイル速度が猛烈に遅いので、実用に耐えないことと、SIMDの効率的な使い方にめどが立たないためです(現在は、無理やり使っているという表現が近いです)。コンパイルが遅い理由は、swizzle の組みあわせを全て関数として実装しているため、xyzw(), xyzz(), wzyx() ... rgba(), argb(), aaar() ... 等組みあわせが爆発的に多いためです。

ソースコード:
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gslib/GSLib/Code/glsl_math/

テストコード:
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gslib/GSLib/Test/glsl_math/test_vec4.cpp