Vector 〜その1〜

うう、前使っていたブログサイトと違って、いろんな書き方ができて感激…。
まぁめんどくさいからそんなに使う気はないけど。

とりあえず、ゲームプログラミングらしいと言う事で、しばらくはベクトルについて考えて見ます。

最初に目標を立てておかないと途中で破綻するので下に書いておきます。

1.実行速度
2.他のベクトルクラスとの互換性
3.汎用性

上から順に高プラオリティ。
途中でどうしようか迷ったら
 実行速度 >> 他のベクトルクラスとの互換性 >>>> 汎用性
って、感じの優先度で考えてきます。

まぁ実行速度は早くするというよりかは遅くならない程度に考えておけばいいか。
後々この部分がネックになってくるのよねぇ…。

他のベクトルクラスとの互換性はかなり力を入れたいと思います。
DirectXPhysXとかで使用されている独自クラスが出てくるとややこしいのよ…。

あーあと大事な事を忘れてた。

ヘルパー関数は全部自力で書く!

まぁ勉強(っていうか、復習も)の意味も込めて自力で書きます。
決してDirectXのヘルパー関数なんぞ使わないぞ!

とりあえず、下のようなベクトルクラスを下地にして作ってきます。

    
#include #include // ################################################################################################# template< unsigned int D, typename T = float > struct Vector{ template< int Index > struct Int2Type{ enum{ Value = Index }; }; typedef T ValueType; enum{ Dimension = D }; ValueType mValue[ Dimension ]; Vector(){} Vector(ValueType x, ValueType y = 0.0f, ValueType z = 0.0f, ValueType w = 1.0f){ (*this)(x, y, z, w); } void operator ()(ValueType x, ValueType y = 0.0f, ValueType z = 0.0f, ValueType w = 1.0f){ SetValue(x, y, z, w, Int2Type() ); } private: template< int Index > void SetValue(ValueType x, ValueType y, ValueType z, ValueType w, Int2Type&){} void SetValue(ValueType x, ValueType y, ValueType z, ValueType w, Int2Type<0>&){ mValue[0] = x; } void SetValue(ValueType x, ValueType y, ValueType z, ValueType w, Int2Type<1>&){ mValue[0] = x; mValue[1] = y; } void SetValue(ValueType x, ValueType y, ValueType z, ValueType w, Int2Type<2>&){ mValue[0] = x; mValue[1] = y; mValue[2] = z; } void SetValue(ValueType x, ValueType y, ValueType z, ValueType w, Int2Type<3>&){ mValue[0] = x; mValue[1] = y; mValue[2] = z; mValue[3] = w; } }; // ################################################################################################# template< unsigned int D, typename T > std::ostream& operator <<(std::ostream& os, Vector& vec){ os << "vec[" << D << "]:"; for( unsigned int i = 0 ; i < (D-1) ; i++ ){ os << vec.mValue[i] << ", "; } os << vec.mValue[D-1]; return os; } // ################################################################################################# int main(){ typedef Vector<2, float> Vector2; Vector2 vec2(0.4f, 3.f); std::cout << vec2 << "\n"; return 0; } // ################################################################################################# 実行結果: vec[2]:0.4, 3

※基本的にゲームプログラミング特化なので、多少は目をつぶって下さい。(特に SetValue() のあたりとか…)

続きはまた明日。