アップ。
こんな感じになりました。
#includeusing namespace gslib::glsl_math; vec2 a( 1, 2 ); vec2 b( 2, 3 ); vec2 c = a + b; // = ( 3, 5 ) vec2 d = a * b; // = ( 2, 6 ) // column major ( same as GLSL ) mat2 m( 1, 3, // 1 2 2, 4 ); // 3 4 vec2 e = m * a; // = ( 7, 10 ) right hand system ( OpenGL ) vec2 f = a * m; // = ( 5, 11 ) left hand system ( DirectX ) vec4 v4( 1, 2, 3, 4 ); vec2& v4_xy = v4.xy(); // = ( 1, 2 ) simplified swizzle function. return reference vec2& v4_zw = v4.zw(); // swizzle function is only continuous combination. xy, yz, zw are ok! but xz yx xx don't exist. // rotate 90 around z axis quat q( vec3( 0, 0, 1 ), radians( 90 ) ); quat x( 1, 0, 0, 0 ); quat y = q * x * conj( q ); // = ( 0, 1, 0, 0 )
https://sourceforge.jp/projects/gslib/
から .zip を落とせます。
.zip の中にいろいろありますけど、それは大人の事情です。実質的には、一ファイルしかないんで、
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gslib/GSLib/Code/gslib/glsl_math/glsl_math.h
を見れば、全部見れます。ヘッダだけのお気軽なのはいいんですが、「実装速度最優先」が今回の最大目標だったので、テンプレート使いまくりにつき、コンパイル速度が遅かったりするかもしれません。実行速度は目も当てられないぐらい、遅いと思います。基本的に boost をインストールしないと使えませんが、使っているのは BOOST_ASSERT だけなので、assert に置きかえれば、それだけで boost も要らなくなります。
[ GLSL 仕様内実装済み機能 ]
- vec2
- vec3
- vec4
- mat2
- mat3
- mat4
- 各クラスのコンストラクタと、4則演算子
- dot
- cross
- length
- distance
- normalize
- 制限された swizzle 演算子っぽい cast 関数
- radians ( float のみ )
- degrees ( float のみ )
[ 独自機能(実装済み)]
nv_math や gems を参考にしました。
- quat と4則演算子
- conj
- inverse
- transpose
- det
- lerp
- slerp
- spline
[ GLSL 仕様内未実装機能 ]
とりあえず、後回し
- ivecX
- bvecX
- ivec, bvec 関連関数の全て
- GLSLangSpec.Full.1.10.59.pdf の 8.3 Common Functions 全て
- GLSLangSpec.Full.1.10.59.pdf の 8.6 Vector Relat ional Functions 全て
- GLSLangSpec.Full.1.10.59.pdf の 8.5 Mat rix Functions 全て
- radians ( float 以外 )
- degrees ( float 以外 )
- reflect
- refract