ntr_bootrom/trunk/IrisMainp/include/IrisGXC.h

2431 lines
87 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.

//======================================================================
// IrisGXC.h
// IRIS圧縮ディスプレイリストをバッファ(データTCM)へ生成
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_GXC_H
#define _IRIS_GXC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisGXB.h>
//----------------------------------------------------------------------
// 圧縮ディスプレイリストCPU転送
//
//・バッファに格納された圧縮ディスプレイリストを
// CPUにてジオメトリコマンドFIFOへ転送します。
//・転送前にコマンドワードのパッド領域がクリアされます。
//
//・引数:
// startp ディスプレイリストバッファの先頭ポインタ
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
//
//・戻り値:なし
//
//※TCM上のディスプレイリストはDMA転送できません。
//----------------------------------------------------------------------
#define GXC_CallList(startp, opp, prmp) \
{ \
GXC_ClearListPad(opp); \
GXB_CallList(startp, prmp); \
}
//----------------------------------------------------------------------
// 圧縮ディスプレイリストのコマンドワード・パッド領域のクリア
//
//・圧縮ディスプレイリスト中のコマンドワードのパッド領域をクリアします。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void GXC_ClearListPad(void *opp);
//----------------------------------------------------------------------
// ジオメトリコマンドのセット
//
//・圧縮ディスプレイリスト中にジオメトリコマンドをセットします。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// op セットするジオメトリコマンド
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_SetOp(opp, op) \
{ \
((u8 *)(opp))[0] = op; \
}
//----------------------------------------------------------------------
// バッファポインタ補正加算
//
//・圧縮ディスプレイリスト生成時のバッファポインタの補正加算を行います。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// prms パラメータ数
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_AddBufp(opp, prmp, prms) \
{ \
(prmp) += (prms); \
if ((++(u32 )(opp) & 0x3) == 0) (opp) = (prmp)++; \
}
//----------------------------------------------------------------------
// ビューポート設定
//
//・BG0面上におけるビューポートの左下座標と右上座標を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// startX 左下X座標8bit
// startY 左下Y座標
// endX 右上X座標
// endY 右上Y座標
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Viewport(opp, prmp, startX, startY, endX, endY) \
{ \
GXC_SetOp(opp, GXOP_VIEWPORT); \
\
(prmp)[0] = (u32 )(startX) << VIEWPORT_START_X_SHIFT \
| (u32 )(startY) << VIEWPORT_START_Y_SHIFT \
| (u32 )(endX) << VIEWPORT_END_X_SHIFT \
| (u32 )(endY) << VIEWPORT_END_Y_SHIFT; \
GXC_AddBufp(opp, prmp, GXOP_VIEWPORT_NPARAMS); \
}
//======================================================================
// 行列コマンド群
//======================================================================
//----------------------------------------------------------------------
// 行列モード設定
//
//・行列コマンドで操作するカレント行列を指定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// mode 行列モード
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_MtxMode(opp, prmp, mode) \
{ \
GXC_SetOp(opp, GXOP_MTX_MODE); \
\
(prmp)[0] = (mode); \
GXC_AddBufp(opp, prmp, GXOP_MTX_MODE_NPARAMS); \
}
//----------------------------------------------------------------------
// カレント行列のプッシュ
//
//・カレント行列を行列スタックへ退避する
// 圧縮ディスプレイリストを生成します。
//・行列スタックポインタは1つ進みます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_PushMtx(opp, prmp) \
{ \
GXC_SetOp(opp, GXOP_MTX_PUSH); \
\
GXC_AddBufp(opp, prmp, GXOP_MTX_PUSH_NPARAMS); \
}
//----------------------------------------------------------------------
// カレント行列のポップ
//
//・カレント行列を行列スタックから復元する
// 圧縮ディスプレイリストを生成します。
//・行列スタックポインタは指定した相対位置へ移動します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// relPos 相対位置(-30 31
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_PopMtx(opp, prmp, relPos) \
{ \
GXC_SetOp(opp, GXOP_MTX_POP); \
\
(prmp)[0] = (relPos); \
GXC_AddBufp(opp, prmp, GXOP_MTX_POP_NPARAMS); \
}
//----------------------------------------------------------------------
// カレント行列のストア
//
//・カレント行列を行列スタックの指定位置へ格納する
// 圧縮ディスプレイリストを生成します。
//・行列スタックポインタは移動しません。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// index インデックス0 30
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_StoreMtx(opp, prmp, index) \
{ \
GXC_SetOp(opp, GXOP_MTX_STORE); \
\
(prmp)[0] = (index); \
GXC_AddBufp(opp, prmp, GXOP_MTX_STORE_NPARAMS); \
}
//----------------------------------------------------------------------
// カレント行列のリストア
//
//・カレント行列を行列スタックの指定位置から取り出す
// 圧縮ディスプレイリストを生成します。
//・行列スタックポインタは移動しません。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// index インデックス0 30
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_RestoreMtx(opp, prmp, index) \
{ \
GXC_SetOp(opp, GXOP_MTX_RESTORE); \
\
GXC_AddBufp(opp, prmp, GXOP_MTX_RESTORE_NPARAMS); \
}
//----------------------------------------------------------------------
// 単位行列への初期化
//
//・カレント行列を単位行列に初期化する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Identity(opp, prmp) \
{ \
GXC_SetOp(opp, GXOP_MTX_IDENTITY); \
\
GXC_AddBufp(opp, prmp, GXOP_MTX_IDENTITY_NPARAMS); \
}
//----------------------------------------------------------------------
// 平行移動行列の適用
//
//・カレント行列に平行移動行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Translate(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_MTX_TRANS); \
\
(prmp)[0] = (x); \
(prmp)[1] = (y); \
(prmp)[2] = (z); \
GXC_AddBufp(opp, prmp, GXOP_MTX_TRANS_NPARAMS); \
}
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define _GXC_TranslateBefore(opp, prmp, x, y, z) \
{ \
(prmp)[0] = (x); \
(prmp)[1] = (y); \
(prmp)[2] = (z); \
GXC_AddBufp(opp, prmp, GXOP_MTX_TRANS_NPARAMS); \
}
//----------------------------------------------------------------------
// カレント行列へのロード
//
//・カレント行列に指定した行列を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// srcp ロードする行列のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LoadMtx( opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_LOAD_4x3); \
\
(prmp) = _GXB_SetMtx(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_LoadMtx33(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_LOAD_4x3); \
\
(prmp) = _GXB_SetMtx33(prmp, srcp); \
*(prmp)++ = 0; \
*(prmp)++ = 0; \
*(prmp)++ = 0; \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_LoadMtx44(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_LOAD_4x4); \
\
(prmp) = _GXB_SetMtx44(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 一般行列とカレント行列の乗算
//
//・カレント行列に指定した行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// srcp 適用する行列のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_MultMtx(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_SetMtx(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_MultMtx33(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_SetMtx33(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_MultMtx44(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \
\
(prmp) = _GXB_SetMtx44(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に一般行列を乗算
//
//・カレント行列へ平行移動行列と一般行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・GXC_Translate()GXC_MultMtx33() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x X成分
// y Y成分
// z Z成分
// srcp 適用する3x3行列のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Translate2MultMtx33(opp, prmp, x, y, z, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_SetMtx33(prmp, srcp); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// 転置行列の適用
//
//・カレント行列に指定した行列の転置行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// srcp 転置前の行列のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TransposeMtx(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_TransposeMtx(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_TransposeMtx33(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_TransposeMtx33(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_TransposeMtx44(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \
\
(prmp) = _GXB_TransposeMtx44(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に転置行列を適用
//
//・カレント行列へ平行移動行列と転置行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・GXC_Translate()GXC_TransposeMtx33() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// srcp 転置前の3x3行列のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Translate2TransposeMtx33(prmp, x, y, z, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_TransposeMtx33(prmp, srcp); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// スケール行列の適用(位置座標行列のみ)
//
//・カレント行列にスケール行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・行列モードが Position・Vector 同時設定モードの場合でも
// 位置座標行列のみに適用されます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Scale(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_MTX_SCALE); \
\
(prmp)[0] = (x) >>VG_SFT_DF; \
(prmp)[1] = (y) >>VG_SFT_DF; \
(prmp)[2] = (z) >>VG_SFT_DF; \
GXC_AddBufp(opp, prmp, GXOP_MTX_SCALE_NPARAMS); \
}
//----------------------------------------------------------------------
// スケール行列の適用(位置座標行列&方向ベクトル行列)
//
//・カレント行列にスケール行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・行列モードが Position・Vector 同時設定モードの場合には
// 位置座標行列と方向ベクトル行列の両方に適用されます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_ScaleWithVector(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_ScaleWithVector(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// スケール行列を適用(位置座標行列&方向ベクトル行列)
//
//・カレント行列へ平行移動行列とスケール行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・行列モードが Position・Vector 同時設定モードの場合には
// 位置座標行列と方向ベクトル行列の両方に適用されます。
//
//・GXC_Translate()GXC_ScaleWithVector() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// xT 平行移動のX成分
// yT 平行移動のY成分
// zT 平行移動のZ成分
// xS スケールのX成分
// yS スケールのY成分
// zS スケールのZ成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Translate2ScaleWithVector(opp, prmp, x, y, z, srcp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_ScaleWithVector(prmp, srcp); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// 主軸回転行列の適用
//
//・カレント行列に各主軸回りに回転する行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_RotateX(opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, SIN_NDIV_DEFAULT, theta)
#define GXC_RotateY(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, SIN_NDIV_DEFAULT, theta)
#define GXC_RotateZ(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, SIN_NDIV_DEFAULT, theta)
#define GXC_RotateX256( opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, 256, theta)
#define GXC_RotateY256( opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, 256, theta)
#define GXC_RotateZ256( opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, 256, theta)
#define GXC_RotateX1024(opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, 1024, theta)
#define GXC_RotateY1024(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, 1024, theta)
#define GXC_RotateZ1024(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, 1024, theta)
#define GXC_RotateX4096(opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, 4096, theta)
#define GXC_RotateY4096(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, 4096, theta)
#define GXC_RotateZ4096(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, 4096, theta)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_RotatePriv(opp, prmp, axis, ndiv, theta) \
GXC_RotateNDiv(opp, prmp, axis, ndiv, theta)
#define GXC_RotateNDiv(opp, prmp, axis, ndiv, theta) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_Rotate##axis##ndiv(prmp, theta); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に主軸回転行列を適用
//
//・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・GXC_Translate()GXC_Rotate[X|Y|Z][256|1024|4096]() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// theta 回転角度25610244096段階
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Translate2RotateX(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, SIN_NDIV_DEFAULT, theta)
#define GXC_Translate2RotateY(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, SIN_NDIV_DEFAULT, theta)
#define GXC_Translate2RotateZ(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, SIN_NDIV_DEFAULT, theta)
#define GXC_Translate2RotateX256(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, 256, theta)
#define GXC_Translate2RotateY256(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, 256, theta)
#define GXC_Translate2RotateZ256(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, 256, theta)
#define GXC_Translate2RotateX1024(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, 1024, theta)
#define GXC_Translate2RotateY1024(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, 1024, theta)
#define GXC_Translate2RotateZ1024(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, 1024, theta)
#define GXC_Translate2RotateX4096(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, 4096, theta)
#define GXC_Translate2RotateY4096(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, 4096, theta)
#define GXC_Translate2RotateZ4096(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, 4096, theta)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_Translate2RotatePriv(opp, prmp, x, y, z, axis, ndiv, theta) \
GXC_Translate2RotateNDiv(opp, prmp, x, y, z, axis, ndiv, theta)
#define GXC_Translate2RotateNDiv(opp, prmp, x, y, z, axis, ndiv, theta) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_Rotate##axis##ndiv(prmp, theta); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// 主軸回転行列(三角関数による回転角指定)の適用
//
//・カレント行列に各主軸回りに回転する行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・回転角度はサインとコサインにて指定します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_RotateXSinCos(opp, prmp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateXSinCos(prmp, sinA, cosA); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_RotateYSinCos(opp, prmp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateYSinCos(prmp, sinA, cosA); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_RotateZSinCos(opp, prmp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateZSinCos(prmp, sinA, cosA); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// 主軸回転行列(三角関数による回転角指定)を適用
//
//・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・回転角度はサインとコサインにて指定します。
//
//・GXC_Translate()GXC_Rotate[X|Y|Z]SinCos() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Translate2RotateXSinCos(opp, prmp, x, y, z, sinA, cosA) GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, X, sinA, cosA)
#define GXC_Translate2RotateYSinCos(opp, prmp, x, y, z, sinA, cosA) GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, Y, sinA, cosA)
#define GXC_Translate2RotateZSinCos(opp, prmp, x, y, z, sinA, cosA) GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, Z, sinA, cosA)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, axis, sinA, cosA) \
GXC_Translate2RotateSinCosNDiv(opp, prmp, x, y, z, axis, sinA, cosA)
#define GXC_Translate2RotateSinCosNDiv(opp, prmp, x, y, z, axis, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_RotateYSinCos(prmp, sinA, cosA); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// 任意軸回転行列の適用
//
//・カレント行列に任意のベクトルを軸として回転する行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_RotateAxis( opp, prmp, axisp, theta) GXC_RotateAxisPriv( SIN_NDIV_DEFAULT, opp, prmp, axisp, theta)
#define GXC_RotateAxisFast(opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(SIN_NDIV_DEFAULT, opp, prmp, axisp, theta)
#define GXC_RotateAxis256( opp, prmp, axisp, theta) GXC_RotateAxisPriv( 256, opp, prmp, axisp, theta)
#define GXC_RotateAxis256Fast( opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(256, opp, prmp, axisp, theta)
#define GXC_RotateAxis1024( opp, prmp, axisp, theta) GXC_RotateAxisPriv( 1024, opp, prmp, axisp, theta)
#define GXC_RotateAxis1024Fast(opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(1024, opp, prmp, axisp, theta)
#define GXC_RotateAxis4096( opp, prmp, axisp, theta) GXC_RotateAxisPriv( 4096, opp, prmp, axisp, theta)
#define GXC_RotateAxis4096Fast(opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(4096, opp, prmp, axisp, theta)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_RotateAxisPriv( ndiv, opp, prmp, axisp, theta) \
GXC_RotateAxisNDiv( ndiv, opp, prmp, axisp, theta)
#define GXC_RotateAxisNDiv( ndiv, opp, prmp, axisp, theta) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateAxis##ndiv(prmp, axisp, theta); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_RotateAxisPrivFast(ndiv, opp, prmp, axisp, theta) \
GXC_RotateAxisNDivFast(ndiv, opp, prmp, axisp, theta)
#define GXC_RotateAxisNDivFast(ndiv, opp, prmp, axisp, theta) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateAxis##ndiv##Fast(prmp, axisp, theta); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に任意軸回転行列を適用
//
//・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//・GXC_Translate()GXC_RotateAxis[256|1024|4096][Fast]() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_Translate2RotateAxis( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, SIN_NDIV_DEFAULT, axisp, theta)
#define GXC_Translate2RotateAxisFast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, SIN_NDIV_DEFAULT, axisp, theta)
#define GXC_Translate2RotateAxis256( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, 256, axisp, theta)
#define GXC_Translate2RotateAxis256Fast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, 256, axisp, theta)
#define GXC_Translate2RotateAxis1024( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, 1024, axisp, theta)
#define GXC_Translate2RotateAxis1024Fast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, 1024, axisp, theta)
#define GXC_Translate2RotateAxis4096( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, 4096, axisp, theta)
#define GXC_Translate2RotateAxis4096Fast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, 4096, axisp, theta)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, ndiv, axisp, theta) \
GXC_Translate2RotateAxisNDiv( opp, prmp, x, y, z, ndiv, axisp, theta)
#define GXC_Translate2RotateAxisNDiv( opp, prmp, x, y, z, ndiv, axisp, theta) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_RotateAxis##ndiv(prmp, axisp, theta); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
#define GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, ndiv, axisp, theta) \
GXC_Translate2RotateAxisNDivFast(opp, prmp, x, y, z, ndiv, axisp, theta)
#define GXC_Translate2RotateAxisNDivFast(opp, prmp, x, y, z, ndiv, axisp, theta) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_RotateAxis##ndiv##Fast(prmp, axisp, theta); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// 任意軸回転行列(三角関数による回転角指定)の適用
//
//・カレント行列に任意のベクトルを軸として回転する行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・回転角度はサインとコサインにて指定します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// axisp 回転軸ベクトルのポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_RotateAxisSinCos(opp, prmp, axisp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateAxisSinCos(prmp, axisp, sinA, cosA); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_RotateAxisSinCosFast(opp, prmp, axisp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_RotateAxisSinCosFast(prmp, axisp, sinA, cosA); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// 任意軸回転行列(三角関数による回転角指定)を適用
//
//・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算する
// 圧縮ディスプレイリストを生成します。
//・回転角度はサインとコサインにて指定します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//・GXC_Translate()GXC_RotateAxisSinCos[Fast]() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// axisp 回転軸ベクトルのポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_Translate2RotateAxisSinCos( opp, prmp, x, y, z, axisp, sinA, cosA) GXC_Translate2RotateAxisSinCosPriv( opp, prmp, x, y, z, axisp, sinA, cosA)
#define GXC_Translate2RotateAxisSinCosFast(opp, prmp, x, y, z, axisp, sinA, cosA) GXC_Translate2RotateAxisSinCosPrivFast(opp, prmp, x, y, z, axisp, sinA, cosA)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_Translate2RotateAxisSinCosPriv( opp, prmp, x, y, z, axisp, sinA, cosA) \
GXC_Translate2RotateAxisSinCosNDiv( opp, prmp, x, y, z, axisp, sinA, cosA)
#define GXC_Translate2RotateAxisSinCosNDiv( opp, prmp, x, y, z, axisp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_RotateAxisSinCos(prmp, axisp, sinA, cosA); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
#define GXC_Translate2RotateAxisSinCosPrivFast(opp, prmp, x, y, z, axisp, sinA, cosA) \
GXC_Translate2RotateAxisSinCosNDivFast(opp, prmp, x, y, z, axisp, sinA, cosA)
#define GXC_Translate2RotateAxisSinCosNDivFast(opp, prmp, x, y, z, axisp, sinA, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_RotateAxisSinCosFast(prmp, axisp, sinA, cosA); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// Z軸にアライメントする回転行列の適用
//
//・カレント行列に任意軸をZ軸の正方向と一致させる回転を行う行列を乗算する
// 圧縮ディスプレイリストを生成します。
//
// H = sqrt (X*X + Z*Z)
//
// [ 1 ] [ Z/H -X/H ] [ Z/H -X/H ]
// [ v ] [ H/1 -Y/1 ] [ 1 ] = [ v ] [ -YX/H H -YZ/H ]
// [ Y/1 H/1 ] [ X/H Z/H ] [ X Y Z ]
//
//・関数内で平方根演算器と除算器を使用します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます)
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_AlignZ(opp, prmp, vLookInvp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_AlignZ(prmp, vLookInvp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// Z軸にアライメントする回転行列を適用
//
//・カレント行列へ平行移動行列と任意軸をZ軸の正方向と一致させる回転を行う行列
// との結合行列を乗算する、圧縮ディスプレイリストを生成します。
//
// H = sqrt (X*X + Z*Z)
//
// [ 1 ] [ Z/H -X/H ] [ Z/H -X/H ]
// [ v ] [ H/1 -Y/1 ] [ 1 ] = [ v ] [ -YX/H H -YZ/H ]
// [ Y/1 H/1 ] [ X/H Z/H ] [ X Y Z ]
//
//・関数内で平方根演算器と除算器を使用します。
//・GXC_Translate()GXC_AlignZ() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます)
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_Translate2AlignZ(opp, prmp, x, y, z, vLookInvp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_AlignZ(prmp, vLookInvp); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// クォータニオンから変換した回転行列の適用
//
//・カレント行列へクォータニオンから変換した回転行列を適用する
// 圧縮ディスプレイリストを生成します。
//
//・通常版は除算器を使用しますが、高速版は使用しません
// (高速版には正規化クォータニオンを渡して下さい)。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// quatp クォータニオンのポインタ
//
//・戻り値:なし
//
//※通常版は除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
#define GXC_QuatMtx(opp, prmp, quatp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_QuatMtx(prmp, quatp); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_QuatMtxFast(opp, prmp, quatp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \
\
(prmp) = _GXB_QuatMtxFast(prmp, quatp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// クォータニオンから変換した回転行列を適用
//
//・カレント行列へ平行移動行列とクォータニオンから変換した回転行列
// の結合行列を乗算する、圧縮ディスプレイリストを生成します。
//
//・通常版は除算器を使用しますが、高速版は使用しません
// (高速版には正規化クォータニオンを渡して下さい)。
//・GXC_Translate()GXC_QuatMtx[Fast]() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// quatp クォータニオンのポインタ
//
//・戻り値:なし
//
//※通常版は除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// ストールしてしまいます。
//----------------------------------------------------------------------
#define GXC_Translate2QuatMtx( opp, prmp, x, y, z, quatp) GXC_Translate2QuatMtxPriv( opp, prmp, x, y, z, quatp)
#define GXC_Translate2QuatMtxFast(opp, prmp, x, y, z, quatp) GXC_Translate2QuatMtxPrivFast(opp, prmp, x, y, z, quatp)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_Translate2QuatMtxPriv( opp, prmp, x, y, z, quatp) \
GXC_Translate2QuatMtxNDiv( opp, prmp, x, y, z, quatp)
#define GXC_Translate2QuatMtxPrivFast(opp, prmp, x, y, z, quatp) \
GXC_Translate2QuatMtxNDivFast(opp, prmp, x, y, z, quatp)
#define GXC_Translate2QuatMtxNDiv( opp, prmp, x, y, z, quatp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_QuatMtx(prmp, quatp); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
#define GXC_Translate2QuatMtxNDivFast(opp, prmp, x, y, z, quatp) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_QuatMtxFast(prmp, quatp); \
_GXC_TranslateBefore(opp, prmp, x, y, z); \
}
//----------------------------------------------------------------------
// 左右対称の透視射影行列の適用
//
//・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算する
// 圧縮ディスプレイリストを生成します。
//
//・関数内で除算器を使用します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// fovy 縦方向の視野角度25610244096段階
// aspect 横方向の視野を確定する縦横比(視界での 幅/高さ)
// near 視点からnearクリップ面までの距離常に正
// far 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_Perspective(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(SIN_NDIV_DEFAULT, opp, prmp, fovy, aspect, near, far, scaleW)
#define GXC_Perspective256(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(256, opp, prmp, fovy, aspect, near, far, scaleW)
#define GXC_Perspective1024(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(1024, opp, prmp, fovy, aspect, near, far, scaleW)
#define GXC_Perspective4096(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(4096, opp, prmp, fovy, aspect, near, far, scaleW)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GXC_PerspectivePriv(ndiv, opp, prmp, fovy, aspect, near, far, scaleW) \
GXC_PerspectiveNDiv(ndiv, opp, prmp, fovy, aspect, near, far, scaleW)
#define GXC_PerspectiveNDiv(ndiv, opp, prmp, fovy, aspect, near, far, scaleW) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \
\
(prmp) = _GXB_Perspective##ndiv(prmp, fovy, aspect, near, far, scaleW); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 左右対称の透視射影行列(三角関数による視野角指定)の適用
//
//・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算する
// 圧縮ディスプレイリストを生成します。
//・視野角度はサインとコサインにて指定します。
//
//・関数内で除算器を使用します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// sinA 縦方向の視野角度のサイン
// cosA 縦方向の視野角度のコサイン(上位関数からの呼び出し高速化のため最後に渡す)
// aspect 横方向の視野を確定する縦横比(視界での 幅/高さ)
// near 視点からnearクリップ面までの距離常に正
// far 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_PerspectiveSinCos(opp, prmp, sinA, aspect, near, far, scaleW, cosA) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \
\
(prmp) = _GXB_PerspectiveSinCos(prmp, sinA, aspect, near, far, scaleW, cosA); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 透視射影行列の適用
//
//・透視法視錐台の行列を作成し、それをカレント行列へ乗算する
// 圧縮ディスプレイリストを生成します。
//
//・関数内で除算器を使用します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// t nearクリップ面上辺のy座標
// b nearクリップ面下辺のy座標
// l nearクリップ面左辺のx座標
// r nearクリップ面右辺のx座標
// n 視点からnearクリップ面までの距離常に正
// f 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_Frustum(opp, prmp, t, b, l, r, n, f, scaleW) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \
\
(prmp) = _GXB_Frustum(prmp, t, b, l, r, n, f, scaleW); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 正射影行列の適用
//
//・正射影の平行視体積の行列を作成し、それをカレント行列へ乗算する
// 圧縮ディスプレイリストを生成します。
//
//・関数内で除算器を使用します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// t nearクリップ面上辺のy座標
// b nearクリップ面下辺のy座標
// l nearクリップ面左辺のx座標
// r nearクリップ面右辺のx座標
// n 視点からnearクリップ面までの距離正負どちらでも可
// f 視点からfarクリップ面までの距離 (正負どちらでも可)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_Ortho(opp, prmp, t, b, l, r, n, f, scaleW) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \
\
(prmp) = _GXB_Ortho(prmp, t, b, l, r, n, f, scaleW); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 視界行列の適用
//
//・視界行列を作成し、それをカレント行列へ乗算する
// 圧縮ディスプレイリストを生成します。
//
//・関数内でベクトルの正規化のために平方根演算器と除算器を使用します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// eye 視点
// at 注視点
// vUp 上方向ベクトル
// vDst 0NULLポインタ以外を渡すと、視線逆方向ベクトルを返します
//
//・戻り値:なし
//
//※平方根演算器と除算器を使用するため、TCM上で実行したとしても
// ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には
// CPUのストールが発生してしまいます。
//----------------------------------------------------------------------
#define GXC_LookAt(opp, prmp, eye, at, vUp, vDst) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_LookAt(prmp, eye, at, vUp, vDst); \
GXC_AddBufp(opp, prmp, 0); \
}
#define GXC_LookAtFast(opp, prmp, eye, at, vUp, vDst) \
{ \
GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \
\
(prmp) = _GXB_LookAtFast(prmp, eye, at, vUp, vDst); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// ボックステスト
//
//・立方体が視体積に入るかどうかをテストための構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// box テストボックスXYZWHD161616161616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_BoxTest1(opp, prmp, box) \
{ \
GXC_SetOp(opp, GXOP_BOX_TEST); \
\
*(TestBox *)&(prmp)[0] = (box); \
GXC_AddBufp(opp, prmp, GXOP_BOX_TEST_NPARAMS); \
}
//----------------------------------------------------------------------
// ボックステスト
//
//・立方体が視体積に入るかどうかをテストために各パラメータを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x テストボックス左下X座標16bit
// y テストボックス左下Y座標
// z テストボックス左下Z座標
// w テストボックス幅
// h テストボックス高さ
// d テストボックス奥行き
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_BoxTest6(opp, prmp, x, y, z, w, h, d) \
{ \
GXC_SetOp(opp, GXOP_BOX_TEST); \
\
(prmp)[0] = XY1616(x, y); \
(prmp)[1] = ZW1616(z, w); \
(prmp)[2] = HD1616(h, d); \
GXC_AddBufp(opp, prmp, GXOP_BOX_TEST_NPARAMS); \
}
//----------------------------------------------------------------------
// 位置座標テスト
//
//・テスト用の位置座標の構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// pos 位置座標XYZ161616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_PositionTest1(opp, prmp, pos) \
{ \
GXC_SetOp(opp, GXOP_POS_TEST); \
\
*(Pos16 *)&(prmp)[0] = (pos); \
GXC_AddBufp(opp, prmp, GXOP_POS_TEST_NPARAMS); \
}
//----------------------------------------------------------------------
// 位置座標テスト
//
//・テスト用の位置座標の各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 位置座標X成分16bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_PositionTest3(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_POS_TEST); \
\
(prmp)[0] = XY1616(x, y); \
(prmp)[1] = (z); \
GXC_AddBufp(opp, prmp, GXOP_POS_TEST_NPARAMS); \
}
//----------------------------------------------------------------------
// 方向ベクトルテスト
//
//・テスト用の方向ベクトル構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// vector 方向ベクトルXYZ101010
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VectorTest1(opp, prmp, vector) \
{ \
GXC_SetOp(opp, GXOP_VEC_TEST); \
\
*(Vec10 *)&(prmp)[0] = (vector); \
GXC_AddBufp(opp, prmp, GXOP_VEC_TEST_NPARAMS); \
}
//----------------------------------------------------------------------
// 方向ベクトルテスト
//
//・テスト用の方向ベクトルの各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 方向ベクトルX成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VectorTest3(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_VEC_TEST); \
\
(prmp)[0] = XYZ101010(x, y, z); \
GXC_AddBufp(opp, prmp, GXOP_VEC_TEST_NPARAMS); \
}
//----------------------------------------------------------------------
// ライトベクトル設定
//
//・ライトベクトルへライトベクトル構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// lightVector ライトベクトルXYZ101010
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LightVector1(opp, prmp, lightVector) \
{ \
GXC_SetOp(opp, GXOP_LIGHT_VECTOR); \
\
*(LightVector *)&(prmp)[0] = (lightVector); \
GXC_AddBufp(opp, prmp, GXOP_LIGHT_VECTOR_NPARAMS); \
}
//----------------------------------------------------------------------
// ライトカラー設定
//
//・ライトカラーへライトカラー構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// lightColor ライトカラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LightColor1(opp, prmp, lightColor) \
{ \
GXC_SetOp(opp, GXOP_LIGHT_COLOR); \
\
*(LightColor *)&(prmp)[0] = (lightColor); \
GXC_AddBufp(opp, prmp, GXOP_LIGHT_COLOR_NPARAMS); \
}
//----------------------------------------------------------------------
// ライトベクトル設定
//
//・ライトベクトルへライト番号と方向ベクトルを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// no ライト番号
// vector 方向ベクトルXYZ101010
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LightVector2(opp, prmp, no, vector) \
{ \
GXC_SetOp(opp, GXOP_LIGHT_VECTOR); \
\
(prmp)[0] = ((no)<<LIGHT_ID_SHIFT | *(u32 *)&(vector)); \
GXC_AddBufp(opp, prmp, GXOP_LIGHT_VECTOR_NPARAMS); \
}
//----------------------------------------------------------------------
// ライトカラー設定
//
//・ライトカラーへライト番号とカラーを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// no ライト番号
// color カラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LightColor2(opp, prmp, no, color) \
{ \
GXC_SetOp(opp, GXOP_LIGHT_COLOR); \
\
(prmp)[0] = ((no)<<LIGHT_ID_SHIFT | *(u16 *)&(color)); \
GXC_AddBufp(opp, prmp, GXOP_LIGHT_COLOR_NPARAMS); \
}
//----------------------------------------------------------------------
// ライトベクトル設定
//
//・ライトベクトルへライト番号と方向ベクトルの各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// no ライト番号
// x 方向ベクトルX成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LightVector4(opp, prmp, no, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_LIGHT_VECTOR); \
\
(prmp)[0] = LIGHT_VECTOR(no, x, y, z); \
GXC_AddBufp(opp, prmp, GXOP_LIGHT_VECTOR_NPARAMS); \
}
//----------------------------------------------------------------------
// ライトカラー設定
//
//・ライトカラーへライト番号とカラーの各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// no ライト番号
// r 赤成分5bit
// g 緑成分( 〃
// b 青成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_LightColor4(opp, prmp, no, r, g, b) \
{ \
GXC_SetOp(opp, GXOP_LIGHT_COLOR); \
\
(prmp)[0] = LIGHT_COLOR(no, r, g, b); \
GXC_AddBufp(opp, prmp, GXOP_LIGHT_COLOR_NPARAMS); \
}
//----------------------------------------------------------------------
// 鏡面反射輝度テーブルの設定
//
//・8bitの128要素からなる鏡面反射輝度テーブルを設定する
// 圧縮ディスプレイリストを生成します。
//・全要素をまとめて転送する必要があります。
//・このテーブルを書き換えることによって、1シーン中に複数の
// 鏡面反射効果を持ったポリゴンを表示することができます。。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// srcp 鏡面反射輝度テーブルのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_ShininessTable(opp, prmp, srcp) \
{ \
GXC_SetOp(opp, GXOP_SHININESS); \
\
(prmp) = _GXB_ShininessTable(prmp, srcp); \
GXC_AddBufp(opp, prmp, 0); \
}
//----------------------------------------------------------------------
// 全マテリアルカラー設定
//
//・全マテリアルカラーと関連フラグをまとめた64bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// colors 全マテリアルカラーデータRGB555 | 頂点カラー更新フラグ、鏡面反射輝度テーブル有効フラグ含む)
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_MaterialColor1(opp, prmp, colors) \
{ GXC_DiffuseAmbient1( opp, prmp, ((u32 *)&(colors))[0]);\
GXC_SpecularEmission1(opp, prmp, ((u32 *)&(colors))[1]);\
}
//----------------------------------------------------------------------
// 全マテリアルカラー設定
//
//・各マテリアルカラーとそれらに関連したフラグを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// dif ディフューズカラーRGB555 | 頂点カラー更新フラグ含む)
// amb アンビエントカラーRGB555
// spe スペキュラカラー RGB555 | 鏡面反射輝度テーブル有効フラグ含む)
// emi エミッションカラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_MaterialColor4(opp, prmp, dif, amb, spe, emi) \
{ GXC_DiffuseAmbient2( opp, prmp, dif, amb); \
GXC_SpecularEmission2(opp, prmp, spe, emi); \
}
//----------------------------------------------------------------------
// 全マテリアルカラー設定
//
//・各マテリアルカラーの各要素と関連フラグを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// setCol 頂点カラー更新フラグ
// tbl 鏡面反射輝度テーブル有効フラグ
// dr ディフューズカラー赤成分5bit
// dg 緑成分( 〃
// db 青成分( 〃
// ar アンビエントカラー赤成分( 〃
// ag 緑成分( 〃
// ab 青成分( 〃
// sr スペキュラカラー 赤成分( 〃
// sg 緑成分( 〃
// sb 青成分( 〃
// er エミッションカラー赤成分( 〃
// eg 緑成分( 〃
// eb 青成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_MaterialColor14(opp, prmp, setCol, tbl, dr, dg, db, ar, ag, ab, sr, sg, sb, er, eg, eb) \
{ GXC_DiffuseAmbient7(opp, prmp, setCol, dr, dg, db, ar, ag, ab); \
GXC_SpecularEmission7(opp, prmp, tbl, sr, sg, sb, er, eg, eb); \
}
//----------------------------------------------------------------------
// ディフューズ&アンビエントカラー設定
//
//・ディフューズカラーとアンビエントカラーをまとめた32bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// colors ディフューズアンビエントカラーRGB555 | 頂点カラー更新フラグ含む)
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_DiffuseAmbient1(opp, prmp, colors) \
{ \
GXC_SetOp(opp, GXOP_DIF_AMB); \
\
(prmp)[0] = (colors); \
GXC_AddBufp(opp, prmp, GXOP_DIF_AMB_NPARAMS); \
}
//----------------------------------------------------------------------
// スペキュラ&エミッションカラー設定
//
//・スペキュラカラーとエミッションカラーをまとめた32bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// colors スペキュラエミッションカラーRGB555 | 鏡面反射輝度テーブル有効フラグ含む)
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_SpecularEmission1(opp, prmp, colors) \
{ \
GXC_SetOp(opp, GXOP_SPE_EMI); \
\
(prmp)[0] = (colors); \
GXC_AddBufp(opp, prmp, GXOP_SPE_EMI_NPARAMS); \
}
//----------------------------------------------------------------------
// ディフューズ&アンビエントカラー設定
//
//・ディフューズカラーとアンビエントカラーを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// dif ディフューズカラーRGB555 | 頂点カラー更新フラグ含む)
// amb アンビエントカラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_DiffuseAmbient2(opp, prmp, dif, amb) \
{ \
GXC_SetOp(opp, GXOP_DIF_AMB); \
\
(prmp)[0] = (*(u16 *)&(dif) | (*(u16 *)&(amb))<<16); \
GXC_AddBufp(opp, prmp, GXOP_DIF_AMB_NPARAMS); \
}
//----------------------------------------------------------------------
// スペキュラ&エミッションカラー設定
//
//・スペキュラカラーとエミッションカラーを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// spe スペキュラカラー RGB555 | 鏡面反射輝度テーブル有効フラグ含む)
// emi エミッションカラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_SpecularEmission2(opp, prmp, spe, emi) \
{ \
GXC_SetOp(opp, GXOP_SPE_EMI); \
\
(prmp)[0] = (*(u16 *)&(spe) | (*(u16 *)&(emi))<<16); \
GXC_AddBufp(opp, prmp, GXOP_SPE_EMI_NPARAMS); \
}
//----------------------------------------------------------------------
// ディフューズ&アンビエントカラー設定
//
//・ディフューズカラーとアンビエントカラーの各要素と
// 頂点カラー更新フラグを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// setCol 頂点カラー更新フラグ
// dr ディフューズカラー赤成分5bit
// dg 緑成分( 〃
// db 青成分( 〃
// ar アンビエントカラー赤成分( 〃
// ag 緑成分( 〃
// ab 青成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_DiffuseAmbient7(opp, prmp, setCol, dr, dg, db, ar, ag, ab) \
{ \
GXC_SetOp(opp, GXOP_DIF_AMB); \
\
(prmp)[0] = ((setCol) | RGB555(dr, dg, db) \
| RGB555(ar, ag, ab)<<16); \
GXC_AddBufp(opp, prmp, GXOP_DIF_AMB_NPARAMS); \
}
//----------------------------------------------------------------------
// スペキュラ&エミッションカラー設定
//
//・スペキュラカラーとエミッションカラーの各要素と
// 鏡面反射輝度テーブル有効フラグを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// tbl 鏡面反射輝度テーブル有効フラグ
// sr スペキュラカラー 赤成分5bit
// sg 緑成分( 〃
// sb 青成分( 〃
// er エミッションカラー赤成分( 〃
// eg 緑成分( 〃
// eb 青成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_SpecularEmission7(opp, prmp, tbl, sr, sg, sb, er, eg, eb) \
{ \
GXC_SetOp(opp, GXOP_SPE_EMI); \
\
(prmp)[0] = ((tbl) | RGB555(sr, sg, sb) \
| RGB555(er, eg, eb)<<16); \
GXC_AddBufp(opp, prmp, GXOP_SPE_EMI_NPARAMS); \
}
//----------------------------------------------------------------------
// ポリゴン属性の設定
//
//・ポリゴン属性をまとめた32bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// attr ポリゴン属性
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_PolygonAttr1(opp, prmp, attr) \
{ \
GXC_SetOp(opp, GXOP_POLYGON_ATTR); \
\
(prmp)[0] = (attr); \
GXC_AddBufp(opp, prmp, GXOP_POLYGON_ATTR_NPARAMS); \
}
//----------------------------------------------------------------------
// ポリゴン属性の設定
//
//・ポリゴンのIDとアルファ値と他の属性を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// id ID 6bit
// alpha アルファ値5bit
// attr 他のポリゴン属性
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_PolygonAttr3(opp, prmp, id, alpha, attr) \
{ \
GXC_SetOp(opp, GXOP_POLYGON_ATTR); \
\
(prmp)[0] = (id) <<POLYATTR_ID_SHIFT \
| (alpha)<<POLYATTR_ALPHA_SHIFT \
| (attr); \
GXC_AddBufp(opp, prmp, GXOP_POLYGON_ATTR_NPARAMS); \
}
//----------------------------------------------------------------------
// テクスチャイメージパラメータ設定(シフト調整無し)
//
//・テクスチャィメージのパラメータをまとめた32bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//・テクスチャイメージベース値はシフト調整した値を渡して下さい。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// param テクスチャイメージパラメータ32bit
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TexImageParam1(opp, prmp, param) \
{ \
GXC_SetOp(opp, GXOP_TEXIMAGE_PARAM); \
\
(prmp)[0] = (param); \
GXC_AddBufp(opp, prmp, GXOP_TEXIMAGE_PARAM_NPARAMS); \
}
//----------------------------------------------------------------------
// テクスチャイメージパラメータ設定(シフト調整有り)
//
//・テクスチャィメージのパラメータを設定する
// 圧縮ディスプレイリストを生成します。
//・テクスチャイメージベース値のシフト調整が行われますので、
// アドレスをそのまま渡して下さい。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// basep テクスチャイメージのベースポインタ
// param テクスチャイメージパラメータ16bit
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TexImageParam2(opp, prmp, basep, param) \
{ \
GXC_SetOp(opp, GXOP_TEXIMAGE_PARAM); \
\
(prmp)[0] = Addr2TexImageBase(basep) | (param); \
GXC_AddBufp(opp, prmp, GXOP_TEXIMAGE_PARAM_NPARAMS); \
}
//----------------------------------------------------------------------
// テクスチャパレットベース設定(シフト調整無し)
//
//・テクスチャパレットベースのパラメータをまとめた32bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//・テクスチャパレットベース値はシフト調整した値を渡して下さい。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// basep テクスチャパレットのベースポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TexPlttBase1(opp, prmp, basep) \
{ \
GXC_SetOp(opp, GXOP_TEXPLTT_BASE); \
\
(prmp)[0] = (u32 )(basep); \
GXC_AddBufp(opp, prmp, GXOP_TEXPLTT_BASE_NPARAMS); \
}
//----------------------------------------------------------------------
// テクスチャパレットベース設定(シフト調整有り)
//
//・テクスチャパレットベースのパラメータを設定する
// 圧縮ディスプレイリストを生成します。
//・テクスチャパレットベース値のシフト調整を行いますので、
// アドレスをそのまま渡して下さい。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// basep テクスチャパレットのベースポインタ
// mode テクスチャモード
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TexPlttBase2(opp, prmp, basep, mode) \
{ \
GXC_SetOp(opp, GXOP_TEXPLTT_BASE); \
\
(prmp)[0] = Addr2TexPlttBase(basep, mode); \
GXC_AddBufp(opp, prmp, GXOP_TEXPLTT_BASE_NPARAMS); \
}
//----------------------------------------------------------------------
// プリミティブの頂点リスト開始
//
//・プリミティブの頂点リストの開始を宣言する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// primType プリミティブタイプ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Begin(opp, prmp, primType) \
{ \
GXC_SetOp(opp, GXOP_BEGIN); \
\
(prmp)[0] = (primType); \
GXC_AddBufp(opp, prmp, GXOP_BEGIN_NPARAMS); \
}
//----------------------------------------------------------------------
// プリミティブの頂点リスト終了
//
//・プリミティブの頂点リストの終了を宣言する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_End(opp, prmp) \
{ \
GXC_SetOp(opp, GXOP_END); \
\
GXC_AddBufp(opp, prmp, GXOP_END_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点カラーの直接設定
//
//・頂点カラーを直接設定する、圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// color カラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Color1(opp, prmp, color) \
{ \
GXC_SetOp(opp, GXOP_COLOR); \
\
(prmp)[0] = *(u16 *)&(color); \
GXC_AddBufp(opp, prmp, GXOP_COLOR_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点カラーの直接設定
//
//・頂点カラーの各要素を直接設定する、圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// r 赤成分5bit
// g 緑成分( 〃
// b 青成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Color3(opp, prmp, r, g, b) \
{ \
GXC_SetOp(opp, GXOP_COLOR); \
\
(prmp)[0] = RGB555(r, g, b); \
GXC_AddBufp(opp, prmp, GXOP_COLOR_NPARAMS); \
}
//----------------------------------------------------------------------
// 法線ベクトル
//
//・法線ベクトルへ10bitベクトル構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// normal 方向ベクトルXYZ101010
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Normal1(opp, prmp, normal) \
{ \
GXC_SetOp(opp, GXOP_NORMAL); \
\
*(Vec10 *)&(prmp)[0] = (normal); \
GXC_AddBufp(opp, prmp, GXOP_NORMAL_NPARAMS); \
}
//----------------------------------------------------------------------
// 法線ベクトル
//
//・法線ベクトルへ10bitベクトルフォーマットの各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 方向ベクトルX成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Normal3(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_NORMAL); \
\
(prmp)[0] = XYZ101010(x, y, z); \
GXC_AddBufp(opp, prmp, GXOP_NORMAL_NPARAMS); \
}
//----------------------------------------------------------------------
// テクスチャ座標
//
//・テクスチャ座標へテクスチャ座標構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// coord テクスチャ座標ST1616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TexCoord1(opp, prmp, coord) \
{ \
GXC_SetOp(opp, GXOP_TEXCOORD); \
\
*(TexCoord *)&(prmp)[0] = (coord); \
GXC_AddBufp(opp, prmp, GXOP_TEXCOORD_NPARAMS); \
}
//----------------------------------------------------------------------
// テクスチャ座標
//
//・テクスチャ座標へ各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// s テクスチャ座標S成分16bit
// t T成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_TexCoord2(opp, prmp, s,t) \
{ \
GXC_SetOp(opp, GXOP_TEXCOORD); \
\
(prmp)[0] = ST1616(s, t); \
GXC_AddBufp(opp, prmp, GXOP_TEXCOORD_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点座標の設定と頂点の生成
//
//・頂点座標へ16bitフォーマット構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// pos 位置座標XYZ161616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Vertex1(opp, prmp, pos) \
{ \
GXC_SetOp(opp, GXOP_VTX_16); \
\
*(Pos16 *)&(prmp)[0] = (pos); \
GXC_AddBufp(opp, prmp, GXOP_VTX_16_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点座標の設定と頂点の生成
//
//・頂点座標へ16bitフォーマットの各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 位置座標X成分16bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_Vertex3(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_VTX_16); \
\
(prmp)[0] = XY1616(x, y); \
(prmp)[1] = (z); \
GXC_AddBufp(opp, prmp, GXOP_VTX_16_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点座標10bitの設定と頂点の生成
//
//・頂点座標へ10bitフォーマット構造体を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// pos 位置座標XYZ101010
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexShort1(opp, prmp, pos) \
{ \
GXC_SetOp(opp, GXOP_VTX_10); \
\
*(Pos10 *)&(prmp)[0] = (pos); \
GXC_AddBufp(opp, prmp, GXOP_VTX_10_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点座標10bitの設定と頂点の生成
//
//・頂点座標へ10bitフォーマットの各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 位置座標X成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexShort3(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_VTX_10); \
\
(prmp)[0] = XYZ101010(x, y, z); \
GXC_AddBufp(opp, prmp, GXOP_VTX_10_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点XY座標の設定と頂点の生成
//
//・頂点のX座標とY座標をまとめた32bitデータを設定Z座標は最後の設定値を使用する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// pos 位置座標XY1616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexXY1(opp, prmp, pos) \
{ \
GXC_SetOp(opp, GXOP_VTX_XY); \
\
*(Pos2D16 *)&(prmp)[0] = (pos); \
GXC_AddBufp(opp, prmp, GXOP_VTX_XY_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点XY座標の設定と頂点の生成
//
//・頂点のX座標とY座標を設定Z座標は最後の設定値を使用する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 位置座標X成分16bit
// y Y成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexXY2(opp, prmp, x, y) \
{ \
GXC_SetOp(opp, GXOP_VTX_XY); \
\
(prmp)[0] = XY1616(x, y); \
GXC_AddBufp(opp, prmp, GXOP_VTX_XY_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点XZ座標の設定と頂点の生成
//
//・頂点のX座標とZ座標をまとめた32bitデータを設定Y座標は最後の設定値を使用する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// pos 位置座標XZ1616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexXZ1(opp, prmp, pos) \
{ \
GXC_SetOp(opp, GXOP_VTX_XZ); \
\
*(Pos2D16 *)&(prmp)[0] = (pos); \
GXC_AddBufp(opp, prmp, GXOP_VTX_XZ_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点XZ座標の設定と頂点の生成
//
//・頂点のX座標とZ座標を設定Y座標は最後の設定値を使用する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 位置座標X成分16bit
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexXZ2(opp, prmp, x, z) \
{ \
GXC_SetOp(opp, GXOP_VTX_XZ); \
\
(prmp)[0] = XY1616(x, z); \
GXC_AddBufp(opp, prmp, GXOP_VTX_XZ_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点YZ座標の設定と頂点の生成
//
//・頂点のY座標とZ座標をまとめた32bitデータを設定X座標は最後の設定値を使用する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// pos 位置座標YZ1616
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexYZ1(opp, prmp, pos) \
{ \
GXC_SetOp(opp, GXOP_VTX_YZ); \
\
*(Pos2D16 *)&(prmp)[0] = (pos); \
GXC_AddBufp(opp, prmp, GXOP_VTX_YZ_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点YZ座標の設定と頂点の生成
//
//・頂点のY座標とZ座標を設定X座標は最後の設定値を使用する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// y 位置座標Y成分16bit
// z Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexYZ2(opp, prmp, y, z) \
{ \
GXC_SetOp(opp, GXOP_VTX_YZ); \
\
(prmp)[0] = XY1616(y, z); \
GXC_AddBufp(opp, prmp, GXOP_VTX_YZ_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点座標差分の設定と頂点の生成
//
//・頂点座標の差分値をまとめた32bitデータを設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// diff 位置座標差分XYZ101010
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexDiff1(opp, prmp, diff) \
{ \
GXC_SetOp(opp, GXOP_VTX_DIFF); \
\
*(Pos10 *)&(prmp)[0] = (diff); \
GXC_AddBufp(opp, prmp, GXOP_VTX_DIFF_NPARAMS); \
}
//----------------------------------------------------------------------
// 頂点座標差分の設定と頂点の生成
//
//・頂点座標の差分値の各要素を設定する
// 圧縮ディスプレイリストを生成します。
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// x 位置座標差分X成分10bit
// y 差分Y成分
// z 差分Z成分
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_VertexDiff3(opp, prmp, x, y, z) \
{ \
GXC_SetOp(opp, GXOP_VTX_DIFF); \
\
(prmp)[0] = XYZ101010(x, y, z); \
GXC_AddBufp(opp, prmp, GXOP_VTX_DIFF_NPARAMS); \
}
//----------------------------------------------------------------------
// レンダリングエンジン参照データ群のスワップ
//
//・このコマンドを発行した直後のVブランク期間開始時に、
// ポリゴンリストRAM、頂点RAM、レンダリング関連レジスタ等、
// レンダリングエンジンが参照するデータを切り替える
// 圧縮ディスプレイリストを生成します。
//・書き込んだグラフィックスデータが描画へ反映されるのは
// このコマンドを発行した次のフレームになります
//
//・引数:
// opp ディスプレイリストバッファ中のコマンド領域のポインタ
// prmp ディスプレイリストバッファ中のパラメータ領域のポインタ
// flags フラグ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GXC_SwapBuffers(opp, prmp, flags) \
{ \
GXC_SetOp(opp, GXOP_SWAP_BUFFERS); \
\
(prmp)[0] = (flags); \
GXC_AddBufp(opp, prmp, GXOP_SWAP_BUFFERS_NPARAMS); \
}
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_GXC_H