//====================================================================== // IrisVEC.h // ベクトルライブラリ // // Copyright (C) 2002-2003 NINTENDO Co.,Ltd. //====================================================================== #ifndef _IRIS_VEC_H #define _IRIS_VEC_H #ifdef __cplusplus extern "C" { #endif #include #include //---------------------------------------------------------------------- // ベクトルのコピー // //・各ベクトル間でサイズに合わせてコピーします。 //・VEC_AlignPoint2Vec10() / VEC10_AlignPoint2Vec() は16bitベクトルと // 10bitベクトル間での固定小数点位置の調整も行います。 // //・引数: // srcp 転送元ベクトルのポインタ // dstp 転送先ベクトルバッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_Copy2Vec10(const Vec *srcp, Vec10 *dstp); void VEC_Copy2Vec32(const Vec *srcp, Vec32 *dstp); void VEC32_Copy2Vec(const Vec32 *srcp, Vec *dstp); void VEC_AlignPoint2Vec10(const Vec *srcp, Vec10 *dstp); void VEC10_AlignPoint2Vec(const Vec10 *srcp, Vec *dstp); //---------------------------------------------------------------------- // ベクトルの内積 // //・2つのベクトルの内積を求めます。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // //・戻り値:内積 //---------------------------------------------------------------------- s32 VEC_DotProduct( const Vec *a, const Vec *b); s32 VEC32_DotProduct( const Vec32 *a, const Vec32 *b); s32 VEC32_DotProductFast(const Vec32 *a, const Vec32 *b); s32 VEC32VEC_DotProduct( const Vec32 *a, const Vec *b); #define VEC2D_DotProduct(ax, ay, bx, by) (((ax) * (bx) + (ay) * (by)) >>V_SFT) //---------------------------------------------------------------------- // ベクトルの外積 // //・2つのベクトルの外積ベクトルを求め、axbが指すベクトルへ格納します。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // axb 外積ベクトル格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_CrossProduct( Vec *a, Vec *b, Vec *axb); void VEC32_CrossProduct( Vec32 *a, Vec32 *b, Vec32 *axb); void VEC32_CrossProductFast(Vec32 *a, Vec32 *b, Vec32 *axb); #define VEC2D_CrossProduct(ax, ay, bx, by) (((ax) * (by) - (ay) * (bx)) >>V_SFT) //---------------------------------------------------------------------- // ベクトルの正規化 // //・srcpが指すベクトルを正規化してdstpが指すベクトルへ格納します。 // //・引数: // srcp 未正規化ベクトルのポインタ // dstp 正規化ベクトル格納バッファのポインタ // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- void VEC_Normalize( Vec *srcp, Vec *dstp); void VEC32_Normalize( Vec32 *srcp, Vec32 *dstp); void VEC32_Normalize2Vec(Vec32 *srcp, Vec *dstp); //---------------------------------------------------------------------- // ベクトルの加算 // //・2つのベクトルを加算した結果をa_bが指すベクトルへ格納します。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // a_b 加算後のベクトル格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_Add(Vec *a, Vec *b, Vec *ab); //---------------------------------------------------------------------- // ベクトルの減算 // //・2つのベクトルを減算した結果をa_bが指すベクトルへ格納します。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // a_b 減算後のベクトル格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_Sub(Vec *a, Vec *b, Vec *a_b); //---------------------------------------------------------------------- // ベクトルのスケーリング // //・srcpが指すベクトルをスケーリングした結果をdstpが指すベクトルへ格納します。 // //・引数: // srcp スケーリング前のベクトルのポインタ // dstp スケーリング後のベクトル格納バッファのポインタ // scale スケーリングパラメータ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_Scale(Vec *srcp, Vec *dstp, s32 scale); //---------------------------------------------------------------------- // ベクトルの反転 // //・srcpが指すベクトルを反転した結果をdstpが指すベクトルへ格納します。 // //・引数: // srcp 反転前のベクトルのポインタ // dstp 反転後のベクトル格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_Reverse(const Vec *srcp, Vec *dstp); //---------------------------------------------------------------------- // ベクトルの大きさ // //・ベクトルの大きさを求めます。 // //・引数: // v 入力ベクトルのポインタ // //・戻り値:大きさ // //※平方根演算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- u32 VEC_Magnitude(const Vec *v); //---------------------------------------------------------------------- // ベクトルの大きさの2乗 // //・ベクトルの大きさの2乗を求めます。 // //・引数: // v 入力ベクトルのポインタ // //・戻り値:大きさの2乗 //---------------------------------------------------------------------- u32 VEC_SquareMagnitude(const Vec *v); //---------------------------------------------------------------------- // ベクトル間の距離 // //・ベクトル間の距離を求めます。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // //・戻り値:距離 // //※平方根演算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- u32 VEC_Distance(const Vec *a, const Vec *b); //---------------------------------------------------------------------- // ベクトル間の距離の2乗 // //・ベクトル間の距離の2乗を求めます。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // //・戻り値:距離の2乗 //---------------------------------------------------------------------- u32 VEC_SquareDistance(const Vec *a, const Vec *b); //---------------------------------------------------------------------- // ベクトルの線形補間 // //・2つのベクトルを線形補間した結果をdが指すベクトルへ格納します。 // //・引数: // a 第1ベクトルのポインタ // b 第2ベクトルのポインタ // d 補間ベクトル格納バッファのポインタ // t 補間パラメータ // //・戻り値:なし //---------------------------------------------------------------------- void VEC_Lerp(Vec *a, Vec *b, Vec *d, s32 t); void VEC32_Lerp(Vec32 *a, Vec32 *b, Vec32 *d, s32 t); void VEC32_LerpFast(Vec32 *a, Vec32 *b, Vec32 *d, s32 t); #ifdef __cplusplus } // extern "C" #endif #endif // _IRIS_VEC_H