swizzle 対応ベクトル演算クラスについて

swizzle 対応ベクトル演算クラスが、 どのような機能を持つものなのか、実例を挙げながら概略をまとめます。 swizzle 対応ベクトル演算クラスとは、 次のようなスタイルの記述を可能にするものです。

記述例
	vecC.xyzw() = vecA.xyzw() + vecB.xyzw() ;
xyzw の部分が swizzle 指定と呼ばれています。 この記述は、ベクトルの x y z w の各成分を並列に加算することを意味し、 具体的には次のような動作をします。

動作
	vecC.x = vecA.x + vecB.x ;
	vecC.y = vecA.y + vecB.y ;
	vecC.z = vecA.z + vecB.z ;
	vecC.w = vecA.w + vecB.w ;
swizzle 指定部には、x y z w を任意の順序に並べて記述できます。 例えば次のような記述も可能です。

記述例
	vecC.wxy() = vecA.ywz() + vecB.zww() ;
動作
	vecC.w = vecA.y + vecB.z ;
	vecC.x = vecA.w + vecB.w ;
	vecC.y = vecA.z + vecB.w ;
xyzw 以外にも rgba 表記の swizzle 指定が可能です。

記述例
	vecC.rgba() = vecA.rgba() + vecB.rgba() ;
動作
	vecC.r = vecA.r + vecB.r ;
	vecC.g = vecA.g + vecB.g ;
	vecC.b = vecA.b + vecB.b ;
	vecC.a = vecA.a + vecB.a ;
xyzw と rgba 混在表記も可能です。

記述例
	vecB.xyzw() = vecA.rgba() ;
動作
	vecB.x = vecA.r ;
	vecB.y = vecA.g ;
	vecB.z = vecA.b ;
	vecB.w = vecA.a ;
ベクトルとスカラが混在する表記も可能です。

記述例
	vecA.xyz() /= vecA.w() ;
動作
	vecA.x /= vecA.w ;
	vecA.y /= vecA.w ;
	vecA.z /= vecA.w ;
専用の算術関数と組み合わせることで、複雑な演算を直感的に記述することが可能です。

記述例
	float Result = Dot( Cross( vecA.xyz() , vecB.xyz() ) , vecC.xyz() );
動作

	Result
	=	(rvecA.y * rvecB.z - rvecA.z * rvecB.y) * vecC.x
	+	(rvecA.z * rvecB.x - rvecA.x * rvecB.z) * vecC.y
	+	(rvecA.x * rvecB.y - rvecA.y * rvecB.x) * vecC.z ;
行列を扱うことも可能です。例えば、行ベクトルと 4x4 行列の積は、 次のように記述できます。
	vecA.xyzw() = vecB.xyzw() * matB.m4x4() ;
3x3 行列として計算したい場合は、次のように記述します。
	vecA.xyz() = vecB.xyz() * matB.m3x3() ;
次の例では、4x4 行列のうち、3x3 成分のみを転置しています。
	matA.m3x3() = Transpose( matB.m3x3() );