実装の過程本項では、swizzle 指定可能なベクトル演算クラスを 実装する過程についてまとめます。 興味がなければ、読み飛ばして頂いても差し支えありません。 動機付けまずはじめに、swizzle 指定可能なベクトル演算クラスが必要となる事例を挙げ、 実装するに至る動機付けの部分を明確にしておきます。 演算対象となる成分をコンパイラに伝える仕組み今回の実装では、シェーダ言語で用いられる手法を真似ることにします。 swizzle 指定方法(ベクトルの場合)任意の swizzle 指定でアクセスできる参照を返すメソッドを実装し、 これを用いて swizzle 指定を行います。 具体的には、 swizzle 指定方法(行列の場合)行列の swizzle 指定は、 ベクトルのように成分の並びを個別指定する手法ではなく、 次元数の指定のみを行うインターフェースとします。 swizzle 指定メソッド全種を展開swizzle 指定メソッドは、 swizzle の総パターン数分必要になります。 ベクトルで 808 種類、行列で 32 種類必要になります。 これらをあらかじめ定義しておく必要があります。 スマートではありませんが、他に方法がありません。 template を活用演算対象の swizzle パターンごとに operator を定義する必要がありますが、 これをそのまま記述することは不可能なので、 template を活用し、 swizzle パターンに対応する operator をコンパイラに生成させます。 inline 展開、そしてコンパイラの最適化頼みすべてのメソッドを inline 展開させます。 inline 指定子では不十分なので、 VC++ の __forceinline 指定子を用います。 次元数が一致しない場合の動作に配慮例えば、次のような記述をした場合の動作を考える必要があります。 |