mirror of
https://github.com/rvtr/ntr_bootrom.git
synced 2025-10-31 07:11:11 -04:00
200 lines
6.4 KiB
C
200 lines
6.4 KiB
C
//======================================================================
|
||
// 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 回転角度[256|1024|4096段階]
|
||
// 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);
|
||
|
||
//----------------------------------------------------------------------
|
||
// クォータニオンの乗算
|
||
//
|
||
//・2つのクォータニオンを乗算してaxbが指すクォータニオンへ格納します。
|
||
//
|
||
//・引数:
|
||
// a 第1クォータニオンのポインタ
|
||
// b 第2クォータニオンのポインタ
|
||
// axb 乗算クォータニオン格納バッファのポインタ
|
||
//
|
||
//・戻り値:なし
|
||
//----------------------------------------------------------------------
|
||
|
||
void QUAT_Multiply(Quat *a, Quat *b, Quat *axb);
|
||
|
||
//----------------------------------------------------------------------
|
||
// クォータニオンの加算
|
||
//
|
||
//・2つのクォータニオンを加算した結果を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);
|
||
|
||
//----------------------------------------------------------------------
|
||
// クォータニオンのスケーリング
|
||
//
|
||
//・2つのクォータニオンをスケーリングした結果をa_bが指すクォータニオンへ格納します。
|
||
//
|
||
//・引数:
|
||
// srcp スケーリング前のクォータニオンのポインタ
|
||
// dstp スケーリング後のクォータニオン格納バッファのポインタ
|
||
// scale スケーリングパラメータ
|
||
//
|
||
//・戻り値:なし
|
||
//----------------------------------------------------------------------
|
||
|
||
void QUAT_Scale(Quat *srcp, Quat *dstp, s32 scale);
|
||
|
||
//----------------------------------------------------------------------
|
||
// クォータニオンの線形補間
|
||
//
|
||
//・2つのクォータニオンを線形補間した結果をdが指すクォータニオンへ格納します。
|
||
//
|
||
//・引数:
|
||
// a 第1クォータニオンのポインタ
|
||
// b 第2クォータニオンのポインタ
|
||
// d 補間クォータニオン格納バッファのポインタ
|
||
// t 補間パラメータ
|
||
//
|
||
//・戻り値:なし
|
||
//----------------------------------------------------------------------
|
||
|
||
void QUAT_Lerp( Quat *p, Quat *q, Quat *d, s32 t);
|
||
|
||
//----------------------------------------------------------------------
|
||
// クォータニオンの球面線形補間
|
||
//
|
||
//・2つのクォータニオンを球面線形補間した結果を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
|