ntr_bootrom/trunk/IrisMainp/include/IrisGX.h

2610 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.

//======================================================================
// IrisGX.h
// IRIS 3Dグラフィックスエンジンライブラリ
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_GX_H
#define _IRIS_GX_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisTarget.h>
#include <IrisMemoryMap.h>
#include <IrisMacro.h>
#include <IrisSinTable.h>
//----------------------------------------------------------------------
// ディスプレイリストDMA転送
//
//・ジオメトリコマンドFIFOからの要求信号によってDMA転送が行われます。
//・DMAのイネーブルフラグをポーリングして終了するまで待ちます。
//
//・引数:
// dmaNo DMA番号
// listp ディスプレイリストのポインタ
// length ディスプレイリストの長さ(ワード単位)
//
//・戻り値:なし
//
//※TCM上のディスプレイリストはDMA転送できません。
//----------------------------------------------------------------------
#define GX_DmaList(dmaNo, listp, length) \
{ \
GX_Dma(dmaNo, listp, length); \
WaitDma(dmaNo); \
}
//----------------------------------------------------------------------
// ディスプレイリスト高速DMA転送
//
//・終了までシステムバスをCPUコアへ開放しないことによって
// 高速にDMA転送を行います。
//
//・引数:
// dmaNo DMA番号
// listp ディスプレイリストのポインタ
// length ディスプレイリストの長さ(ワード単位)
//
//・戻り値:なし
//
//※TCM上のディスプレイリストはDMA転送できません。
//----------------------------------------------------------------------
#define GX_DmaListFast(dmaNo, listp, length) \
\
GX_DmaFast(dmaNo, listp, length)
//----------------------------------------------------------------------
// ディスプレイリストDMA非同期転送
//
//・ジオメトリコマンドFIFOからの要求信号によってDMA転送が行われます。
//・DMAの終了チェックは行いません。次のDMA転送の前に GX_WaitDma() 等
// で終了チェックをして下さい。
//
//・引数:
// dmaNo DMA番号
// listp ディスプレイリストのポインタ
// length ディスプレイリストの長さ(ワード単位)
//
//・戻り値:なし
//
//※TCM上のディスプレイリストはDMA転送できません。
//----------------------------------------------------------------------
#define GX_DmaListAsync(dmaNo, listp, length) \
\
GX_Dma(dmaNo, listp, length)
//----------------------------------------------------------------------
// ディスプレイリストDMA転送終了待ち
//
//・DMAのイネーブルフラグをポーリングして終了するのを待ちます。
//
//・引数:
// dmaNo DMA番号
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_WaitDma(dmaNo) WaitDma(dmaNo)
//----------------------------------------------------------------------
// ジオメトリ&レンダリングエンジンのオーバーフローが発生しているか?
//
//・レンダリングエンジンもしくはレンダリングエンジンのオーバーフローが
// 発生しているかどうかを返します。
//
//・引数: なし
//
//・戻り値:
// 非0 オーバーフロー発生
// 0 オーバーフロー未発生
//----------------------------------------------------------------------
#define GX_IsOverflows() (((vu8 *)REG_DISP3DCNT)[1] & ((DISP3D_GEOMETRY_OVER | DISP3D_RENDER_OVER)>>8))
#define GX_IsGeometryOverflow() (((vu8 *)REG_DISP3DCNT)[1] & (DISP3D_GEOMETRY_OVER>>8))
#define GX_IsRenderingOverflow() (((vu8 *)REG_DISP3DCNT)[1] & (DISP3D_RENDER_OVER>>8))
//----------------------------------------------------------------------
// ジオメトリ&レンダリングエンジンのオーバーフローフラグのクリア
//
//・レンダリングエンジンもしくはレンダリングエンジンのオーバーフローフラグ
// をクリアします。
//
//・引数: なし
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_ClearOverflows() (((vu8 *)REG_DISP3DCNT)[1] |=((DISP3D_GEOMETRY_OVER | DISP3D_RENDER_OVER)>>8))
#define GX_ClearGeometryOverflow() (((vu8 *)REG_DISP3DCNT)[1] |= (DISP3D_GEOMETRY_OVER>>8))
#define GX_ClearRenderingOverflow() (((vu8 *)REG_DISP3DCNT)[1] |= (DISP3D_RENDER_OVER>>8))
//----------------------------------------------------------------------
// ジオメトリエンジン・ステータス読み込み
//
//・ジオメトリエンジン・ステータスレジスタの値を返します。
//
//・引数: なし
//
//・戻り値:ジオメトリエンジン・ステータス
//----------------------------------------------------------------------
#define GX_GetGeometryStatus() (*(vu32 *)REG_GXSTAT))
//----------------------------------------------------------------------
// ジオメトリエンジンは動作中か?
//
//・ジオメトリエンジンが動作中かどうかを返します。
//
//・引数: なし
//
//・戻り値:
// 非0 動作中
// 0 停止中
//----------------------------------------------------------------------
#define GX_IsGeometryBusy() (((vu8 *)REG_GXSTAT)[3] & (GXSTAT_GEOMETRY_BUSY>>24))
//----------------------------------------------------------------------
// ジオメトリエンジン停止待ち
//
//・ジオメトリエンジンが停止するのを待ちます。
//
//・引数: なし
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_WaitGeometry() \
{ while (GX_IsGeometryBusy()) ; \
}
//----------------------------------------------------------------------
// ジオメトリFIFOのクリア
//
//・ジオメトリコマンドFIFOをクリアします。
//
//・引数: なし
//
//・戻り値:なし
//----------------------------------------------------------------------
void GX_ClearFifo(void);
//----------------------------------------------------------------------
// ジオメトリFIFOカウンタ読み込み
//
//・ジオメトリコマンドFIFOをカウンタ値を返します。
//
//・引数: なし
//
//・戻り値:カウンタ値
//----------------------------------------------------------------------
#define GX_GetFifoCount() (((vGxStat *)REG_GXSTAT)->fifoCount)
//----------------------------------------------------------------------
// ジオメトリFIFOチェック(一杯/半分以下/空)
//
//・ジオメトリコマンドFIFOの充填度をチェックします。
//
//・引数: なし
//
//・戻り値:
// 非0 各条件を満たしている
// 0 各条件を満たしていない
//----------------------------------------------------------------------
#define GX_IsFifoFull() (((vu8 *)REG_GXSTAT)[3] & (GXSTAT_FIFO_FULL>>24))
#define GX_IsFifoUnderHalf() (((vu8 *)REG_GXSTAT)[3] & (GXSTAT_FIFO_UNDER_HALF>>24))
#define GX_IsFifoEmpty() (((vu8 *)REG_GXSTAT)[3] & (GXSTAT_FIFO_EMPTY>>24))
#define GX_WaitFifoNotFull() \
{ while (GX_IsFifoFull()) ; \
}
#define GX_WaitFifoUnderHalf() \
{ while (!GX_IsFifoUnderHalf()) ; \
}
#define GX_WaitFifoEmpty() \
{ while (!GX_IsFifoEmpty()) ; \
}
//----------------------------------------------------------------------
// ビューポート設定
//
//・BG0面上におけるビューポートの左下座標と右上座標を設定します。
//
//・引数:
// startX 左下X座標8bit
// startY 左下Y座標
// endX 右上X座標
// endY 右上Y座標
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Viewport(startX, startY, endX, endY) \
{ \
*(vu32 *)REG_VIEWPORT = (u32 )(startX) << VIEWPORT_START_X_SHIFT \
| (u32 )(startY) << VIEWPORT_START_Y_SHIFT \
| (u32 )(endX) << VIEWPORT_END_X_SHIFT \
| (u32 )(endY) << VIEWPORT_END_Y_SHIFT; \
}
//======================================================================
// 行列コマンド群
//======================================================================
//----------------------------------------------------------------------
// 行列モード設定
//
//・行列コマンドで操作するカレント行列を指定します。
//
//・引数:
// mode 行列モード
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_MtxMode(mode) (*(vu32 *)REG_MTX_MODE = (mode))
//----------------------------------------------------------------------
// カレント行列のプッシュ
//
//・カレント行列を行列スタックへ退避します。
//・行列スタックポインタは1つ進みます。
//
//・引数: なし
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_PushMtx() (*(vs32 *)REG_MTX_PUSH = 0)
//----------------------------------------------------------------------
// カレント行列のポップ
//
//・カレント行列を行列スタックから復元します。
//・行列スタックポインタは指定した相対位置へ移動します。
//
//・引数:
// relPos 相対位置(-30 31
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_PopMtx(relPos) (*(vs32 *)REG_MTX_POP = (relPos))
//----------------------------------------------------------------------
// カレント行列のストア
//
//・カレント行列を行列スタックの指定位置へ格納します。
//・行列スタックポインタは移動しません。
//
//・引数:
// index インデックス0 30
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_StoreMtx(index) (*(vs32 *)REG_MTX_STORE = (index))
//----------------------------------------------------------------------
// カレント行列のリストア
//
//・カレント行列を行列スタックの指定位置から取り出します。
//・行列スタックポインタは移動しません。
//
//・引数:
// index インデックス0 30
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_RestoreMtx(index) (*(vs32 *)REG_MTX_RESTORE = (index))
//----------------------------------------------------------------------
// 行列スタックポインタのクリア
//
//・行列スタックポインタをクリアします。
//
//・引数: なし
//
//・戻り値:なし
//----------------------------------------------------------------------
void GX_ClearMtxStackPtr(void);
//----------------------------------------------------------------------
// 行列スタックコマンド完了待ち
//
//・行列スタックコマンドの完了を待ちます。
//
//・引数: なし
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_WaitMtxStackCmd() \
{ while (GX_IsMtxStackCmdBusy()) ; \
}
//----------------------------------------------------------------------
// 行列スタックのオーバーフロー/アンダーフローが発生しているか?
//
//・行列スタックのオーバーフロー/アンダーフローが発生しているかどうかを返します。
//
//・引数: なし
//
//・戻り値:
// 非0 オーバーフロー/アンダーフロー発生
// 0 オーバーフロー/アンダーフロー未発生
//----------------------------------------------------------------------
#define GX_IsMtxStackError() (((vu8 *)REG_GXSTAT)[1] & (GXSTAT_MTX_STACK_ERROR>>8))
//----------------------------------------------------------------------
// 行列スタックコマンドがジオメトリFIFOへ残っているか?
//
//・行列スタックコマンドがジオメトリFIFOへ残っているかどうかを返します。
//
//・引数: なし
//
//・戻り値:
// 非0 未実行行列スタックコマンドあり
// 0 未実行行列スタックコマンドなし
//----------------------------------------------------------------------
#define GX_IsMtxStackCmdBusy() (((vu8 *)REG_GXSTAT)[1] & (GXSTAT_MTX_STACK_BUSY>>8))
//----------------------------------------------------------------------
// 行列スタックレベル読み込み
//
//・行列スタックレベルを返します。
//・行列スタックコマンドの完了を待ってから読み込みます。
//
//・引数: なし
//
//・戻り値:行列スタックレベル
//----------------------------------------------------------------------
__inline static u8 GX_GetProjStackLevel(void)
{
GX_WaitMtxStackCmd(); return ((vGxStat *)REG_GXSTAT)->projStackLevel;
}
__inline static u8 GX_GetPosVecStackLevel(void)
{
GX_WaitMtxStackCmd(); return ((vGxStat *)REG_GXSTAT)->posvecStackLevel;
}
//----------------------------------------------------------------------
// 単位行列への初期化
//
//・カレント行列を単位行列に初期化します。
//
//・引数: なし
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Identity() (*(vu32 *)REG_MTX_IDENTITY = 0)
//----------------------------------------------------------------------
// 平行移動行列の適用
//
//・カレント行列に平行移動行列を乗算します。
//
//・引数:
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate(x, y, z) \
{ \
vs32 *mp = (vs32 *)REG_MTX_TRANS; \
\
*mp = (x); \
*mp = (y); \
*mp = (z); \
}
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define _GX_TranslateBefore(mp, x, y, z) \
{ \
*mp = (x); \
*mp = (y); \
*mp = (z); \
}
//----------------------------------------------------------------------
// カレント行列へのロード
//
//・カレント行列に指定した行列を設定します。
//
//・引数:
// srcp ロードする行列のポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LoadMtx(srcp) _GX_SetMtx( (vs32 *)REG_MTX_LOAD_4x3, srcp)
#define GX_LoadMtx44(srcp) _GX_SetMtx44((vs32 *)REG_MTX_LOAD_4x4, srcp)
#define GX_LoadMtx33(x, y, z, srcp) \
{ \
vs32 *mp = (vs32 *)REG_MTX_LOAD_4x3; \
\
_GX_SetMtx33(mp, srcp); \
*mp = 0; \
*mp = 0; \
*mp = 0; \
}
void _GX_SetMtx( vs32 *mp, const Mtx *srcp);
void _GX_SetMtx33(vs32 *mp, const Mtx33 *srcp);
void _GX_SetMtx44(vs32 *mp, const Mtx44 *srcp);
//----------------------------------------------------------------------
// 一般行列とカレント行列の乗算
//
//・カレント行列に指定した行列を乗算します。
//
//・引数:
// srcp 適用する行列のポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_MultMtx(srcp) _GX_SetMtx( (vs32 *)REG_MTX_MULT_4x3, srcp)
#define GX_MultMtx33(srcp) _GX_SetMtx33((vs32 *)REG_MTX_MULT_3x3, srcp)
#define GX_MultMtx44(srcp) _GX_SetMtx44((vs32 *)REG_MTX_MULT_4x4, srcp)
//----------------------------------------------------------------------
// 平行移動行列を適用後に一般行列を乗算
//
//・カレント行列へ平行移動行列と一般行列の結合行列を乗算します。
//
//・GX_Translate()GX_MultMtx33() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x X成分
// y Y成分
// z Z成分
// srcp 適用する3x3行列のポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2MultMtx33(x, y, z, srcp) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_SetMtx33(mp, srcp); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// 転置行列の適用
//
//・カレント行列に指定した行列の転置行列を乗算します。
//
//・引数:
// srcp 転置前の行列のポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_TransposeMtx( const Mtx *srcp);
void GX_TransposeMtx44(const Mtx44 *srcp);
#define GX_TransposeMtx33(srcp) _GX_TransposeMtx33((vs32 *)REG_MTX_MULT_3x3, srcp)
void _GX_TransposeMtx33(vs32 *mp, const Mtx33 *srcp);
//----------------------------------------------------------------------
// 平行移動行列を適用後に転置行列を適用
//
//・カレント行列へ平行移動行列と転置行列の結合行列を乗算します。
//
//・GX_Translate()GX_TransposeMtx33() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// srcp 転置前の3x3行列のポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2TransposeMtx33(x, y, z, srcp) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_TransposeMtx33(mp, srcp); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// スケール行列の適用(位置座標行列のみ)
//
//・カレント行列にスケール行列を乗算します。
//・行列モードが Position・Vector 同時設定モードの場合でも
// 位置座標行列のみに適用されます。
//
//・引数:
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Scale(x, y, z) \
{ \
vs32 *mp = (vs32 *)REG_MTX_SCALE; \
\
*mp = (x) >>VG_SFT_DF; \
*mp = (y) >>VG_SFT_DF; \
*mp = (z) >>VG_SFT_DF; \
}
//----------------------------------------------------------------------
// スケール行列の適用(位置座標行列&方向ベクトル行列)
//
//・カレント行列にスケール行列を乗算します。
//・行列モードが Position・Vector 同時設定モードの場合には
// 位置座標行列と方向ベクトル行列の両方に適用されます。
//
//・引数:
// x X成分
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_ScaleWithVector(x, y, z) _GX_ScaleWithVector((vs32 *)REG_MTX_MULT_3x3, x, y, z)
void _GX_ScaleWithVector(vs32 *mp, s32 x, s32 y, s32 z);
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// スケール行列を適用(位置座標行列&方向ベクトル行列)
//
//・カレント行列へ平行移動行列とスケール行列の結合行列を乗算します。
//・行列モードが Position・Vector 同時設定モードの場合には
// 位置座標行列と方向ベクトル行列の両方に適用されます。
//
//・GX_Translate()GX_ScaleWithVector() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// xT 平行移動のX成分
// yT 平行移動のY成分
// zT 平行移動のZ成分
// xS スケールのX成分
// yS スケールのY成分
// zS スケールのZ成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2ScaleWithVector(xT, yT, zT, xS, yS, zS) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_ScaleWithVector(mp, xS, yS, zS); \
_GX_TranslateBefore(mp, xT, yT, zT) \
}
//----------------------------------------------------------------------
// 主軸回転行列の適用
//
//・カレント行列に各主軸回りに回転する行列を乗算します。
//
//・引数:
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_RotateX(theta) GX_RotatePriv(X, SIN_NDIV_DEFAULT, theta)
#define GX_RotateY(theta) GX_RotatePriv(Y, SIN_NDIV_DEFAULT, theta)
#define GX_RotateZ(theta) GX_RotatePriv(Z, SIN_NDIV_DEFAULT, theta)
#define GX_RotateX256(theta) GX_RotatePriv(X, 256, theta)
#define GX_RotateY256(theta) GX_RotatePriv(Y, 256, theta)
#define GX_RotateZ256(theta) GX_RotatePriv(Z, 256, theta)
#define GX_RotateX1024(theta) GX_RotatePriv(X, 1024, theta)
#define GX_RotateY1024(theta) GX_RotatePriv(Y, 1024, theta)
#define GX_RotateZ1024(theta) GX_RotatePriv(Z, 1024, theta)
#define GX_RotateX4096(theta) GX_RotatePriv(X, 4096, theta)
#define GX_RotateY4096(theta) GX_RotatePriv(Y, 4096, theta)
#define GX_RotateZ4096(theta) GX_RotatePriv(Z, 4096, theta)
void _GX_RotateX256(vs32 *mp, u32 theta);
void _GX_RotateY256(vs32 *mp, u32 theta);
void _GX_RotateZ256(vs32 *mp, u32 theta);
void _GX_RotateX1024(vs32 *mp, u32 theta);
void _GX_RotateY1024(vs32 *mp, u32 theta);
void _GX_RotateZ1024(vs32 *mp, u32 theta);
void _GX_RotateX4096(vs32 *mp, u32 theta);
void _GX_RotateY4096(vs32 *mp, u32 theta);
void _GX_RotateZ4096(vs32 *mp, u32 theta);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_RotatePriv(axis, ndiv, theta) GX_RotateNDiv(axis, ndiv, theta)
#define GX_RotateNDiv(axis, ndiv, theta) _GX_Rotate##axis##ndiv((vs32 *)REG_MTX_MULT_3x3, theta)
//----------------------------------------------------------------------
// 平行移動行列を適用後に主軸回転行列を適用
//
//・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算します。
//
//・GX_Translate()GX_Rotate[X|Y|Z][256|1024|4096]() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2RotateX(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, X, SIN_NDIV_DEFAULT, theta)
#define GX_Translate2RotateY(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Y, SIN_NDIV_DEFAULT, theta)
#define GX_Translate2RotateZ(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Z, SIN_NDIV_DEFAULT, theta)
#define GX_Translate2RotateX256(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, X, 256, theta)
#define GX_Translate2RotateY256(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Y, 256, theta)
#define GX_Translate2RotateZ256(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Z, 256, theta)
#define GX_Translate2RotateX1024(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, X, 1024, theta)
#define GX_Translate2RotateY1024(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Y, 1024, theta)
#define GX_Translate2RotateZ1024(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Z, 1024, theta)
#define GX_Translate2RotateX4096(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, X, 4096, theta)
#define GX_Translate2RotateY4096(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Y, 4096, theta)
#define GX_Translate2RotateZ4096(x, y, z, theta) GX_Translate2RotatePriv(x, y, z, Z, 4096, theta)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_Translate2RotatePriv(x, y, z, axis, ndiv, theta) \
GX_Translate2RotateNDiv(x, y, z, axis, ndiv, theta)
#define GX_Translate2RotateNDiv(x, y, z, axis, ndiv, theta) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_Rotate##axis##ndiv(mp, theta); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// 主軸回転行列(三角関数による回転角指定)の適用
//
//・カレント行列に各主軸回りに回転する行列を乗算します。
//・回転角度はサインとコサインにて指定します。
//
//・引数:
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_RotateXSinCos(sinA, cosA) _GX_RotateXSinCos((vs32 *)REG_MTX_MULT_3x3, sinA, cosA)
#define GX_RotateYSinCos(sinA, cosA) _GX_RotateYSinCos((vs32 *)REG_MTX_MULT_3x3, sinA, cosA)
#define GX_RotateZSinCos(sinA, cosA) _GX_RotateZSinCos((vs32 *)REG_MTX_MULT_3x3, sinA, cosA)
void _GX_RotateXSinCos(vs32 *mp, s32 sinA, s32 cosA);
void _GX_RotateYSinCos(vs32 *mp, s32 sinA, s32 cosA);
void _GX_RotateZSinCos(vs32 *mp, s32 sinA, s32 cosA);
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// 主軸回転行列(三角関数による回転角指定)を適用
//
//・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算します。
//・回転角度はサインとコサインにて指定します。
//
//・GX_Translate()GX_Rotate[X|Y|Z]SinCos() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2RotateXSinCos(x, y, z, sinA, cosA) GX_Translate2RotateSinCosPriv(x, y, z, X, sinA, cosA)
#define GX_Translate2RotateYSinCos(x, y, z, sinA, cosA) GX_Translate2RotateSinCosPriv(x, y, z, Y, sinA, cosA)
#define GX_Translate2RotateZSinCos(x, y, z, sinA, cosA) GX_Translate2RotateSinCosPriv(x, y, z, Z, sinA, cosA)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_Translate2RotateSinCosPriv(x, y, z, axis, sinA, cosA) \
GX_Translate2RotateSinCosNDiv(x, y, z, axis, sinA, cosA)
#define GX_Translate2RotateSinCosNDiv(x, y, z, axis, sinA, cosA) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_Rotate##axis##SinCos(mp, theta); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// 任意軸回転行列の適用
//
//・カレント行列に任意のベクトルを軸として回転する行列を乗算します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//
//・引数:
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_RotateAxis( axisp, theta) GX_RotateAxisPriv( SIN_NDIV_DEFAULT, axisp, theta)
#define GX_RotateAxisFast(axisp, theta) GX_RotateAxisPrivFast(SIN_NDIV_DEFAULT, axisp, theta)
#define GX_RotateAxis256( axisp, theta) GXB_RotateAxisPriv( 256, axisp, theta)
#define GX_RotateAxis256Fast(axisp, theta) GXB_RotateAxisPrivFast(256, axisp, theta)
#define GX_RotateAxis1024( axisp, theta) GXB_RotateAxisPriv( 1024, axisp, theta)
#define GX_RotateAxis1024Fast(axisp, theta) GXB_RotateAxisPrivFast(1024, axisp, theta)
#define GX_RotateAxis4096( axisp, theta) GXB_RotateAxisPriv( 4096, axisp, theta)
#define GX_RotateAxis4096Fast(axisp, theta) GXB_RotateAxisPrivFast(4096, axisp, theta)
void _GX_RotateAxis256( vs32 *mp, const Vec *axisp, u32 theta);
void _GX_RotateAxis256Fast(vs32 *mp, const Vec *axisp, u32 theta);
void _GX_RotateAxis1024( vs32 *mp, const Vec *axisp, u32 theta);
void _GX_RotateAxis1024Fast(vs32 *mp, const Vec *axisp, u32 theta);
void _GX_RotateAxis4096( vs32 *mp, const Vec *axisp, u32 theta);
void _GX_RotateAxis4096Fast(vs32 *mp, const Vec *axisp, u32 theta);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_RotateAxisPriv( ndiv, axisp, theta) GX_RotateAxisNDiv( ndiv, axisp, theta)
#define GX_RotateAxisPrivFast(ndiv, axisp, theta) GX_RotateAxisNDivFast(ndiv, axisp, theta)
#define GX_RotateAxisNDiv( ndiv, axisp, theta) _GX_RotateAxis##ndiv( (vs32 *)REG_MTX_MULT_3x3, axisp, theta)
#define GX_RotateAxisNDivFast(ndiv, axisp, theta) _GX_RotateAxis##ndiv##Fast((vs32 *)REG_MTX_MULT_3x3, axisp, theta)
//----------------------------------------------------------------------
// 平行移動行列を適用後に任意軸回転行列を適用
//
//・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//・GX_Translate()GX_RotateAxis[256|1024|4096][Fast]() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// axisp 回転軸ベクトルのポインタ
// theta 回転角度25610244096段階
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2RotateAxis( x, y, z, axisp, theta) GX_Translate2RotateAxisPriv( x, y, z, SIN_NDIV_DEFAULT, axisp, theta)
#define GX_Translate2RotateAxisFast(x, y, z, axisp, theta) GX_Translate2RotateAxisPrivFast(x, y, z, SIN_NDIV_DEFAULT, axisp, theta)
#define GX_Translate2RotateAxis256( x, y, z, axisp, theta) GX_Translate2RotateAxisPriv( x, y, z, 256, axisp, theta)
#define GX_Translate2RotateAxis256Fast(x, y, z, axisp, theta) GX_Translate2RotateAxisPrivFast(x, y, z, 256, axisp, theta)
#define GX_Translate2RotateAxis1024( x, y, z, axisp, theta) GX_Translate2RotateAxisPriv( x, y, z, 1024, axisp, theta)
#define GX_Translate2RotateAxis1024Fast(x, y, z, axisp, theta) GX_Translate2RotateAxisPrivFast(x, y, z, 1024, axisp, theta)
#define GX_Translate2RotateAxis4096( x, y, z, axisp, theta) GX_Translate2RotateAxisPriv( x, y, z, 4096, axisp, theta)
#define GX_Translate2RotateAxis4096Fast(x, y, z, axisp, theta) GX_Translate2RotateAxisPrivFast(x, y, z, 4096, axisp, theta)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_Translate2RotateAxisPriv( x, y, z, ndiv, axisp, theta) \
GX_Translate2RotateAxisNDiv( x, y, z, ndiv, axisp, theta)
#define GX_Translate2RotateAxisNDiv(x, y, z, ndiv, axisp, theta) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_RotateAxis##ndiv(mp, axisp, theta); \
_GX_TranslateBefore(mp, x, y, z) \
}
#define GX_Translate2RotateAxisPrivFast(x, y, z, ndiv, axisp, theta) \
GX_Translate2RotateAxisNDivFast(x, y, z, ndiv, axisp, theta)
#define GX_Translate2RotateAxisNDivFast(x, y, z, ndiv, axisp, theta) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_RotateAxis##ndiv##Fast(mp, axisp, theta); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// 任意軸回転行列(三角関数による回転角指定)の適用
//
//・カレント行列に任意のベクトルを軸として回転する行列を乗算します。
//・回転角度はサインとコサインにて指定します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//
//・引数:
// axisp 回転軸ベクトルのポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_RotateAxisSinCos( axisp, sinA, cosA) _GX_RotateAxisSinCos( (vs32 *)REG_MTX_MULT_3x3, axisp, sinA, cosA)
#define GX_RotateAxisSinCosFast(axisp, sinA, cosA) _GX_RotateAxisSinCosFast((vs32 *)REG_MTX_MULT_3x3, axisp, sinA, cosA)
void _GX_RotateAxisSinCos( vs32 *mp, const Vec *axisp, s32 sinA, s32 cosA);
void _GX_RotateAxisSinCosFast(vs32 *mp, const Vec *axisp, s32 sinA, s32 cosA);
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// 任意軸回転行列(三角関数による回転角指定)を適用
//
//・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算します。
//・回転角度はサインとコサインにて指定します。
//
//・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません
// (高速版には単位ベクトルを渡して下さい)。
//・GX_Translate()GX_RotateAxisSinCos[Fast]() よりも
// ジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// axisp 回転軸ベクトルのポインタ
// sinA 回転角度のサイン
// cosA 回転角度のコサイン
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2RotateAxisSinCos( x, y, z, axisp, sinA, cosA) GX_Translate2RotateAxisSinCosPriv( x, y, z, axisp, sinA, cosA)
#define GX_Translate2RotateAxisSinCosFast(x, y, z, axisp, sinA, cosA) GX_Translate2RotateAxisSinCosPrivFast(x, y, z, axisp, sinA, cosA)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_Translate2RotateAxisSinCosPriv( x, y, z, axisp, sinA, cosA) \
GX_Translate2RotateAxisSinCosNDiv( x, y, z, axisp, sinA, cosA)
#define GX_Translate2RotateAxisSinCosNDiv( x, y, z, axisp, sinA, cosA) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_RotateAxisSinCos(mp, axisp, sinA, cosA); \
_GX_TranslateBefore(mp, x, y, z) \
}
#define GX_Translate2RotateAxisSinCosPrivFast(x, y, z, axisp, sinA, cosA) \
GX_Translate2RotateAxisSinCosNDivFast(x, y, z, axisp, sinA, cosA)
#define GX_Translate2RotateAxisSinCosNDivFast(x, y, z, axisp, sinA, cosA) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_RotateAxisSinCosFast(mp, axisp, sinA, cosA); \
_GX_TranslateBefore(mp, 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 ]
//
//・関数内で平方根演算器と除算器を使用します。
//
//・引数:
// vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます)
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_AlignZ(vLookInvp) _GX_AlignZ((vs32 *)REG_MTX_MULT_3x3, vLookInvp)
void _GX_AlignZ(vs32 *mp, const Vec *vLookInvp);
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// 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 ]
//
//・関数内で平方根演算器と除算器を使用します。
//・GX_Translate()GX_AlignZ() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// x 平行移動のX成分
// y 平行移動のY成分
// z 平行移動のZ成分
// vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます)
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2AlignZ(x, y, z, vLookInvp) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_AlignZ(mp, vLookInvp); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// クォータニオンから変換した回転行列の適用
//
//・カレント行列へクォータニオンから変換した回転行列を適用します。
//
//・通常版は除算器を使用しますが、高速版は使用しません
// (高速版には正規化クォータニオンを渡して下さい)。
//
//・引数:
// quatp クォータニオンのポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_QuatMtx(quatp) _GX_QuatMtx( (vs32 *)REG_MTX_MULT_3x3, quatp)
#define GX_QuatMtxFast(quatp) _GX_QuatMtxFast((vs32 *)REG_MTX_MULT_3x3, quatp)
void _GX_QuatMtx(vs32 *mp, const Quat *quatp);
void _GX_QuatMtxFast(vs32 *mp, const Quat *quatp);
//----------------------------------------------------------------------
// 平行移動行列を適用後に
// クォータニオンから変換した回転行列を適用
//
//・カレント行列へ平行移動行列とクォータニオンから変換した回転行列
// の結合行列を乗算します。
//
//・通常版は除算器を使用しますが、高速版は使用しません
// (高速版には正規化クォータニオンを渡して下さい)。
//・GX_Translate()GX_QuatMtx[Fast]() よりもジオメトリエンジンの負荷を減らせます。
//
//・引数:
// quatp クォータニオンのポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Translate2QuatMtx( x, y, z, quatp) GX_Translate2QuatMtxPriv( x, y, z, quatp)
#define GX_Translate2QuatMtxFast(x, y, z, quatp) GX_Translate2QuatMtxPrivFast(x, y, z, quatp)
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_Translate2QuatMtxPriv( x, y, z, quatp) \
GX_Translate2QuatMtxNDiv( x, y, z, quatp)
#define GX_Translate2QuatMtxNDiv( x, y, z, quatp) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_QuatMtx(mp, quatp); \
_GX_TranslateBefore(mp, x, y, z) \
}
#define GX_Translate2QuatMtxPrivFast(x, y, z, quatp) \
GX_Translate2QuatMtxNDivFast(x, y, z, quatp)
#define GX_Translate2QuatMtxNDivFast(x, y, z, quatp) \
{ \
vs32 *mp = (vs32 *)REG_MTX_MULT_4x3; \
\
_GX_QuatMtxFast(mp, quatp); \
_GX_TranslateBefore(mp, x, y, z) \
}
//----------------------------------------------------------------------
// 左右対称の透視射影行列の適用
//
//・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算します。
//
//・関数内で除算器を使用します。
//
//・引数:
// fovy 縦方向の視野角度25610244096段階
// aspect 横方向の視野を確定する縦横比(視野の 幅/高さ)
// near 視点からnearクリップ面までの距離常に正
// far 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Perspective(fovy, aspect, near, far, scaleW) GX_PerspectivePriv(SIN_NDIV_DEFAULT, fovy, aspect, near, far, scaleW)
void GX_Perspective256( u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW);
void GX_Perspective1024(u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW);
void GX_Perspective4096(u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW);
// 中間マクロ(下記のマクロは直接使用しないで下さい)
#define GX_PerspectivePriv(ndiv, fovy, aspect, near, far, scaleW) \
GX_PerspectiveNDiv(ndiv, fovy, aspect, near, far, scaleW)
#define GX_PerspectiveNDiv(ndiv, fovy, aspect, near, far, scaleW) \
GX_Perspective##ndiv( fovy, aspect, near, far, scaleW)
//----------------------------------------------------------------------
// 左右対称の透視射影行列(三角関数による視野角指定)の適用
//
//・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算します。
//・視野角度はサインとコサインにて指定します。
//
//・関数内で除算器を使用します。
//
//・引数:
// sinA 縦方向の視野角度のサイン
// cosA 縦方向の視野角度のコサイン(上位関数からの呼び出し高速化のため最後に渡す)
// aspect 横方向の視界を確定する縦横比(視野の 幅/高さ)
// near 視点からnearクリップ面までの距離常に正
// far 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_PerspectiveSinCos(s32 sinA, s32 aspect, s32 near, s32 far, s32 scaleW, s32 cosA);
//----------------------------------------------------------------------
// 透視射影行列の適用
//
//・透視法視錐台の行列を作成し、それをカレント行列へ乗算します。
//
//・関数内で除算器を使用します。
//
//・引数:
// t nearクリップ面上辺のy座標
// b nearクリップ面下辺のy座標
// l nearクリップ面左辺のx座標
// r nearクリップ面右辺のx座標
// n 視点からnearクリップ面までの距離常に正
// f 視点からfarクリップ面までの距離 (常に正)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_Frustum(s32 t, s32 b, s32 l, s32 r, s32 n, s32 f, s32 scaleW);
//----------------------------------------------------------------------
// 正射影行列の適用
//
//・正射影の平行視体積の行列を作成し、それをカレント行列へ乗算します。
//
//・関数内で除算器を使用します。
//
//・引数:
// t nearクリップ面上辺のy座標
// b nearクリップ面下辺のy座標
// l nearクリップ面左辺のx座標
// r nearクリップ面右辺のx座標
// n 視点からnearクリップ面までの距離正負どちらでも可
// f 視点からfarクリップ面までの距離 (正負どちらでも可)
// scaleW クリップ座標W値のスケールパラメータ座標変換後の精度調整
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_Ortho(s32 t, s32 b, s32 l, s32 r, s32 n, s32 f, s32 scaleW);
//----------------------------------------------------------------------
// 視界行列の適用
//
//・視界行列を作成し、それをカレント行列へ乗算します。
//
//・関数内でベクトルの正規化のために平方根演算器と除算器を使用します。
//
//・引数:
// eye 視点
// at 注視点
// vUp 上方向ベクトル
// vDst 0NULLポインタ以外を渡すと、視線逆方向ベクトルを返します
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_LookAt( const Pos *eye, const Pos *at, const Vec *vUp, Vec *vDst);
void GX_LookAtFast(const Pos *eye, const Pos *at, const Vec *vUp, Vec *vDst);
//----------------------------------------------------------------------
// カレントクリップ座標行列の取得
//
//・カレントのクリップ座標行列の取得します。
//
//・関数内でジオメトリエンジンが停止するのを待ってから読み込みます。
//
//・引数:
// dstp 行列格納バッファのポインタ
//
//・戻り値:カレントクリップ座標行列
//----------------------------------------------------------------------
void GX_GetClipMtx( Mtx *dstp);
void GX_GetClipMtx33(Mtx33 *dstp);
void GX_GetClipMtx44(Mtx44 *dstp);
//----------------------------------------------------------------------
// カレント方向ベクトル行列の取得
//
//・カレントの方向ベクトル行列の取得します。
//
//・関数内でジオメトリエンジンが停止するのを待ってから読み込みます。
//
//・引数:
// dstp 行列格納バッファのポインタ
//
//・戻り値:カレント方向ベクトル行列
//----------------------------------------------------------------------
void GX_GetVectorMtx33(Mtx33 *dstp);
//----------------------------------------------------------------------
// ボックステスト
//
//・立方体が視体積に入るかどうかをテストための構造体を設定します。
//
//・引数:
// box テストボックスXYZWHD161616161616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_BoxTest1(box) \
{ *(vs32 *)REG_BOX_TEST = *(vs32 *)&((box).x); \
*(vs32 *)REG_BOX_TEST = *(vs32 *)&((box).z); \
*(vs32 *)REG_BOX_TEST = *(vs32 *)&((box).h); \
}
//----------------------------------------------------------------------
// ボックステスト
//
//・立方体が視体積に入るかどうかをテストために各パラメータを設定します。
//
//・引数:
// x テストボックス左下X座標16bit
// y テストボックス左下Y座標
// z テストボックス左下Z座標
// w テストボックス幅
// h テストボックス高さ
// d テストボックス奥行き
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_BoxTest6(x, y, z, w, h, d) \
{ *(vs32 *)REG_BOX_TEST = XY1616(x, y); \
*(vs32 *)REG_BOX_TEST = ZW1616(z, w); \
*(vs32 *)REG_BOX_TEST = HD1616(h, d); \
}
//----------------------------------------------------------------------
// 位置座標テスト
//
//・テスト用の位置座標の構造体を設定します。
//
//・引数:
// pos 位置座標XYZ161616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_PositionTest1(pos) \
{ *(vs32 *)REG_POS_TEST = *(vs32 *)&((pos).x); \
*(vs32 *)REG_POS_TEST = *(vs16 *)&((pos).z); \
}
//----------------------------------------------------------------------
// 位置座標テスト
//
//・テスト用の位置座標の各要素を設定します。
//
//・引数:
// x 位置座標X成分16bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_PositionTest3(x, y, z) \
{ *(vs32 *)REG_POS_TEST = XY1616(x, y); \
*(vs32 *)REG_POS_TEST = (z); \
}
//----------------------------------------------------------------------
// 方向ベクトルテスト
//
//・テスト用の方向ベクトル構造体を設定します。
//
//・引数:
// vector 方向ベクトルXYZ101010
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VectorTest1(vector) (*(vVec10 *)REG_VEC_TEST = (vector))
//----------------------------------------------------------------------
// 方向ベクトルテスト
//
//・テスト用の方向ベクトルの各要素を設定します。
//
//・引数:
// x 方向ベクトルX成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VectorTest3(x, y, z) (*(vu32 *)REG_VEC_TEST = XYZ101010(x, y, z))
//----------------------------------------------------------------------
// ジオメトリテスト・ビジーチェック
//
//・ジオメトリテストが完了したかどうかを返します。
//
//・引数: なし
//
//・戻り値:
// 非0 ビジー
// 0 レディ
//----------------------------------------------------------------------
// MW不具合対応
#define GX_IsTestBusy() ((vu8 )*(vu8 *)REG_GXSTAT & GXSTAT_TEST_BUSY)
//----------------------------------------------------------------------
// ジオメトリテスト終了待ち
//
//・ジオメトリテストの終了を待ちます。
//
//・引数: なし
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_WaitTest() \
{ while (GX_IsTestBusy()) ; \
}
//----------------------------------------------------------------------
// ジオメトリテスト結果
//
//・ジオメトリテスト結果を取得します。
//・通常版はテストコマンドの完了を待ってから結果を返しますが、
// Imm版は完了チェックを行いません。
//
//・引数: なし
//
//・戻り値:テスト結果
//----------------------------------------------------------------------
// MW不具合対応
#define GX_BoxResultImm() ((vu8 )*(vu8 *)REG_GXSTAT & GXSTAT_BOX_IN_VIEW)
#define GX_PositionResultImm() (*(vPos32 *)REG_POS_RESULT)
#define GX_VectorResultImm() (*(vVec16 *)REG_VEC_RESULT)
__inline static u8 GX_BoxResult(void)
{
GX_WaitTest(); return GX_BoxResultImm();
}
__inline static Pos32 GX_PositionResult(void)
{
GX_WaitTest(); return GX_PositionResultImm();
}
__inline static Vec16 GX_VectorResult(void)
{
GX_WaitTest(); return GX_VectorResultImm();
}
//----------------------------------------------------------------------
// ライトベクトル設定
//
//・ライトベクトルへライトベクトル構造体を設定します。
//
//・引数:
// lightVector ライトベクトルXYZ101010
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LightVector1(lightVector) (*(vLightVector *)REG_LIGHT_VECTOR = (lightVector))
//----------------------------------------------------------------------
// ライトカラー設定
//
//・ライトカラーへライトカラー構造体を設定します。
//
//・引数:
// lightColor ライトカラーRGB555
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LightColor1(lightColor) (*(vLightColor *)REG_LIGHT_COLOR = (lightColor))
//----------------------------------------------------------------------
// ライトベクトル設定
//
//・ライトベクトルへライト番号と方向ベクトルを設定します。
//
//・引数:
// no ライト番号
// vector 方向ベクトルXYZ101010
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LightVector2(no, vector) (*(vu32 *)REG_LIGHT_VECTOR = ((no)<<LIGHT_ID_SHIFT | *(u32 *)&(vector)))
//----------------------------------------------------------------------
// ライトカラー設定
//
//・ライトカラーへライト番号とカラーを設定します。
//
//・引数:
// no ライト番号
// color カラーRGB555
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LightColor2(no, color) (*(vu32 *)REG_LIGHT_COLOR = ((no)<<LIGHT_ID_SHIFT | *(u16 *)&(color)))
//----------------------------------------------------------------------
// ライトベクトル設定
//
//・ライトベクトルへライト番号と方向ベクトルの各要素を設定します。
//
//・引数:
// no ライト番号
// x 方向ベクトルX成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LightVector4(no, x, y, z) (*(vu32 *)REG_LIGHT_VECTOR = LIGHT_VECTOR(no, x, y, z))
//----------------------------------------------------------------------
// ライトカラー設定
//
//・ライトカラーへライト番号とカラーの各要素を設定します。
//
//・引数:
// no ライト番号
// r 赤成分5bit
// g 緑成分( 〃
// b 青成分( 〃
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_LightColor4(no, r, g, b) (*(vu32 *)REG_LIGHT_COLOR = LIGHT_COLOR(no, r, g, b))
//----------------------------------------------------------------------
// 鏡面反射輝度テーブルの設定
//
//・8bitの128要素からなる鏡面反射輝度テーブルを設定します。
//・全要素をまとめて転送する必要があります。
//・このテーブルを書き換えることによって、1シーン中に複数の
// 鏡面反射効果を持ったポリゴンを表示することができます。。
//
//・引数:
// srcp 鏡面反射輝度テーブルのポインタ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
void GX_ShininessTable(void *srcp);
//----------------------------------------------------------------------
// 全マテリアルカラー設定
//
//・全マテリアルカラーと関連フラグをまとめた64bitデータを設定します。
//
//・引数:
// colors 全マテリアルカラーデータRGB555 | 頂点カラー更新フラグ、鏡面反射輝度テーブル有効フラグ含む)
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_MaterialColor1(colors) (*(vu64 *)REG_MATERIAL_COLOR = (*(u64 *)&(colors)))
//----------------------------------------------------------------------
// 全マテリアルカラー設定
//
//・各マテリアルカラーとそれらに関連したフラグを設定します。
//
//・引数:
// dif ディフューズカラーRGB555 | 頂点カラー更新フラグ含む)
// amb アンビエントカラーRGB555
// spe スペキュラカラー RGB555 | 鏡面反射輝度テーブル有効フラグ含む)
// emi エミッションカラーRGB555
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_MaterialColor4(dif, amb, spe, emi) \
{ GX_DiffuseAmbient2( dif, amb); \
GX_SpecularEmission2(spe, emi); \
}
//----------------------------------------------------------------------
// 全マテリアルカラー設定
//
//・各マテリアルカラーの各要素と関連フラグを設定します。
//
//・引数:
// setCol 頂点カラー更新フラグ
// tbl 鏡面反射輝度テーブル有効フラグ
// dr ディフューズカラー赤成分5bit
// dg 緑成分( 〃
// db 青成分( 〃
// ar アンビエントカラー赤成分( 〃
// ag 緑成分( 〃
// ab 青成分( 〃
// sr スペキュラカラー 赤成分( 〃
// sg 緑成分( 〃
// sb 青成分( 〃
// er エミッションカラー赤成分( 〃
// eg 緑成分( 〃
// eb 青成分( 〃
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_MaterialColor14(setCol, tbl, dr, dg, db, ar, ag, ab, sr, sg, sb, er, eg, eb) \
{ GX_DiffuseAmbient7(setCol, dr, dg, db, ar, ag, ab); \
GX_SpecularEmission7(tbl, sr, sg, sb, er, eg, eb); \
}
//----------------------------------------------------------------------
// ディフューズ&アンビエントカラー設定
//
//・ディフューズカラーとアンビエントカラーをまとめた32bitデータを設定します。
//
//・引数:
// colors ディフューズアンビエントカラーRGB555 | 頂点カラー更新フラグ含む)
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_DiffuseAmbient1(colors) (*(vu32 *)REG_DIF_AMB = (colors))
//----------------------------------------------------------------------
// スペキュラ&エミッションカラー設定
//
//・スペキュラカラーとエミッションカラーをまとめた32bitデータを設定します。
//
//・引数:
// colors スペキュラエミッションカラーRGB555 | 鏡面反射輝度テーブル有効フラグ含む)
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_SpecularEmission1(colors) (*(vu32 *)REG_SPE_EMI = (colors))
//----------------------------------------------------------------------
// ディフューズ&アンビエントカラー設定
//
//・ディフューズカラーとアンビエントカラーを設定します。
//
//・引数:
// dif ディフューズカラーRGB555 | 頂点カラー更新フラグ含む)
// amb アンビエントカラーRGB555
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_DiffuseAmbient2(dif, amb) (*(vu32 *)REG_DIF_AMB = (*(u16 *)&(dif) | (*(u16 *)&(amb))<<16))
//----------------------------------------------------------------------
// スペキュラ&エミッションカラー設定
//
//・スペキュラカラーとエミッションカラーを設定します。
//
//・引数:
// spe スペキュラカラー RGB555 | 鏡面反射輝度テーブル有効フラグ含む)
// emi エミッションカラーRGB555
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_SpecularEmission2(spe, emi) (*(vu32 *)REG_SPE_EMI = (*(u16 *)&(spe) | (*(u16 *)&(emi))<<16))
//----------------------------------------------------------------------
// ディフューズ&アンビエントカラー設定
//
//・ディフューズカラーとアンビエントカラーの各要素と
// 頂点カラー更新フラグを設定します。
//
//・引数:
// setCol 頂点カラー更新フラグ
// dr ディフューズカラー赤成分5bit
// dg 緑成分( 〃
// db 青成分( 〃
// ar アンビエントカラー赤成分( 〃
// ag 緑成分( 〃
// ab 青成分( 〃
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_DiffuseAmbient7(setCol, dr, dg, db, ar, ag, ab) \
(*(vu32 *)REG_DIF_AMB = ((setCol) | RGB555(dr, dg, db) \
| RGB555(ar, ag, ab)<<16))
//----------------------------------------------------------------------
// スペキュラ&エミッションカラー設定
//
//・スペキュラカラーとエミッションカラーの各要素と
// 鏡面反射輝度テーブル有効フラグを設定します。
//
//・引数:
// tbl 鏡面反射輝度テーブル有効フラグ
// sr スペキュラカラー 赤成分5bit
// sg 緑成分( 〃
// sb 青成分( 〃
// er エミッションカラー赤成分( 〃
// eg 緑成分( 〃
// eb 青成分( 〃
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_SpecularEmission7(tbl, sr, sg, sb, er, eg, eb) \
(*(vu32 *)REG_SPE_EMI = ((tbl) | RGB555(sr, sg, sb) \
| RGB555(er, eg, eb)<<16))
//----------------------------------------------------------------------
// ポリゴン属性の設定
//
//・ポリゴン属性をまとめた32bitデータを設定します。
//
//・引数:
// attr ポリゴン属性
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_PolygonAttr1(attr) (*(vu32 *)REG_POLYGON_ATTR = (attr))
//----------------------------------------------------------------------
// ポリゴン属性の設定
//
//・ポリゴンのIDとアルファ値と他の属性を設定します。
//
//・引数:
// id ID 6bit
// alpha アルファ値5bit
// attr 他のポリゴン属性
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_PolygonAttr3(id, alpha, attr) (*(vu32 *)REG_POLYGON_ATTR = (id) <<POLYATTR_ID_SHIFT \
| (alpha)<<POLYATTR_ALPHA_SHIFT \
| (attr))
//----------------------------------------------------------------------
// テクスチャパラメータ設定
//
//・テクスチャのパラメータをまとめた64bitデータを設定します。
//
//・引数:
// param テクスチャパラメータ64bit
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexParam(param) (*(vu64 *)REG_TEX_PARAM = (param))
//----------------------------------------------------------------------
// テクスチャイメージパラメータ設定(シフト調整無し)
//
//・テクスチャィメージのパラメータをまとめた32bitデータを設定します。
//・テクスチャイメージベース値はシフト調整した値を渡して下さい。
//
//・引数:
// param テクスチャイメージパラメータ32bit
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexImageParam1(param) (*(vu32 *)REG_TEXIMAGE_PARAM = (param))
//----------------------------------------------------------------------
// テクスチャイメージパラメータ設定(シフト調整有り)
//
//・テクスチャィメージのパラメータを設定します。
//・テクスチャイメージベース値のシフト調整が行われますので、
// アドレスをそのまま渡して下さい。
//
//・引数:
// basep テクスチャイメージベースのポインタ
// param テクスチャイメージパラメータ16bit
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexImageParam2(basep, param) (*(vu32 *)REG_TEXIMAGE_PARAM = Addr2TexImageBase(basep) | (param))
//----------------------------------------------------------------------
// テクスチャパレットベース設定(シフト調整無し)
//
//・テクスチャパレットベースのパラメータをまとめた32bitデータを設定します。
//・テクスチャパレットベース値はシフト調整した値を渡して下さい。
//
//・引数:
// base テクスチャパレットベース
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexPlttBase1(base) (*(vu32 *)REG_TEXPLTT_BASE = ((u32 )(base)))
//----------------------------------------------------------------------
// テクスチャパレットベース設定(シフト調整有り)
//
//・テクスチャパレットベースのパラメータを設定します。
//・テクスチャパレットベース値のシフト調整が行われますので、
// アドレスをそのまま渡して下さい。
//
//・引数:
// basep テクスチャパレットベースのポインタ
// mode テクスチャモード
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexPlttBase2(basep, mode) (*(vu32 *)REG_TEXPLTT_BASE = Addr2TexPlttBase(basep, mode))
//----------------------------------------------------------------------
// プリミティブの頂点リスト開始
//
//・プリミティブの頂点リストの開始を宣言します。
//
//・引数:
// primType プリミティブタイプ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Begin(primType) (*(vu32 *)REG_BEGIN_VTXS = (primType))
//----------------------------------------------------------------------
// プリミティブの頂点リスト終了
//
//・プリミティブの頂点リストの終了を宣言します。
//
//・引数: なし
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_End() (*(vu32 *)REG_END_VTXS = 0)
//----------------------------------------------------------------------
// 頂点カラーの直接設定
//
//・頂点カラーを直接設定します。
//
//・引数:
// color カラーRGB555
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Color1(color) (*(vu32 *)REG_COLOR = (*(u16 *)&(color)))
//----------------------------------------------------------------------
// 頂点カラーの直接設定
//
//・頂点カラーの各要素を直接設定します。
//
//・引数:
// r 赤成分5bit
// g 緑成分( 〃
// b 青成分( 〃
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Color3(r, g, b) (*(vu32 *)REG_COLOR = RGB555(r, g, b))
//----------------------------------------------------------------------
// 法線ベクトル
//
//・法線ベクトルへ10bitベクトル構造体を設定します。
//
//・引数:
// normal 方向ベクトルXYZ101010
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Normal1(normal) (*(vVec10 *)REG_NORMAL = (normal))
//----------------------------------------------------------------------
// 法線ベクトル
//
//・法線ベクトルへ10bitベクトルフォーマットの各要素を設定します。
//
//・引数:
// x 方向ベクトルX成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Normal3(x, y, z) (*(vs32 *)REG_NORMAL = XYZ101010(x, y, z))
//----------------------------------------------------------------------
// テクスチャ座標
//
//・テクスチャ座標へテクスチャ座標構造体を設定します。
//
//・引数:
// coord テクスチャ座標ST1616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexCoord1(coord) (*(vTexCoord *)REG_TEXCOORD = (coord))
//----------------------------------------------------------------------
// テクスチャ座標
//
//・テクスチャ座標へ各要素を設定します。
//
//・引数:
// s テクスチャ座標S成分16bit
// t T成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_TexCoord2(s,t) (*(vs32 *)REG_TEXCOORD = ST1616(s, t))
//----------------------------------------------------------------------
// 頂点座標の設定と頂点の生成
//
//・頂点座標へ16bitフォーマット構造体を設定します。
//
//・引数:
// pos 位置座標XYZ161616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Vertex1(pos) \
{ *(vs32 *)REG_VTX_16 = *(vs32 *)&((pos).x); \
*(vs32 *)REG_VTX_16 = *(vs16 *)&((pos).z); \
}
//----------------------------------------------------------------------
// 頂点座標の設定と頂点の生成
//
//・頂点座標へ16bitフォーマットの各要素を設定します。
//
//・引数:
// x 位置座標X成分16bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_Vertex3(x, y, z) \
{ *(vs32 *)REG_VTX_16 = XY1616(x, y); \
*(vs32 *)REG_VTX_16 = (z); \
}
//----------------------------------------------------------------------
// 頂点座標10bitの設定と頂点の生成
//
//・頂点座標へ10bitフォーマット構造体を設定します。
//
//・引数:
// pos 位置座標XYZ101010
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexShort1(pos) (*(vPos10 *)REG_VTX_10 = (pos))
//----------------------------------------------------------------------
// 頂点座標10bitの設定と頂点の生成
//
//・頂点座標へ10bitフォーマットの各要素を設定します。
//
//・引数:
// x 位置座標X成分10bit
// y Y成分
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexShort3(x, y, z) (*(vs32 *)REG_VTX_10 = XYZ101010(x, y, z))
//----------------------------------------------------------------------
// 頂点XY座標の設定と頂点の生成
//
//・頂点のX座標とY座標をまとめた32bitデータを設定しますZ座標は最後の設定値を使用
//
//・引数:
// pos 位置座標XY1616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexXY1(pos) (*(vPos2D16 *)REG_VTX_XY = (pos))
//----------------------------------------------------------------------
// 頂点XY座標の設定と頂点の生成
//
//・頂点のX座標とY座標を設定しますZ座標は最後の設定値を使用
//
//・引数:
// x 位置座標X成分16bit
// y Y成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexXY2(x, y) (*(vs32 *)REG_VTX_XY = XY1616(x, y))
//----------------------------------------------------------------------
// 頂点XZ座標の設定と頂点の生成
//
//・頂点のX座標とZ座標をまとめた32bitデータを設定しますY座標は最後の設定値を使用
//
//・引数:
// pos 位置座標XZ1616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexXZ1(pos) (*(vPos2D16 *)REG_VTX_XZ = (pos))
//----------------------------------------------------------------------
// 頂点XZ座標の設定と頂点の生成
//
//・頂点のX座標とZ座標を設定しますY座標は最後の設定値を使用
//
//・引数:
// x 位置座標X成分16bit
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexXZ2(x, z) (*(vs32 *)REG_VTX_XZ = XY1616(x, z))
//----------------------------------------------------------------------
// 頂点YZ座標の設定と頂点の生成
//
//・頂点のY座標とZ座標をまとめた32bitデータを設定しますX座標は最後の設定値を使用
//
//・引数:
// pos 位置座標YZ1616
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexYZ1(pos) (*(vPos2D16 *)REG_VTX_YZ = (pos))
//----------------------------------------------------------------------
// 頂点YZ座標の設定と頂点の生成
//
//・頂点のY座標とZ座標を設定しますX座標は最後の設定値を使用
//
//・引数:
// y 位置座標Y成分16bit
// z Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexYZ2(y, z) (*(vs32 *)REG_VTX_YZ = XY1616(y, z))
//----------------------------------------------------------------------
// 頂点座標差分の設定と頂点の生成
//
//・頂点座標の差分値をまとめた32bitデータを設定します。
//
//・引数:
// diff 位置座標差分XYZ101010
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexDiff1(diff) (*(vPos10 *)REG_VTX_DIFF = (diff))
//----------------------------------------------------------------------
// 頂点座標差分の設定と頂点の生成
//
//・頂点座標の差分値の各要素を設定します。
//
//・引数:
// x 位置座標差分X成分10bit
// y 差分Y成分
// z 差分Z成分
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_VertexDiff3(x, y, z) (*(vs32 *)REG_VTX_DIFF = XYZ101010(x, y, z))
//----------------------------------------------------------------------
// レンダリングエンジン参照データ群のスワップ
//
//・このコマンドを発行した直後のVブランク期間開始時に、
// ポリゴンリストRAM、頂点RAM、レンダリング関連レジスタ等、
// レンダリングエンジンが参照するデータを切り替えます。
//・書き込んだグラフィックスデータが描画へ反映されるのは
// このコマンドを発行した次のフレームになります
//
//・引数:
// flags フラグ
//
//・戻り値:なし
//
//※I/Oレジスタ経由でジオメトリFIFOへ直接書き込むため、
// ディスプレイリスト転送中には実行しないで下さい。
//----------------------------------------------------------------------
#define GX_SwapBuffers(flags) (*(vu32 *)REG_SWAP_BUFFERS = (flags))
//----------------------------------------------------------------------
// 1ドットポリゴン表示境界デプス値の設定
//
//・ポリゴンの全頂点のXおよびY座標がBGスクリーン座標の1ドット以下
// の範囲内へ座標変換される場合、最も小さいW値デプス値
// このレジスタ設定値より大きければ、ポリゴンリストRAMおよび頂点RAM
// にポリゴンデータを書き込まなくなります。
// 但しこの機能が有効となるためには、PolygonAttrコマンドの
// 1ドットポリゴン表示指定が'0'である必要があります。
//
//・引数:
// depth クリップ座標でのW値デプス値
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_Disp1DotDepth(depth) (*(vu32 *)REG_DISP_1DOT_DEPTH = (depth))
//======================================================================
// レンダリングエンジン
//======================================================================
//----------------------------------------------------------------------
// デプスバッファのクリア値の設定
//
//・デプスバッファがクリアされる値(初期値)を設定します。
//
//・引数:
// depth デプス値15bit
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_ClearDepth(depth) (*(vu16 *)REG_CLEAR_DEPTH = (depth))
//----------------------------------------------------------------------
// カラー&属性バッファのクリア値の設定
//
//・カラーバッファとアトリビュートバッファがクリアされる値(初期値)
// をまとめた32bitデータを設定します。
//
//・引数:
// param パラメータ32bit
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_ClearColorAttr1(param) (*(vu32 *)REG_CLEAR_COLOR_ATTR = (param))
//----------------------------------------------------------------------
// カラー&属性バッファのクリア値の設定
//
//・カラーバッファとアトリビュートバッファがクリアされる値(初期値)
// を設定します。
//
//・引数:
// id ID 6bit
// r 赤成分 5bit
// g 緑成分
// b 青成分
// a α成分
// f フォグイネーブルフラグ
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_ClearColorAttr6(id, r, g, b, a, f) (*(vu32 *)REG_CLEAR_COLOR_ATTR = (RGB555(r, g, b) | (a)<<ALPHA5_SHIFT | (id)<<CLR_ID_SHIFT | (f)))
//----------------------------------------------------------------------
// クリアイメージのオフセット位置の設定
//
//・レンダリングバッファ初期化時に読み込むクリアイメージに対して
// オフセットを与えます。
//・画面の途中で256×256のデータ領域を超えると回り込んで読み込まれます。
//
//・引数:
// x X座標オフセット値8bit
// x Y座標オフセット値
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_ClearImageOffset(x, y) (*(vu16 *)REG_CLRIMAGE_OFFSET = (y)<<8 | (u8 )(x))
//----------------------------------------------------------------------
// フォグカラー設定
//
//・フォグとしてブレンディングされるカラーを設定します。
//
//・引数:
// color フォグカラーRGBA5555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_FogColor1(color) (*(vu32 *)REG_FOG_COLOR = (color))
//----------------------------------------------------------------------
// フォグカラー設定
//
//・フォグとしてブレンディングされるカラーの各要素を設定します。
//
//・引数:
// r 赤成分5bit
// g 緑成分( 〃
// b 青成分( 〃
// a α成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_FogColor4(r, g, b, a) (*(vu32 *)REG_FOG_COLOR = (RGB555(r, g, b) | (a)<<ALPHA5_SHIFT))
//----------------------------------------------------------------------
// フォグオフセット設定
//
//・フォグ濃度計算の基準となるデプス値を設定します。
//
//・引数:
// offset フォグを開始するオフセット値
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_FogOffset(offset) (*(vu32 *)REG_FOG_OFFSET = (offset))
//----------------------------------------------------------------------
// フォグテーブル設定
//
//・フォグ濃度計算で参照される32段階の濃度テーブルを設定します。
//
//・引数:
// srcp フォグテーブルのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void GX_FogTable(void *srcp);
//----------------------------------------------------------------------
// フォグテーブル要素の設定
//
//・フォグ濃度計算で参照される32段階の濃度テーブルの各要素を設定します。
//
//・引数:
// idx 要素のインデックス
// param 各要素の濃度14要素の値
// bits 設定するビット数
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_FogTableElement(idx, param, bits) (((vu##bits *)REG_FOG_TABLE)[idx] = (param))
//----------------------------------------------------------------------
// トゥーン(又はハイライト)フラグメントカラーテーブル設定
//
//・トゥーンシェーディング又ハイライトシェーディングにて
// フラグメントカラーとして参照されるテーブルを設定します。
//
//・引数:
// srcp トゥーンテーブルのポインタ
//
//・戻り値:なし
//----------------------------------------------------------------------
void GX_ToonTable(void *srcp);
//----------------------------------------------------------------------
// トゥーン(又はハイライト)フラグメントカラーテーブル要素の設定
//
//・トゥーンシェーディング又ハイライトシェーディングにて
// フラグメントカラーとして参照されるテーブルの各要素を設定します。
//
//・引数:
// idx 要素のインデックス
// color 各要素の濃度RGB555、12要素の値
// bits 設定するビット数
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_ToonTableElement(idx, color, bits) (((vu##bits *)REG_TOON_TABLE)[idx] = (color))
//----------------------------------------------------------------------
// エッジマーキングカラー設定
//
//・エッジマーキング時にエッジカラーとして参照される値を設定します。
//・ポリゴンIDを8単位で同一グループとみなした8つのグループのうち、
// どのグループかを指定してカラーを設定します。
//
//・引数:
// idGrp IDグループ8ID単位、8グループ
// color カラーRGB555
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_EdgeColor2(idGrp, color) (((vu16 *)REG_EDGE_COLOR)[idGrp] = (color))
//----------------------------------------------------------------------
// エッジマーキングカラー設定
//
//・エッジマーキング時にエッジカラーとして参照される各要素を設定します。
//・ポリゴンIDを8単位で同一グループとみなした8つのグループのうち、
// どのグループかを指定してカラーを設定します。
//
//・引数:
// idGrp IDグループ8ID単位、8グループ
// r 赤成分5bit
// g 緑成分( 〃
// b 青成分( 〃
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_EdgeColor4(idGrp, r, g, b) (((vu16 *)REG_EDGE_COLOR)[idGrp] = RGB555(r, g, b))
//----------------------------------------------------------------------
// アルファテスト参照値の設定
//
//・アルファテストにて参照される値を設定します。
//
//・引数:
// ref アルファ参照値5bit
//
//・戻り値:なし
//----------------------------------------------------------------------
#define GX_AlphaTestRef(ref) (*(vu32 *)REG_ALPHA_TEST_REF = (ref))
//----------------------------------------------------------------------
// ポリゴンリストRAMカウンタ値の読み込み
//
//・現在ポリゴンリストRAMに格納されている不透明ポリゴン半透明ポリゴン
// の数を読み込みます。
//
//・引数: なし
//
//・戻り値:カウンタ値
//----------------------------------------------------------------------
#define GX_GetListRamCount() (*(vu16 *)REG_LISTRAM_COUNT)
//----------------------------------------------------------------------
// 頂点RAMカウンタの読み込み
//
//・現在頂点RAMに格納されている頂点の数を読み込みます。
//
//・引数: なし
//
//・戻り値:カウンタ値
//----------------------------------------------------------------------
#define GX_GetVtxRamCount() (*(vu16 *)REG_VTXRAM_COUNT)
//----------------------------------------------------------------------
// レンダリング済みライン数カウンタの読み込み
//
//・直前の描画フレーム中にカラーバッファが最低何ラインまでになったか
// を読み込みます。
//
//・引数: なし
//
//・戻り値:カウンタ値
//----------------------------------------------------------------------
#define GX_GetRenderLinesCount() (*(vu8 *)REG_RDLINES_COUNT)
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_GX_H