//====================================================================== // 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 #include #include #include //---------------------------------------------------------------------- // ディスプレイリスト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 回転角度[256|1024|4096段階] // //・戻り値:なし // //※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 回転角度[256|1024|4096段階] // //・戻り値:なし // //※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 回転角度[256|1024|4096段階] // //・戻り値:なし // //※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 回転角度[256|1024|4096段階] // //・戻り値:なし // //※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 縦方向の視野角度[256|1024|4096段階] // 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 0(NULLポインタ)以外を渡すと、視線逆方向ベクトルを返します // //・戻り値:なし // //※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)<