ntr_bootrom/trunk/IrisMainp/include/IrisQUAT.h

200 lines
6.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.

//======================================================================
// IrisQUAT.h
// クォータニオンライブラリ
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_QUAT_H
#define _IRIS_QUAT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisTypes.h>
#include <IrisSinTable.h>
#define QM_S_SFT 14 // クォータニオンから行列への変換の精度調整定数
//----------------------------------------------------------------------
// 軸ベクトルと回転角からクォータニオンへの変換
//
//・軸ベクトルと回転角から求めたクォータニオンをdstpが指すクォータニオンへ格納します。
//
//・引数:
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
// dstp クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define VEC_Conv2Quat(axisp, theta, dstp) VEC_Conv2QuatPriv(SIN_NDIV_DEFAULT, axisp, theta, dstp)
void VEC_Conv2Quat256(const Vec *axisp, u32 theta, Quat *dstp);
void VEC_Conv2Quat1024(const Vec *axisp, u32 theta, Quat *dstp);
void VEC_Conv2Quat4096(const Vec *axisp, u32 theta, Quat *dstp);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define VEC_Conv2QuatPriv(ndiv, axisp, theta, dstp) VEC_Conv2QuatNDiv(ndiv, axisp, theta, dstp)
#define VEC_Conv2QuatNDiv(ndiv, axisp, theta, dstp) VEC_Conv2Quat##ndiv( axisp, theta, dstp)
//----------------------------------------------------------------------
// クォータニオンの内積
//
//・2つのクォータニオンの内積を求めます。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
//
//・戻り値:内積
//----------------------------------------------------------------------
s32 QUAT_DotProduct(const Quat *a, const Quat *b);
//----------------------------------------------------------------------
// クォータニオンの正規化
//
//・srcpが指すクォータニオンを正規化してdstpが指すクォータニオンへ格納します。
//
//・引数:
// srcp 未正規化クォータニオンのポインタ
// dstp 正規化クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void QUAT_Normalize(Quat *srcp, Quat *dstp);
//----------------------------------------------------------------------
// クォータニオンの逆数(逆回転)
//
//・srcpが指すクォータニオンの逆数を求め、dstpが指すクォータニオンへ格納します。
//
//・引数:
// srcp 元のクォータニオンのポインタ
// dstp 逆クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void QUAT_Inverse(Quat *srcp, Quat *dstp);
//----------------------------------------------------------------------
// クォータニオンの乗算
//
//・つのクォータニオンを乗算してaxbが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// axb 乗算クォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Multiply(Quat *a, Quat *b, Quat *axb);
//----------------------------------------------------------------------
// クォータニオンの加算
//
//・つのクォータニオンを加算した結果をa_bが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// a_b 加算後のクォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Add(Quat *a, Quat *b, Quat *a_b);
//----------------------------------------------------------------------
// クォータニオンの減算
//
//・srcpが指すクォータニオンをスケーリングした結果をdstpが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// a_b 減算後のクォータニオン格納バッファのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Sub(Quat *a, Quat *b, Quat *a_b);
//----------------------------------------------------------------------
// クォータニオンのスケーリング
//
//・つのクォータニオンをスケーリングした結果をa_bが指すクォータニオンへ格納します。
//
//・引数:
// srcp スケーリング前のクォータニオンのポインタ
// dstp スケーリング後のクォータニオン格納バッファのポインタ
// scale スケーリングパラメータ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Scale(Quat *srcp, Quat *dstp, s32 scale);
//----------------------------------------------------------------------
// クォータニオンの線形補間
//
//・つのクォータニオンを線形補間した結果をdが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// d 補間クォータニオン格納バッファのポインタ
// t 補間パラメータ
//
//・戻り値:なし
//----------------------------------------------------------------------
void QUAT_Lerp( Quat *p, Quat *q, Quat *d, s32 t);
//----------------------------------------------------------------------
// クォータニオンの球面線形補間
//
//・つのクォータニオンを球面線形補間した結果をdが指すクォータニオンへ格納します。
//
//・引数:
// a 第1クォータニオンのポインタ
// b 第2クォータニオンのポインタ
// d 補間クォータニオン格納バッファのポインタ
// t 補間パラメータ
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
void QUAT_Slerp(Quat *p, Quat *q, Quat *d, s32 t);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_QUAT_H