//====================================================================== // IrisGXC.h // IRIS圧縮ディスプレイリストをバッファ(データTCM)へ生成 // // Copyright (C) 2002-2003 NINTENDO Co.,Ltd. //====================================================================== #ifndef _IRIS_GXC_H #define _IRIS_GXC_H #ifdef __cplusplus extern "C" { #endif #include #include //---------------------------------------------------------------------- // 圧縮ディスプレイリストCPU転送 // //・バッファに格納された圧縮ディスプレイリストを // CPUにてジオメトリコマンドFIFOへ転送します。 //・転送前にコマンドワードのパッド領域がクリアされます。 // //・引数: // startp ディスプレイリストバッファの先頭ポインタ // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // //・戻り値:なし // //※TCM上のディスプレイリストはDMA転送できません。 //---------------------------------------------------------------------- #define GXC_CallList(startp, opp, prmp) \ { \ GXC_ClearListPad(opp); \ GXB_CallList(startp, prmp); \ } //---------------------------------------------------------------------- // 圧縮ディスプレイリストのコマンドワード・パッド領域のクリア // //・圧縮ディスプレイリスト中のコマンドワードのパッド領域をクリアします。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // //・戻り値:なし //---------------------------------------------------------------------- void GXC_ClearListPad(void *opp); //---------------------------------------------------------------------- // ジオメトリコマンドのセット // //・圧縮ディスプレイリスト中にジオメトリコマンドをセットします。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // op セットするジオメトリコマンド // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_SetOp(opp, op) \ { \ ((u8 *)(opp))[0] = op; \ } //---------------------------------------------------------------------- // バッファポインタ補正加算 // //・圧縮ディスプレイリスト生成時のバッファポインタの補正加算を行います。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // prms パラメータ数 // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_AddBufp(opp, prmp, prms) \ { \ (prmp) += (prms); \ if ((++(u32 )(opp) & 0x3) == 0) (opp) = (prmp)++; \ } //---------------------------------------------------------------------- // ビューポート設定 // //・BG0面上におけるビューポートの左下座標と右上座標を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // startX 左下X座標(8bit) // startY 左下Y座標( 〃 ) // endX 右上X座標( 〃 ) // endY 右上Y座標( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Viewport(opp, prmp, startX, startY, endX, endY) \ { \ GXC_SetOp(opp, GXOP_VIEWPORT); \ \ (prmp)[0] = (u32 )(startX) << VIEWPORT_START_X_SHIFT \ | (u32 )(startY) << VIEWPORT_START_Y_SHIFT \ | (u32 )(endX) << VIEWPORT_END_X_SHIFT \ | (u32 )(endY) << VIEWPORT_END_Y_SHIFT; \ GXC_AddBufp(opp, prmp, GXOP_VIEWPORT_NPARAMS); \ } //====================================================================== // 行列コマンド群 //====================================================================== //---------------------------------------------------------------------- // 行列モード設定 // //・行列コマンドで操作するカレント行列を指定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // mode 行列モード // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_MtxMode(opp, prmp, mode) \ { \ GXC_SetOp(opp, GXOP_MTX_MODE); \ \ (prmp)[0] = (mode); \ GXC_AddBufp(opp, prmp, GXOP_MTX_MODE_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のプッシュ // //・カレント行列を行列スタックへ退避する // 圧縮ディスプレイリストを生成します。 //・行列スタックポインタは1つ進みます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_PushMtx(opp, prmp) \ { \ GXC_SetOp(opp, GXOP_MTX_PUSH); \ \ GXC_AddBufp(opp, prmp, GXOP_MTX_PUSH_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のポップ // //・カレント行列を行列スタックから復元する // 圧縮ディスプレイリストを生成します。 //・行列スタックポインタは指定した相対位置へ移動します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // relPos 相対位置(-30 〜 31) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_PopMtx(opp, prmp, relPos) \ { \ GXC_SetOp(opp, GXOP_MTX_POP); \ \ (prmp)[0] = (relPos); \ GXC_AddBufp(opp, prmp, GXOP_MTX_POP_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のストア // //・カレント行列を行列スタックの指定位置へ格納する // 圧縮ディスプレイリストを生成します。 //・行列スタックポインタは移動しません。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // index インデックス(0 〜 30) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_StoreMtx(opp, prmp, index) \ { \ GXC_SetOp(opp, GXOP_MTX_STORE); \ \ (prmp)[0] = (index); \ GXC_AddBufp(opp, prmp, GXOP_MTX_STORE_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のリストア // //・カレント行列を行列スタックの指定位置から取り出す // 圧縮ディスプレイリストを生成します。 //・行列スタックポインタは移動しません。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // index インデックス(0 〜 30) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_RestoreMtx(opp, prmp, index) \ { \ GXC_SetOp(opp, GXOP_MTX_RESTORE); \ \ GXC_AddBufp(opp, prmp, GXOP_MTX_RESTORE_NPARAMS); \ } //---------------------------------------------------------------------- // 単位行列への初期化 // //・カレント行列を単位行列に初期化する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Identity(opp, prmp) \ { \ GXC_SetOp(opp, GXOP_MTX_IDENTITY); \ \ GXC_AddBufp(opp, prmp, GXOP_MTX_IDENTITY_NPARAMS); \ } //---------------------------------------------------------------------- // 平行移動行列の適用 // //・カレント行列に平行移動行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x X成分 // y Y成分 // z Z成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Translate(opp, prmp, x, y, z) \ { \ GXC_SetOp(opp, GXOP_MTX_TRANS); \ \ (prmp)[0] = (x); \ (prmp)[1] = (y); \ (prmp)[2] = (z); \ GXC_AddBufp(opp, prmp, GXOP_MTX_TRANS_NPARAMS); \ } // 中間マクロ(下記のマクロは直接使用しないで下さい) #define _GXC_TranslateBefore(opp, prmp, x, y, z) \ { \ (prmp)[0] = (x); \ (prmp)[1] = (y); \ (prmp)[2] = (z); \ GXC_AddBufp(opp, prmp, GXOP_MTX_TRANS_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列へのロード // //・カレント行列に指定した行列を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // srcp ロードする行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_LoadMtx( opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_LOAD_4x3); \ \ (prmp) = _GXB_SetMtx(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_LoadMtx33(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_LOAD_4x3); \ \ (prmp) = _GXB_SetMtx33(prmp, srcp); \ *(prmp)++ = 0; \ *(prmp)++ = 0; \ *(prmp)++ = 0; \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_LoadMtx44(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_LOAD_4x4); \ \ (prmp) = _GXB_SetMtx44(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 一般行列とカレント行列の乗算 // //・カレント行列に指定した行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // srcp 適用する行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_MultMtx(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_SetMtx(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_MultMtx33(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_SetMtx33(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_MultMtx44(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \ \ (prmp) = _GXB_SetMtx44(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に一般行列を乗算 // //・カレント行列へ平行移動行列と一般行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・GXC_Translate()+GXC_MultMtx33() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x X成分 // y Y成分 // z Z成分 // srcp 適用する3x3行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Translate2MultMtx33(opp, prmp, x, y, z, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_SetMtx33(prmp, srcp); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // 転置行列の適用 // //・カレント行列に指定した行列の転置行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // srcp 転置前の行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_TransposeMtx(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_TransposeMtx(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_TransposeMtx33(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_TransposeMtx33(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_TransposeMtx44(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \ \ (prmp) = _GXB_TransposeMtx44(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に転置行列を適用 // //・カレント行列へ平行移動行列と転置行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・GXC_Translate()+GXC_TransposeMtx33() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // srcp 転置前の3x3行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Translate2TransposeMtx33(prmp, x, y, z, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_TransposeMtx33(prmp, srcp); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // スケール行列の適用(位置座標行列のみ) // //・カレント行列にスケール行列を乗算する // 圧縮ディスプレイリストを生成します。 //・行列モードが Position・Vector 同時設定モードの場合でも // 位置座標行列のみに適用されます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x X成分 // y Y成分 // z Z成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Scale(opp, prmp, x, y, z) \ { \ GXC_SetOp(opp, GXOP_MTX_SCALE); \ \ (prmp)[0] = (x) >>VG_SFT_DF; \ (prmp)[1] = (y) >>VG_SFT_DF; \ (prmp)[2] = (z) >>VG_SFT_DF; \ GXC_AddBufp(opp, prmp, GXOP_MTX_SCALE_NPARAMS); \ } //---------------------------------------------------------------------- // スケール行列の適用(位置座標行列&方向ベクトル行列) // //・カレント行列にスケール行列を乗算する // 圧縮ディスプレイリストを生成します。 //・行列モードが Position・Vector 同時設定モードの場合には // 位置座標行列と方向ベクトル行列の両方に適用されます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x X成分 // y Y成分 // z Z成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_ScaleWithVector(opp, prmp, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_ScaleWithVector(prmp, srcp); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に // スケール行列を適用(位置座標行列&方向ベクトル行列) // //・カレント行列へ平行移動行列とスケール行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 //・行列モードが Position・Vector 同時設定モードの場合には // 位置座標行列と方向ベクトル行列の両方に適用されます。 // //・GXC_Translate()+GXC_ScaleWithVector() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // xT 平行移動のX成分 // yT 平行移動のY成分 // zT 平行移動のZ成分 // xS スケールのX成分 // yS スケールのY成分 // zS スケールのZ成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Translate2ScaleWithVector(opp, prmp, x, y, z, srcp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_ScaleWithVector(prmp, srcp); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // 主軸回転行列の適用 // //・カレント行列に各主軸回りに回転する行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // theta 回転角度[256|1024|4096段階] // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_RotateX(opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, SIN_NDIV_DEFAULT, theta) #define GXC_RotateY(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, SIN_NDIV_DEFAULT, theta) #define GXC_RotateZ(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, SIN_NDIV_DEFAULT, theta) #define GXC_RotateX256( opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, 256, theta) #define GXC_RotateY256( opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, 256, theta) #define GXC_RotateZ256( opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, 256, theta) #define GXC_RotateX1024(opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, 1024, theta) #define GXC_RotateY1024(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, 1024, theta) #define GXC_RotateZ1024(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, 1024, theta) #define GXC_RotateX4096(opp, prmp, theta) GXC_RotatePriv(opp, prmp, X, 4096, theta) #define GXC_RotateY4096(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Y, 4096, theta) #define GXC_RotateZ4096(opp, prmp, theta) GXC_RotatePriv(opp, prmp, Z, 4096, theta) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_RotatePriv(opp, prmp, axis, ndiv, theta) \ GXC_RotateNDiv(opp, prmp, axis, ndiv, theta) #define GXC_RotateNDiv(opp, prmp, axis, ndiv, theta) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_Rotate##axis##ndiv(prmp, theta); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に主軸回転行列を適用 // //・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・GXC_Translate()+GXC_Rotate[X|Y|Z][256|1024|4096]() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // theta 回転角度[256|1024|4096段階] // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Translate2RotateX(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, SIN_NDIV_DEFAULT, theta) #define GXC_Translate2RotateY(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, SIN_NDIV_DEFAULT, theta) #define GXC_Translate2RotateZ(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, SIN_NDIV_DEFAULT, theta) #define GXC_Translate2RotateX256(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, 256, theta) #define GXC_Translate2RotateY256(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, 256, theta) #define GXC_Translate2RotateZ256(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, 256, theta) #define GXC_Translate2RotateX1024(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, 1024, theta) #define GXC_Translate2RotateY1024(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, 1024, theta) #define GXC_Translate2RotateZ1024(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, 1024, theta) #define GXC_Translate2RotateX4096(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, X, 4096, theta) #define GXC_Translate2RotateY4096(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Y, 4096, theta) #define GXC_Translate2RotateZ4096(opp, prmp, x, y, z, theta) GXC_Translate2RotatePriv(opp, prmp, x, y, z, Z, 4096, theta) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_Translate2RotatePriv(opp, prmp, x, y, z, axis, ndiv, theta) \ GXC_Translate2RotateNDiv(opp, prmp, x, y, z, axis, ndiv, theta) #define GXC_Translate2RotateNDiv(opp, prmp, x, y, z, axis, ndiv, theta) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_Rotate##axis##ndiv(prmp, theta); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // 主軸回転行列(三角関数による回転角指定)の適用 // //・カレント行列に各主軸回りに回転する行列を乗算する // 圧縮ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_RotateXSinCos(opp, prmp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateXSinCos(prmp, sinA, cosA); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_RotateYSinCos(opp, prmp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateYSinCos(prmp, sinA, cosA); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_RotateZSinCos(opp, prmp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateZSinCos(prmp, sinA, cosA); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に // 主軸回転行列(三角関数による回転角指定)を適用 // //・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・GXC_Translate()+GXC_Rotate[X|Y|Z]SinCos() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_Translate2RotateXSinCos(opp, prmp, x, y, z, sinA, cosA) GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, X, sinA, cosA) #define GXC_Translate2RotateYSinCos(opp, prmp, x, y, z, sinA, cosA) GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, Y, sinA, cosA) #define GXC_Translate2RotateZSinCos(opp, prmp, x, y, z, sinA, cosA) GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, Z, sinA, cosA) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_Translate2RotateSinCosPriv(opp, prmp, x, y, z, axis, sinA, cosA) \ GXC_Translate2RotateSinCosNDiv(opp, prmp, x, y, z, axis, sinA, cosA) #define GXC_Translate2RotateSinCosNDiv(opp, prmp, x, y, z, axis, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_RotateYSinCos(prmp, sinA, cosA); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // 任意軸回転行列の適用 // //・カレント行列に任意のベクトルを軸として回転する行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // axisp 回転軸ベクトルのポインタ // theta 回転角度[256|1024|4096段階] // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_RotateAxis( opp, prmp, axisp, theta) GXC_RotateAxisPriv( SIN_NDIV_DEFAULT, opp, prmp, axisp, theta) #define GXC_RotateAxisFast(opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(SIN_NDIV_DEFAULT, opp, prmp, axisp, theta) #define GXC_RotateAxis256( opp, prmp, axisp, theta) GXC_RotateAxisPriv( 256, opp, prmp, axisp, theta) #define GXC_RotateAxis256Fast( opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(256, opp, prmp, axisp, theta) #define GXC_RotateAxis1024( opp, prmp, axisp, theta) GXC_RotateAxisPriv( 1024, opp, prmp, axisp, theta) #define GXC_RotateAxis1024Fast(opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(1024, opp, prmp, axisp, theta) #define GXC_RotateAxis4096( opp, prmp, axisp, theta) GXC_RotateAxisPriv( 4096, opp, prmp, axisp, theta) #define GXC_RotateAxis4096Fast(opp, prmp, axisp, theta) GXC_RotateAxisPrivFast(4096, opp, prmp, axisp, theta) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_RotateAxisPriv( ndiv, opp, prmp, axisp, theta) \ GXC_RotateAxisNDiv( ndiv, opp, prmp, axisp, theta) #define GXC_RotateAxisNDiv( ndiv, opp, prmp, axisp, theta) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateAxis##ndiv(prmp, axisp, theta); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_RotateAxisPrivFast(ndiv, opp, prmp, axisp, theta) \ GXC_RotateAxisNDivFast(ndiv, opp, prmp, axisp, theta) #define GXC_RotateAxisNDivFast(ndiv, opp, prmp, axisp, theta) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateAxis##ndiv##Fast(prmp, axisp, theta); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に任意軸回転行列を適用 // //・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 //・GXC_Translate()+GXC_RotateAxis[256|1024|4096][Fast]() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // axisp 回転軸ベクトルのポインタ // theta 回転角度[256|1024|4096段階] // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_Translate2RotateAxis( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, SIN_NDIV_DEFAULT, axisp, theta) #define GXC_Translate2RotateAxisFast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, SIN_NDIV_DEFAULT, axisp, theta) #define GXC_Translate2RotateAxis256( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, 256, axisp, theta) #define GXC_Translate2RotateAxis256Fast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, 256, axisp, theta) #define GXC_Translate2RotateAxis1024( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, 1024, axisp, theta) #define GXC_Translate2RotateAxis1024Fast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, 1024, axisp, theta) #define GXC_Translate2RotateAxis4096( opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, 4096, axisp, theta) #define GXC_Translate2RotateAxis4096Fast(opp, prmp, x, y, z, axisp, theta) GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, 4096, axisp, theta) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_Translate2RotateAxisPriv( opp, prmp, x, y, z, ndiv, axisp, theta) \ GXC_Translate2RotateAxisNDiv( opp, prmp, x, y, z, ndiv, axisp, theta) #define GXC_Translate2RotateAxisNDiv( opp, prmp, x, y, z, ndiv, axisp, theta) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_RotateAxis##ndiv(prmp, axisp, theta); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } #define GXC_Translate2RotateAxisPrivFast(opp, prmp, x, y, z, ndiv, axisp, theta) \ GXC_Translate2RotateAxisNDivFast(opp, prmp, x, y, z, ndiv, axisp, theta) #define GXC_Translate2RotateAxisNDivFast(opp, prmp, x, y, z, ndiv, axisp, theta) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_RotateAxis##ndiv##Fast(prmp, axisp, theta); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // 任意軸回転行列(三角関数による回転角指定)の適用 // //・カレント行列に任意のベクトルを軸として回転する行列を乗算する // 圧縮ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // axisp 回転軸ベクトルのポインタ // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_RotateAxisSinCos(opp, prmp, axisp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateAxisSinCos(prmp, axisp, sinA, cosA); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_RotateAxisSinCosFast(opp, prmp, axisp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_RotateAxisSinCosFast(prmp, axisp, sinA, cosA); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に // 任意軸回転行列(三角関数による回転角指定)を適用 // //・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算する // 圧縮ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 //・GXC_Translate()+GXC_RotateAxisSinCos[Fast]() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // axisp 回転軸ベクトルのポインタ // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_Translate2RotateAxisSinCos( opp, prmp, x, y, z, axisp, sinA, cosA) GXC_Translate2RotateAxisSinCosPriv( opp, prmp, x, y, z, axisp, sinA, cosA) #define GXC_Translate2RotateAxisSinCosFast(opp, prmp, x, y, z, axisp, sinA, cosA) GXC_Translate2RotateAxisSinCosPrivFast(opp, prmp, x, y, z, axisp, sinA, cosA) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_Translate2RotateAxisSinCosPriv( opp, prmp, x, y, z, axisp, sinA, cosA) \ GXC_Translate2RotateAxisSinCosNDiv( opp, prmp, x, y, z, axisp, sinA, cosA) #define GXC_Translate2RotateAxisSinCosNDiv( opp, prmp, x, y, z, axisp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_RotateAxisSinCos(prmp, axisp, sinA, cosA); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } #define GXC_Translate2RotateAxisSinCosPrivFast(opp, prmp, x, y, z, axisp, sinA, cosA) \ GXC_Translate2RotateAxisSinCosNDivFast(opp, prmp, x, y, z, axisp, sinA, cosA) #define GXC_Translate2RotateAxisSinCosNDivFast(opp, prmp, x, y, z, axisp, sinA, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_RotateAxisSinCosFast(prmp, axisp, sinA, cosA); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // Z軸にアライメントする回転行列の適用 // //・カレント行列に任意軸をZ軸の正方向と一致させる回転を行う行列を乗算する // 圧縮ディスプレイリストを生成します。 // // H = sqrt (X*X + Z*Z) // // [ 1 ] [ Z/H -X/H ] [ Z/H -X/H ] // [ v ] [ H/1 -Y/1 ] [ 1 ] = [ v ] [ -YX/H H -YZ/H ] // [ Y/1 H/1 ] [ X/H Z/H ] [ X Y Z ] // //・関数内で平方根演算器と除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます) // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_AlignZ(opp, prmp, vLookInvp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_AlignZ(prmp, vLookInvp); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に // Z軸にアライメントする回転行列を適用 // //・カレント行列へ平行移動行列と任意軸をZ軸の正方向と一致させる回転を行う行列 // との結合行列を乗算する、圧縮ディスプレイリストを生成します。 // // H = sqrt (X*X + Z*Z) // // [ 1 ] [ Z/H -X/H ] [ Z/H -X/H ] // [ v ] [ H/1 -Y/1 ] [ 1 ] = [ v ] [ -YX/H H -YZ/H ] // [ Y/1 H/1 ] [ X/H Z/H ] [ X Y Z ] // //・関数内で平方根演算器と除算器を使用します。 //・GXC_Translate()+GXC_AlignZ() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます) // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_Translate2AlignZ(opp, prmp, x, y, z, vLookInvp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_AlignZ(prmp, vLookInvp); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // クォータニオンから変換した回転行列の適用 // //・カレント行列へクォータニオンから変換した回転行列を適用する // 圧縮ディスプレイリストを生成します。 // //・通常版は除算器を使用しますが、高速版は使用しません // (高速版には正規化クォータニオンを渡して下さい)。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // quatp クォータニオンのポインタ // //・戻り値:なし // //※通常版は除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- #define GXC_QuatMtx(opp, prmp, quatp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_QuatMtx(prmp, quatp); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_QuatMtxFast(opp, prmp, quatp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_3x3); \ \ (prmp) = _GXB_QuatMtxFast(prmp, quatp); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に // クォータニオンから変換した回転行列を適用 // //・カレント行列へ平行移動行列とクォータニオンから変換した回転行列 // の結合行列を乗算する、圧縮ディスプレイリストを生成します。 // //・通常版は除算器を使用しますが、高速版は使用しません // (高速版には正規化クォータニオンを渡して下さい)。 //・GXC_Translate()+GXC_QuatMtx[Fast]() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // quatp クォータニオンのポインタ // //・戻り値:なし // //※通常版は除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- #define GXC_Translate2QuatMtx( opp, prmp, x, y, z, quatp) GXC_Translate2QuatMtxPriv( opp, prmp, x, y, z, quatp) #define GXC_Translate2QuatMtxFast(opp, prmp, x, y, z, quatp) GXC_Translate2QuatMtxPrivFast(opp, prmp, x, y, z, quatp) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_Translate2QuatMtxPriv( opp, prmp, x, y, z, quatp) \ GXC_Translate2QuatMtxNDiv( opp, prmp, x, y, z, quatp) #define GXC_Translate2QuatMtxPrivFast(opp, prmp, x, y, z, quatp) \ GXC_Translate2QuatMtxNDivFast(opp, prmp, x, y, z, quatp) #define GXC_Translate2QuatMtxNDiv( opp, prmp, x, y, z, quatp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_QuatMtx(prmp, quatp); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } #define GXC_Translate2QuatMtxNDivFast(opp, prmp, x, y, z, quatp) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_QuatMtxFast(prmp, quatp); \ _GXC_TranslateBefore(opp, prmp, x, y, z); \ } //---------------------------------------------------------------------- // 左右対称の透視射影行列の適用 // //・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算する // 圧縮ディスプレイリストを生成します。 // //・関数内で除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // fovy 縦方向の視野角度[256|1024|4096段階] // aspect 横方向の視野を確定する縦横比(視界での 幅/高さ) // near 視点からnearクリップ面までの距離(常に正) // far 視点からfarクリップ面までの距離 (常に正) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_Perspective(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(SIN_NDIV_DEFAULT, opp, prmp, fovy, aspect, near, far, scaleW) #define GXC_Perspective256(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(256, opp, prmp, fovy, aspect, near, far, scaleW) #define GXC_Perspective1024(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(1024, opp, prmp, fovy, aspect, near, far, scaleW) #define GXC_Perspective4096(opp, prmp, fovy, aspect, near, far, scaleW) GXC_PerspectivePriv(4096, opp, prmp, fovy, aspect, near, far, scaleW) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXC_PerspectivePriv(ndiv, opp, prmp, fovy, aspect, near, far, scaleW) \ GXC_PerspectiveNDiv(ndiv, opp, prmp, fovy, aspect, near, far, scaleW) #define GXC_PerspectiveNDiv(ndiv, opp, prmp, fovy, aspect, near, far, scaleW) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \ \ (prmp) = _GXB_Perspective##ndiv(prmp, fovy, aspect, near, far, scaleW); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 左右対称の透視射影行列(三角関数による視野角指定)の適用 // //・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算する // 圧縮ディスプレイリストを生成します。 //・視野角度はサインとコサインにて指定します。 // //・関数内で除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // sinA 縦方向の視野角度のサイン // cosA 縦方向の視野角度のコサイン(上位関数からの呼び出し高速化のため最後に渡す) // aspect 横方向の視野を確定する縦横比(視界での 幅/高さ) // near 視点からnearクリップ面までの距離(常に正) // far 視点からfarクリップ面までの距離 (常に正) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_PerspectiveSinCos(opp, prmp, sinA, aspect, near, far, scaleW, cosA) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \ \ (prmp) = _GXB_PerspectiveSinCos(prmp, sinA, aspect, near, far, scaleW, cosA); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 透視射影行列の適用 // //・透視法視錐台の行列を作成し、それをカレント行列へ乗算する // 圧縮ディスプレイリストを生成します。 // //・関数内で除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // t nearクリップ面上辺のy座標 // b nearクリップ面下辺のy座標 // l nearクリップ面左辺のx座標 // r nearクリップ面右辺のx座標 // n 視点からnearクリップ面までの距離(常に正) // f 視点からfarクリップ面までの距離 (常に正) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_Frustum(opp, prmp, t, b, l, r, n, f, scaleW) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \ \ (prmp) = _GXB_Frustum(prmp, t, b, l, r, n, f, scaleW); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 正射影行列の適用 // //・正射影の平行視体積の行列を作成し、それをカレント行列へ乗算する // 圧縮ディスプレイリストを生成します。 // //・関数内で除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // t nearクリップ面上辺のy座標 // b nearクリップ面下辺のy座標 // l nearクリップ面左辺のx座標 // r nearクリップ面右辺のx座標 // n 視点からnearクリップ面までの距離(正負どちらでも可) // f 視点からfarクリップ面までの距離 (正負どちらでも可) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_Ortho(opp, prmp, t, b, l, r, n, f, scaleW) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x4); \ \ (prmp) = _GXB_Ortho(prmp, t, b, l, r, n, f, scaleW); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // 視界行列の適用 // //・視界行列を作成し、それをカレント行列へ乗算する // 圧縮ディスプレイリストを生成します。 // //・関数内でベクトルの正規化のために平方根演算器と除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // eye 視点 // at 注視点 // vUp 上方向ベクトル // vDst 0(NULLポインタ)以外を渡すと、視線逆方向ベクトルを返します // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXC_LookAt(opp, prmp, eye, at, vUp, vDst) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_LookAt(prmp, eye, at, vUp, vDst); \ GXC_AddBufp(opp, prmp, 0); \ } #define GXC_LookAtFast(opp, prmp, eye, at, vUp, vDst) \ { \ GXC_SetOp(opp, GXOP_MTX_MULT_4x3); \ \ (prmp) = _GXB_LookAtFast(prmp, eye, at, vUp, vDst); \ GXC_AddBufp(opp, prmp, 0); \ } //---------------------------------------------------------------------- // ボックステスト // //・立方体が視体積に入るかどうかをテストための構造体を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // box テストボックス(XYZWHD161616161616) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_BoxTest1(opp, prmp, box) \ { \ GXC_SetOp(opp, GXOP_BOX_TEST); \ \ *(TestBox *)&(prmp)[0] = (box); \ GXC_AddBufp(opp, prmp, GXOP_BOX_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // ボックステスト // //・立方体が視体積に入るかどうかをテストために各パラメータを設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x テストボックス左下X座標(16bit) // y テストボックス左下Y座標( 〃 ) // z テストボックス左下Z座標( 〃 ) // w テストボックス幅 ( 〃 ) // h テストボックス高さ ( 〃 ) // d テストボックス奥行き ( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_BoxTest6(opp, prmp, x, y, z, w, h, d) \ { \ GXC_SetOp(opp, GXOP_BOX_TEST); \ \ (prmp)[0] = XY1616(x, y); \ (prmp)[1] = ZW1616(z, w); \ (prmp)[2] = HD1616(h, d); \ GXC_AddBufp(opp, prmp, GXOP_BOX_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 位置座標テスト // //・テスト用の位置座標の構造体を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // pos 位置座標(XYZ161616) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_PositionTest1(opp, prmp, pos) \ { \ GXC_SetOp(opp, GXOP_POS_TEST); \ \ *(Pos16 *)&(prmp)[0] = (pos); \ GXC_AddBufp(opp, prmp, GXOP_POS_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 位置座標テスト // //・テスト用の位置座標の各要素を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 位置座標X成分(16bit) // y Y成分( 〃 ) // z Z成分( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_PositionTest3(opp, prmp, x, y, z) \ { \ GXC_SetOp(opp, GXOP_POS_TEST); \ \ (prmp)[0] = XY1616(x, y); \ (prmp)[1] = (z); \ GXC_AddBufp(opp, prmp, GXOP_POS_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 方向ベクトルテスト // //・テスト用の方向ベクトル構造体を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // vector 方向ベクトル(XYZ101010) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_VectorTest1(opp, prmp, vector) \ { \ GXC_SetOp(opp, GXOP_VEC_TEST); \ \ *(Vec10 *)&(prmp)[0] = (vector); \ GXC_AddBufp(opp, prmp, GXOP_VEC_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 方向ベクトルテスト // //・テスト用の方向ベクトルの各要素を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // x 方向ベクトルX成分(10bit) // y Y成分( 〃 ) // z Z成分( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_VectorTest3(opp, prmp, x, y, z) \ { \ GXC_SetOp(opp, GXOP_VEC_TEST); \ \ (prmp)[0] = XYZ101010(x, y, z); \ GXC_AddBufp(opp, prmp, GXOP_VEC_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // ライトベクトル設定 // //・ライトベクトルへライトベクトル構造体を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // lightVector ライトベクトル(XYZ101010) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_LightVector1(opp, prmp, lightVector) \ { \ GXC_SetOp(opp, GXOP_LIGHT_VECTOR); \ \ *(LightVector *)&(prmp)[0] = (lightVector); \ GXC_AddBufp(opp, prmp, GXOP_LIGHT_VECTOR_NPARAMS); \ } //---------------------------------------------------------------------- // ライトカラー設定 // //・ライトカラーへライトカラー構造体を設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // lightColor ライトカラー(RGB555) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_LightColor1(opp, prmp, lightColor) \ { \ GXC_SetOp(opp, GXOP_LIGHT_COLOR); \ \ *(LightColor *)&(prmp)[0] = (lightColor); \ GXC_AddBufp(opp, prmp, GXOP_LIGHT_COLOR_NPARAMS); \ } //---------------------------------------------------------------------- // ライトベクトル設定 // //・ライトベクトルへライト番号と方向ベクトルを設定する // 圧縮ディスプレイリストを生成します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // no ライト番号 // vector 方向ベクトル(XYZ101010) // //・戻り値:なし //---------------------------------------------------------------------- #define GXC_LightVector2(opp, prmp, no, vector) \ { \ GXC_SetOp(opp, GXOP_LIGHT_VECTOR); \ \ (prmp)[0] = ((no)<