ntr_bootrom/trunk/IrisMainp/include/IrisVEC.h

242 lines
7.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//======================================================================
// IrisVEC.h
// ベクトルライブラリ
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_VEC_H
#define _IRIS_VEC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
//----------------------------------------------------------------------
// ベクトルのコピー
//
//・各ベクトル間でサイズに合わせてコピーします。
//・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)
//----------------------------------------------------------------------
// ベクトルの外積
//
//・つのベクトルの外積ベクトルを求め、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);
//----------------------------------------------------------------------
// ベクトルの加算
//
//・つのベクトルを加算した結果をa_bが指すベクトルへ格納します。
//
//・引数:
// a 第1ベクトルのポインタ
// b 第2ベクトルのポインタ
// a_b 加算後のベクトル格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void VEC_Add(Vec *a, Vec *b, Vec *ab);
//----------------------------------------------------------------------
// ベクトルの減算
//
//・つのベクトルを減算した結果を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);
//----------------------------------------------------------------------
// ベクトルの線形補間
//
//・つのベクトルを線形補間した結果を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