//====================================================================== // IrisGXB.h // IRISディスプレイリストをバッファ(主にデータTCM)へ生成 // // Copyright (C) 2002-2003 NINTENDO Co.,Ltd. //====================================================================== #ifndef _IRIS_GXB_H #define _IRIS_GXB_H #ifdef __cplusplus extern "C" { #endif #include #include #include //---------------------------------------------------------------------- // ディスプレイリストCPU転送 // //・ディスプレイリストをCPUにてジオメトリコマンドFIFOへ転送します。 // //・引数: // startp ディスプレイリストバッファの先頭ポインタ // endp ディスプレイリストバッファの終了ポインタ // //・戻り値:なし // //※TCM上のディスプレイリストはDMA転送できません。 //---------------------------------------------------------------------- void GXB_CallList(u32 *startp, u32 *endp); //---------------------------------------------------------------------- // ビューポート設定 // //・BG0面上におけるビューポートの左下座標と右上座標を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // startX 左下X座標(8bit) // startY 左下Y座標( 〃 ) // endX 右上X座標( 〃 ) // endY 右上Y座標( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Viewport(bufp, startX, startY, endX, endY) \ { \ (bufp)[0] = GXOP_VIEWPORT; \ (bufp)[1] = (u32 )(startX) << VIEWPORT_START_X_SHIFT \ | (u32 )(startY) << VIEWPORT_START_Y_SHIFT \ | (u32 )(endX) << VIEWPORT_END_X_SHIFT \ | (u32 )(endY) << VIEWPORT_END_Y_SHIFT; \ \ (bufp) += (1 + GXOP_VIEWPORT_NPARAMS); \ } //====================================================================== // 行列コマンド群 //====================================================================== //---------------------------------------------------------------------- // 行列モード設定 // //・行列コマンドで操作するカレント行列を指定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // mode 行列モード // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_MtxMode(bufp, mode) \ { \ (bufp)[0] = GXOP_MTX_MODE; \ (bufp)[1] = (mode); \ \ (bufp) += (1 + GXOP_MTX_MODE_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のプッシュ // //・カレント行列を行列スタックへ退避する // ディスプレイリストを生成します。 //・行列スタックポインタは1つ進みます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_PushMtx(bufp) \ { \ (bufp)[0] = GXOP_MTX_PUSH; \ \ (bufp) += (1 + GXOP_MTX_PUSH_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のポップ // //・カレント行列を行列スタックから復元する // ディスプレイリストを生成します。 //・行列スタックポインタは指定した相対位置へ移動します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // relPos 相対位置(-30 〜 31) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_PopMtx(bufp, relPos) \ { \ (bufp)[0] = GXOP_MTX_POP; \ (bufp)[1] = (relPos); \ \ (bufp) += (1 + GXOP_MTX_POP_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のストア // //・カレント行列を行列スタックの指定位置へ格納する // ディスプレイリストを生成します。 //・行列スタックポインタは移動しません。 // //・引数: // bufp ディスプレイリストバッファのポインタ // index インデックス(0 〜 30) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_StoreMtx(bufp, index) \ { \ (bufp)[0] = GXOP_MTX_STORE; \ (bufp)[1] = (index); \ \ (bufp) += (1 + GXOP_MTX_STORE_NPARAMS); \ } //---------------------------------------------------------------------- // カレント行列のリストア // //・カレント行列を行列スタックの指定位置から取り出す // ディスプレイリストを生成します。 //・行列スタックポインタは移動しません。 // //・引数: // bufp ディスプレイリストバッファのポインタ // index インデックス(0 〜 30) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_RestoreMtx(bufp, index) \ { \ (bufp)[0] = GXOP_MTX_RESTORE; \ (bufp)[1] = (index); \ \ (bufp) += (1 + GXOP_MTX_RESTORE_NPARAMS); \ } //---------------------------------------------------------------------- // 単位行列への初期化 // //・カレント行列を単位行列に初期化する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Identity(bufp) \ { \ (bufp)[0] = GXOP_MTX_IDENTITY; \ \ (bufp) += (1 + GXOP_MTX_IDENTITY_NPARAMS); \ } //---------------------------------------------------------------------- // 平行移動行列の適用 // //・カレント行列に平行移動行列を乗算する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x X成分 // y Y成分 // z Z成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Translate(bufp, x, y, z) \ { \ (bufp)[0] = GXOP_MTX_TRANS; \ \ (bufp)[1] = (x); \ (bufp)[2] = (y); \ (bufp)[3] = (z); \ \ (bufp) += (1 + GXOP_MTX_TRANS_NPARAMS); \ } // 中間マクロ(下記のマクロは直接使用しないで下さい) #define _GXB_TranslateBefore(bufp, x, y, z) \ { \ (bufp)[0] = (x); \ (bufp)[1] = (y); \ (bufp)[2] = (z); \ \ (bufp) += GXOP_MTX_TRANS_NPARAMS; \ } //---------------------------------------------------------------------- // カレント行列へのロード // //・カレント行列に指定した行列を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // srcp ロードする行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_LoadMtx(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_LOAD_4x3; \ \ (bufp) = _GXB_SetMtx(&(bufp)[1], srcp); \ } #define GXB_LoadMtx33(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_LOAD_4x3; \ \ (bufp) = _GXB_SetMtx33(&(bufp)[1], srcp); \ *(bufp)++ = 0; \ *(bufp)++ = 0; \ *(bufp)++ = 0; \ } #define GXB_LoadMtx44(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_LOAD_4x4; \ \ (bufp) = _GXB_SetMtx44(&(bufp)[1], srcp); \ } u32 *_GXB_SetMtx( u32 *bufp, const Mtx *srcp); u32 *_GXB_SetMtx33(u32 *bufp, const Mtx33 *srcp); u32 *_GXB_SetMtx44(u32 *bufp, const Mtx44 *srcp); //---------------------------------------------------------------------- // 一般行列とカレント行列の乗算 // //・カレント行列に指定した行列を乗算する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // srcp 適用する行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_MultMtx(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_SetMtx(&(bufp)[1], srcp); \ } #define GXB_MultMtx33(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_SetMtx33(&(bufp)[1], srcp); \ } #define GXB_MultMtx44(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x4; \ \ (bufp) = _GXB_SetMtx44(&(bufp)[1], srcp); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に一般行列を乗算 // //・カレント行列へ平行移動行列と一般行列の結合行列を乗算する // ディスプレイリストを生成します。 // //・GXB_Translate()+GXB_MultMtx33() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x X成分 // y Y成分 // z Z成分 // srcp 適用する3x3行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Translate2MultMtx33(bufp, x, y, z, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_SetMtx33(&(bufp)[1], srcp); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // 転置行列の適用 // //・カレント行列に指定した行列の転置行列を乗算する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // srcp 転置前の行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_TransposeMtx(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_TransposeMtx(&(bufp)[1], srcp); \ } #define GXB_TransposeMtx33(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_TransposeMtx33(&(bufp)[1], srcp); \ } #define GXB_TransposeMtx44(bufp, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x4; \ \ (bufp) = _GXB_TransposeMtx44(&(bufp)[1], srcp); \ } u32 *_GXB_TransposeMtx( u32 *bufp, const Mtx *srcp); u32 *_GXB_TransposeMtx33(u32 *bufp, const Mtx33 *srcp); u32 *_GXB_TransposeMtx44(u32 *bufp, const Mtx44 *srcp); //---------------------------------------------------------------------- // 平行移動行列を適用後に転置行列を適用 // //・カレント行列へ平行移動行列と転置行列の結合行列を乗算する // ディスプレイリストを生成します。 // //・GXB_Translate()+GXB_TransposeMtx33() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // srcp 転置前の3x3行列のポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Translate2TransposeMtx33(bufp, x, y, z, srcp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_TransposeMtx33(&(bufp)[1], srcp); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // スケール行列の適用(位置座標行列のみ) // //・カレント行列にスケール行列を乗算する // ディスプレイリストを生成します。 //・行列モードが Position・Vector 同時設定モードの場合でも // 位置座標行列のみに適用されます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x X成分 // y Y成分 // z Z成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Scale(bufp, x, y, z) \ { \ (bufp)[0] = GXOP_MTX_SCALE; \ \ (bufp)[1] = (x) >>VG_SFT_DF; \ (bufp)[2] = (y) >>VG_SFT_DF; \ (bufp)[3] = (z) >>VG_SFT_DF; \ \ (bufp) += (1 + GXOP_MTX_SCALE_NPARAMS); \ } //---------------------------------------------------------------------- // スケール行列の適用(位置座標行列&方向ベクトル行列) // //・カレント行列にスケール行列を乗算する // ディスプレイリストを生成します。 //・行列モードが Position・Vector 同時設定モードの場合には // 位置座標行列と方向ベクトル行列の両方に適用されます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x X成分 // y Y成分 // z Z成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_ScaleWithVector(bufp, x, y, z) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_ScaleWithVector(&(bufp)[1], x, y, z); \ } u32 *_GXB_ScaleWithVector(u32 *bufp, s32 x, s32 y, s32 z); //---------------------------------------------------------------------- // 平行移動行列を適用後に // スケール行列を適用(位置座標行列&方向ベクトル行列) // //・カレント行列へ平行移動行列とスケール行列の結合行列を乗算する // ディスプレイリストを生成します。 //・行列モードが Position・Vector 同時設定モードの場合には // 位置座標行列と方向ベクトル行列の両方に適用されます。 // //・GXB_Translate()+GXB_ScaleWithVector() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // xT 平行移動のX成分 // yT 平行移動のY成分 // zT 平行移動のZ成分 // xS スケールのX成分 // yS スケールのY成分 // zS スケールのZ成分 // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Translate2ScaleWithVector(bufp, xT, yT, zT, xS, yS, zS) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_ScaleWithVector(&(bufp)[1], xS, yS, zS); \ _GXB_TranslateBefore(bufp, xT, yT, zT); \ } //---------------------------------------------------------------------- // 主軸回転行列の適用 // //・カレント行列に各主軸回りに回転する行列を乗算する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // theta 回転角度[256|1024|4096段階] // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_RotateX(bufp, theta) GXB_RotatePriv(bufp, X, SIN_NDIV_DEFAULT, theta) #define GXB_RotateY(bufp, theta) GXB_RotatePriv(bufp, Y, SIN_NDIV_DEFAULT, theta) #define GXB_RotateZ(bufp, theta) GXB_RotatePriv(bufp, Z, SIN_NDIV_DEFAULT, theta) #define GXB_RotateX256(bufp, theta) GXB_RotatePriv(bufp, X, 256, theta) #define GXB_RotateY256(bufp, theta) GXB_RotatePriv(bufp, Y, 256, theta) #define GXB_RotateZ256(bufp, theta) GXB_RotatePriv(bufp, Z, 256, theta) #define GXB_RotateX1024(bufp, theta) GXB_RotatePriv(bufp, X, 1024, theta) #define GXB_RotateY1024(bufp, theta) GXB_RotatePriv(bufp, Y, 1024, theta) #define GXB_RotateZ1024(bufp, theta) GXB_RotatePriv(bufp, Z, 1024, theta) #define GXB_RotateX4096(bufp, theta) GXB_RotatePriv(bufp, X, 4096, theta) #define GXB_RotateY4096(bufp, theta) GXB_RotatePriv(bufp, Y, 4096, theta) #define GXB_RotateZ4096(bufp, theta) GXB_RotatePriv(bufp, Z, 4096, theta) u32 *_GXB_RotateX256(u32 *bufp, u32 theta); u32 *_GXB_RotateY256(u32 *bufp, u32 theta); u32 *_GXB_RotateZ256(u32 *bufp, u32 theta); u32 *_GXB_RotateX1024(u32 *bufp, u32 theta); u32 *_GXB_RotateY1024(u32 *bufp, u32 theta); u32 *_GXB_RotateZ1024(u32 *bufp, u32 theta); u32 *_GXB_RotateX4096(u32 *bufp, u32 theta); u32 *_GXB_RotateY4096(u32 *bufp, u32 theta); u32 *_GXB_RotateZ4096(u32 *bufp, u32 theta); // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_RotatePriv(bufp, axis, ndiv, theta) \ GXB_RotateNDiv(bufp, axis, ndiv, theta) #define GXB_RotateNDiv(bufp, axis, ndiv, theta) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_Rotate##axis##ndiv(&(bufp)[1], theta); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に主軸回転行列を適用 // //・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算する // ディスプレイリストを生成します。 // //・GXB_Translate()+GXB_Rotate[X|Y|Z][256|1024|4096]() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // theta 回転角度[256|1024|4096段階] // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Translate2RotateX(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, X, SIN_NDIV_DEFAULT, theta) #define GXB_Translate2RotateY(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Y, SIN_NDIV_DEFAULT, theta) #define GXB_Translate2RotateZ(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Z, SIN_NDIV_DEFAULT, theta) #define GXB_Translate2RotateX256(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, X, 256, theta) #define GXB_Translate2RotateY256(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Y, 256, theta) #define GXB_Translate2RotateZ256(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Z, 256, theta) #define GXB_Translate2RotateX1024(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, X, 1024, theta) #define GXB_Translate2RotateY1024(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Y, 1024, theta) #define GXB_Translate2RotateZ1024(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Z, 1024, theta) #define GXB_Translate2RotateX4096(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, X, 4096, theta) #define GXB_Translate2RotateY4096(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Y, 4096, theta) #define GXB_Translate2RotateZ4096(bufp, x, y, z, theta) GXB_Translate2RotatePriv(bufp, x, y, z, Z, 4096, theta) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_Translate2RotatePriv(bufp, x, y, z, axis, ndiv, theta) \ GXB_Translate2RotateNDiv(bufp, x, y, z, axis, ndiv, theta) #define GXB_Translate2RotateNDiv(bufp, x, y, z, axis, ndiv, theta) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_Rotate##axis##ndiv(&(bufp)[1], theta); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // 主軸回転行列(三角関数による回転角指定)の適用 // //・カレント行列に各主軸回りに回転する行列を乗算する // ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_RotateXSinCos(bufp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateXSinCos(&(bufp)[1], sinA, cosA); \ } #define GXB_RotateYSinCos(bufp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateYSinCos(&(bufp)[1], sinA, cosA); \ } #define GXB_RotateZSinCos(bufp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateZSinCos(&(bufp)[1], sinA, cosA); \ } u32 *_GXB_RotateXSinCos(u32 *bufp, s32 sinA, s32 cosA); u32 *_GXB_RotateYSinCos(u32 *bufp, s32 sinA, s32 cosA); u32 *_GXB_RotateZSinCos(u32 *bufp, s32 sinA, s32 cosA); //---------------------------------------------------------------------- // 平行移動行列を適用後に // 主軸回転行列(三角関数による回転角指定)を適用 // //・カレント行列へ平行移動行列と主軸回転行列の結合行列を乗算する // ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・GXB_Translate()+GXB_Rotate[X|Y|Z]SinCos() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_Translate2RotateXSinCos(bufp, x, y, z, sinA, cosA) GXB_Translate2RotateSinCosPriv(bufp, x, y, z, X, sinA, cosA) #define GXB_Translate2RotateYSinCos(bufp, x, y, z, sinA, cosA) GXB_Translate2RotateSinCosPriv(bufp, x, y, z, Y, sinA, cosA) #define GXB_Translate2RotateZSinCos(bufp, x, y, z, sinA, cosA) GXB_Translate2RotateSinCosPriv(bufp, x, y, z, Z, sinA, cosA) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_Translate2RotateSinCosPriv(bufp, x, y, z, axis, sinA, cosA) \ GXB_Translate2RotateSinCosNDiv(bufp, x, y, z, axis, sinA, cosA) #define GXB_Translate2RotateSinCosNDiv(bufp, x, y, z, axis, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_RotateZSinCos(&(bufp)[1], sinA, cosA); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // 任意軸回転行列の適用 // //・カレント行列に任意のベクトルを軸として回転する行列を乗算する // ディスプレイリストを生成します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 // //・引数: // bufp ディスプレイリストバッファのポインタ // axisp 回転軸ベクトルのポインタ // theta 回転角度[256|1024|4096段階] // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_RotateAxis( bufp, axisp, theta) GXB_RotateAxisPriv( bufp, SIN_NDIV_DEFAULT, axisp, theta) #define GXB_RotateAxisFast(bufp, axisp, theta) GXB_RotateAxisPrivFast(bufp, SIN_NDIV_DEFAULT, axisp, theta) #define GXB_RotateAxis256( bufp, axisp, theta) GXB_RotateAxisPriv( bufp, 256, axisp, theta) #define GXB_RotateAxis256Fast(bufp, axisp, theta) GXB_RotateAxisPrivFast(bufp, 256, axisp, theta) #define GXB_RotateAxis1024( bufp, axisp, theta) GXB_RotateAxisPriv( bufp, 1024, axisp, theta) #define GXB_RotateAxis1024Fast(bufp, axisp, theta) GXB_RotateAxisPrivFast(bufp, 1024, axisp, theta) #define GXB_RotateAxis4096( bufp, axisp, theta) GXB_RotateAxisPriv( bufp, 4096, axisp, theta) #define GXB_RotateAxis4096Fast(bufp, axisp, theta) GXB_RotateAxisPrivFast(bufp, 4096, axisp, theta) u32 *_GXB_RotateAxis256( u32 *bufp, const Vec *axisp, u32 theta); u32 *_GXB_RotateAxis256Fast(u32 *bufp, const Vec *axisp, u32 theta); u32 *_GXB_RotateAxis1024( u32 *bufp, const Vec *axisp, u32 theta); u32 *_GXB_RotateAxis1024Fast(u32 *bufp, const Vec *axisp, u32 theta); u32 *_GXB_RotateAxis4096( u32 *bufp, const Vec *axisp, u32 theta); u32 *_GXB_RotateAxis4096Fast(u32 *bufp, const Vec *axisp, u32 theta); // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_RotateAxisPriv( bufp, ndiv, axisp, theta) \ GXB_RotateAxisNDiv( bufp, ndiv, axisp, theta) #define GXB_RotateAxisNDiv( bufp, ndiv, axisp, theta) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateAxis##ndiv(&(bufp)[1], axisp, theta); \ } #define GXB_RotateAxisPrivFast(bufp, ndiv, axisp, theta) \ GXB_RotateAxisNDivFast(bufp, ndiv, axisp, theta) #define GXB_RotateAxisNDivFast(bufp, ndiv, axisp, theta) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateAxis##ndiv##Fast(&(bufp)[1], axisp, theta); \ } //---------------------------------------------------------------------- // 平行移動行列を適用後に任意軸回転行列を適用 // //・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算する // ディスプレイリストを生成します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 //・GXB_Translate()+GXB_RotateAxis[256|1024|4096][Fast]() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // axisp 回転軸ベクトルのポインタ // theta 回転角度[256|1024|4096段階] // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_Translate2RotateAxis( bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPriv( bufp, x, y, z, SIN_NDIV_DEFAULT, axisp, theta) #define GXB_Translate2RotateAxisFast(bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPrivFast(bufp, x, y, z, SIN_NDIV_DEFAULT, axisp, theta) #define GXB_Translate2RotateAxis256( bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPriv( bufp, x, y, z, 256, axisp, theta) #define GXB_Translate2RotateAxis256Fast(bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPrivFast(bufp, x, y, z, 256, axisp, theta) #define GXB_Translate2RotateAxis1024( bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPriv( bufp, x, y, z, 1024, axisp, theta) #define GXB_Translate2RotateAxis1024Fast(bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPrivFast(bufp, x, y, z, 1024, axisp, theta) #define GXB_Translate2RotateAxis4096( bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPriv( bufp, x, y, z, 4096, axisp, theta) #define GXB_Translate2RotateAxis4096Fast(bufp, x, y, z, axisp, theta) GXB_Translate2RotateAxisPrivFast(bufp, x, y, z, 4096, axisp, theta) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_Translate2RotateAxisPriv( bufp, x, y, z, ndiv, axisp, theta) \ GXB_Translate2RotateAxisNDiv( bufp, x, y, z, ndiv, axisp, theta) #define GXB_Translate2RotateAxisNDiv( bufp, x, y, z, ndiv, axisp, theta) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_RotateAxis##ndiv(&(bufp)[1], axisp, theta); \ _GXB_TranslateBefore(bufp, x, y, z); \ } #define GXB_Translate2RotateAxisPrivFast(bufp, x, y, z, ndiv, axisp, theta) \ GXB_Translate2RotateAxisNDivFast(bufp, x, y, z, ndiv, axisp, theta) #define GXB_Translate2RotateAxisNDivFast(bufp, x, y, z, ndiv, axisp, theta) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_RotateAxis##ndiv##Fast(&(bufp)[1], axisp, theta); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // 任意軸回転行列(三角関数による回転角指定)の適用 // //・カレント行列に任意のベクトルを軸として回転する行列を乗算する // ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 // //・引数: // bufp ディスプレイリストバッファのポインタ // axisp 回転軸ベクトルのポインタ // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_RotateAxisSinCos(bufp, axisp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateAxisSinCos(&(bufp)[1], axisp, sinA, cosA); \ } #define GXB_RotateAxisSinCosFast(bufp, axisp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_RotateAxisSinCosFast(&(bufp)[1], axisp, sinA, cosA); \ } u32 *_GXB_RotateAxisSinCos(u32 *bufp, const Vec *axisp, s32 sinA, s32 cosA); u32 *_GXB_RotateAxisSinCosFast(u32 *bufp, const Vec *axisp, s32 sinA, s32 cosA); //---------------------------------------------------------------------- // 平行移動行列を適用後に // 任意軸回転行列(三角関数による回転角指定)を適用 // //・カレント行列へ平行移動行列と任意軸回転行列の結合行列を乗算する // ディスプレイリストを生成します。 //・回転角度はサインとコサインにて指定します。 // //・通常版は関数内で平方根演算器と除算器を使用しますが、高速版は使用しません // (高速版には単位ベクトルを渡して下さい)。 //・GXB_Translate()+GXB_RotateAxisSinCos[Fast]() よりも // ジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // axisp 回転軸ベクトルのポインタ // sinA 回転角度のサイン // cosA 回転角度のコサイン // //・戻り値:なし // //※通常版は平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_Translate2RotateAxisSinCos( bufp, x, y, z, axisp, sinA, cosA) GXB_Translate2RotateAxisSinCosPriv( bufp, x, y, z, axisp, sinA, cosA) #define GXB_Translate2RotateAxisSinCosFast(bufp, x, y, z, axisp, sinA, cosA) GXB_Translate2RotateAxisSinCosPrivFast(bufp, x, y, z, axisp, sinA, cosA) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_Translate2RotateAxisSinCosPriv( bufp, x, y, z, axisp, sinA, cosA) \ GXB_Translate2RotateAxisSinCosNDiv( bufp, x, y, z, axisp, sinA, cosA) #define GXB_Translate2RotateAxisSinCosNDiv( bufp, x, y, z, axisp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_RotateAxisSinCos(&(bufp)[1], axisp, sinA, cosA); \ _GXB_TranslateBefore(bufp, x, y, z); \ } #define GXB_Translate2RotateAxisSinCosPrivFast(bufp, x, y, z, axisp, sinA, cosA) \ GXB_Translate2RotateAxisSinCosNDivFast(bufp, x, y, z, axisp, sinA, cosA) #define GXB_Translate2RotateAxisSinCosNDivFast(bufp, x, y, z, axisp, sinA, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_RotateAxisSinCosFast(&(bufp)[1], axisp, sinA, cosA); \ _GXB_TranslateBefore(bufp, 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 ] // //・関数内で平方根演算器と除算器を使用します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます) // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_AlignZ(bufp, vLookInvp) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_AlignZ(&(bufp)[1], vLookInvp); \ } u32 *_GXB_AlignZ(u32 *bufp, 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 ] // //・関数内で平方根演算器と除算器を使用します。 //・GXB_Translate()+GXB_AlignZ() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 平行移動のX成分 // y 平行移動のY成分 // z 平行移動のZ成分 // vLookInvp 視線と逆方向の単位ベクトル(*_LookAt*() で得られます) // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_Translate2AlignZ(bufp, x, y, z, vLookInvp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_AlignZ(&(bufp)[1], vLookInvp); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // クォータニオンから変換した回転行列の適用 // //・カレント行列へクォータニオンから変換した回転行列を適用する // ディスプレイリストを生成します。 // //・通常版は除算器を使用しますが、高速版は使用しません // (高速版には正規化クォータニオンを渡して下さい)。 // //・引数: // bufp ディスプレイリストバッファのポインタ // quatp クォータニオンのポインタ // //・戻り値:なし // //※通常版は除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- #define GXB_QuatMtx(bufp, quatp) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_QuatMtx(&(bufp)[1], quatp); \ } #define GXB_QuatMtxFast(bufp, quatp) \ { \ (bufp)[0] = GXOP_MTX_MULT_3x3; \ \ (bufp) = _GXB_QuatMtxFast(&(bufp)[1], quatp); \ } u32 *_GXB_QuatMtx(u32 *bufp, const Quat *quatp); u32 *_GXB_QuatMtxFast(u32 *bufp, const Quat *quatp); //---------------------------------------------------------------------- // 平行移動行列を適用後に // クォータニオンから変換した回転行列を適用 // //・カレント行列へ平行移動行列とクォータニオンから変換した回転行列 // の結合行列を乗算する、ディスプレイリストを生成します。 // //・通常版は除算器を使用しますが、高速版は使用しません // (高速版には正規化クォータニオンを渡して下さい)。 //・GXB_Translate()+GXB_QuatMtx[Fast]() よりもジオメトリエンジンの負荷を減らせます。 // //・引数: // bufp ディスプレイリストバッファのポインタ // quatp クォータニオンのポインタ // //・戻り値:なし // //※通常版は除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- #define GXB_Translate2QuatMtx( bufp, x, y, z, quatp) GXB_Translate2QuatMtxPriv( bufp, x, y, z, quatp) #define GXB_Translate2QuatMtxFast(bufp, x, y, z, quatp) GXB_Translate2QuatMtxPrivFast(bufp, x, y, z, quatp) // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_Translate2QuatMtxPriv( bufp, x, y, z, quatp) \ GXB_Translate2QuatMtxNDiv( bufp, x, y, z, quatp) #define GXB_Translate2QuatMtxNDiv( bufp, x, y, z, quatp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_QuatMtx(&(bufp)[1], quatp); \ _GXB_TranslateBefore(bufp, x, y, z); \ } #define GXB_Translate2QuatMtxPrivFast(bufp, x, y, z, quatp) \ GXB_Translate2QuatMtxNDivFast(bufp, x, y, z, quatp) #define GXB_Translate2QuatMtxNDivFast(bufp, x, y, z, quatp) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_QuatMtxFast(&(bufp)[1], quatp); \ _GXB_TranslateBefore(bufp, x, y, z); \ } //---------------------------------------------------------------------- // 左右対称の透視射影行列の適用 // //・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算する // ディスプレイリストを生成します。 // //・関数内で除算器を使用します。 // //・引数: // opp ディスプレイリストバッファ中のコマンド領域のポインタ // prmp ディスプレイリストバッファ中のパラメータ領域のポインタ // fovy 縦方向の視野角度[256|1024|4096段階] // aspect 横方向の視野を確定する縦横比(視界での 幅/高さ) // near 視点からnearクリップ面までの距離(常に正) // far 視点からfarクリップ面までの距離 (常に正) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_Perspective(bufp, fovy, aspect, near, far, scaleW) GXB_PerspectivePriv(SIN_NDIV_DEFAULT, bufp, fovy, aspect, near, far, scaleW) #define GXB_Perspective256( bufp, fovy, aspect, near, far, scaleW) GXB_PerspectivePriv(256, bufp, fovy, aspect, near, far, scaleW) #define GXB_Perspective1024(bufp, fovy, aspect, near, far, scaleW) GXB_PerspectivePriv(1024, bufp, fovy, aspect, near, far, scaleW) #define GXB_Perspective4096(bufp, fovy, aspect, near, far, scaleW) GXB_PerspectivePriv(4096, bufp, fovy, aspect, near, far, scaleW) u32 *_GXB_Perspective256(u32 *bufp, u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW); u32 *_GXB_Perspective1024(u32 *bufp, u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW); u32 *_GXB_Perspective4096(u32 *bufp, u32 fovy, s32 aspect, s32 near, s32 far, s32 scaleW); // 中間マクロ(下記のマクロは直接使用しないで下さい) #define GXB_PerspectivePriv(ndiv, bufp, fovy, aspect, near, far, scaleW) \ GXB_PerspectiveNDiv(ndiv, bufp, fovy, aspect, near, far, scaleW) #define GXB_PerspectiveNDiv(ndiv, bufp, fovy, aspect, near, far, scaleW) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x4; \ \ (bufp) = _GXB_Perspective##ndiv(&(bufp)[1], fovy, aspect, near, far, scaleW); \ } //---------------------------------------------------------------------- // 左右対称の透視射影行列(三角関数による視野角指定)の適用 // //・左右対称の透視法視錐台の行列を作成し、それをカレント行列へ乗算する // ディスプレイリストを生成します。 //・視野角度はサインとコサインにて指定します。 // //・関数内で除算器を使用します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // sinA 縦方向の視野角度のサイン // cosA 縦方向の視野角度のコサイン(上位関数からの呼び出し高速化のため最後に渡す) // aspect 横方向の視野を確定する縦横比(視野の 幅/高さ) // near 視点からnearクリップ面までの距離(常に正) // far 視点からfarクリップ面までの距離 (常に正) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_PerspectiveSinCos(bufp, sinA, fovy, aspect, near, far, scaleW, cosA) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x4; \ \ (bufp) = _GXB_PerspectiveSinCos(&(bufp)[1], sinA, fovy, aspect, near, far, scaleW, cosA); \ } u32 *_GXB_PerspectiveSinCos(u32 *bufp, s32 sinA, s32 aspect, s32 near, s32 far, s32 scaleW, s32 cosA); //---------------------------------------------------------------------- // 透視射影行列の適用 // //・透視法視錐台の行列を作成し、それをカレント行列へ乗算する // ディスプレイリストを生成します。 // //・関数内で除算器を使用します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // t nearクリップ面上辺のy座標 // b nearクリップ面下辺のy座標 // l nearクリップ面左辺のx座標 // r nearクリップ面右辺のx座標 // n 視点からnearクリップ面までの距離(常に正) // f 視点からfarクリップ面までの距離 (常に正) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_Frustum(bufp, t, b, l, r, n, f, scaleW) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x4; \ \ (bufp) = _GXB_Frustum(&(bufp)[1], t, b, l, r, n, f, scaleW); \ } u32 *_GXB_Frustum(u32 *bufp, s32 t, s32 b, s32 l, s32 r, s32 n, s32 f, s32 scaleW); //---------------------------------------------------------------------- // 正射影行列の適用 // //・正射影の平行視体積の行列を作成し、それをカレント行列へ乗算する // ディスプレイリストを生成します。 // //・関数内で除算器を使用します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // t nearクリップ面上辺のy座標 // b nearクリップ面下辺のy座標 // l nearクリップ面左辺のx座標 // r nearクリップ面右辺のx座標 // n 視点からnearクリップ面までの距離(正負どちらでも可) // f 視点からfarクリップ面までの距離 (正負どちらでも可) // scaleW クリップ座標W値のスケールパラメータ(座標変換後の精度調整) // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_Ortho(bufp, t, b, l, r, n, f, scaleW) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x4; \ \ (bufp) = _GXB_Ortho(&(bufp)[1], t, b, l, r, n, f, scaleW); \ } u32 *_GXB_Ortho(u32 *bufp, s32 t, s32 b, s32 l, s32 r, s32 n, s32 f, s32 scaleW); //---------------------------------------------------------------------- // 視界行列の適用 // //・視界行列を作成し、それをカレント行列へ乗算する // ディスプレイリストを生成します。 // //・関数内でベクトルの正規化のために平方根演算器と除算器を使用します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // eye 視点 // at 注視点 // vUp 上方向ベクトル // vDst 0(NULLポインタ)以外を渡すと、視線逆方向ベクトルを返します // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // CPUのストールが発生してしまいます。 //---------------------------------------------------------------------- #define GXB_LookAt( bufp, eye, at, vUp, vDst) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_LookAt(&(bufp)[1], eye, at, vUp, vDst); \ } #define GXB_LookAtFast(bufp, eye, at, vUp, vDst) \ { \ (bufp)[0] = GXOP_MTX_MULT_4x3; \ \ (bufp) = _GXB_LookAtFast(&(bufp)[1], eye, at, vUp, vDst); \ } u32 *_GXB_LookAt( u32 *bufp, const Pos *eye, const Pos *at, const Vec *vUp, Vec *vDst); u32 *_GXB_LookAtFast(u32 *bufp, const Pos *eye, const Pos *at, const Vec *vUp, Vec *vDst); //---------------------------------------------------------------------- // ボックステスト // //・立方体が視体積に入るかどうかをテストための構造体を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // box テストボックス(XYZWHD161616161616) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_BoxTest1(bufp, box) \ { \ (bufp)[0] = GXOP_BOX_TEST; \ *(TestBox *)&(bufp)[1] = (box); \ \ (bufp) += (1 + GXOP_BOX_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // ボックステスト // //・立方体が視体積に入るかどうかをテストために各パラメータを設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x テストボックス左下X座標(16bit) // y テストボックス左下Y座標( 〃 ) // z テストボックス左下Z座標( 〃 ) // w テストボックス幅 ( 〃 ) // h テストボックス高さ ( 〃 ) // d テストボックス奥行き ( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_BoxTest6(bufp, x, y, z, w, h, d) \ { \ (bufp)[0] = GXOP_BOX_TEST; \ (bufp)[1] = XY1616(x, y); \ (bufp)[2] = ZW1616(z, w); \ (bufp)[3] = HD1616(h, d); \ \ (bufp) += (1 + GXOP_BOX_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 位置座標テスト // //・テスト用の位置座標の構造体を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // pos 位置座標(XYZ161616) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_PositionTest1(bufp, pos) \ { \ (bufp)[0] = GXOP_POS_TEST; \ *(Pos16 *)&(bufp)[1] = (pos); \ \ (bufp) += (1 + GXOP_POS_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 位置座標テスト // //・テスト用の位置座標の各要素を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 位置座標X成分(16bit) // y Y成分( 〃 ) // z Z成分( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_PositionTest3(bufp, x, y, z) \ { \ (bufp)[0] = GXOP_POS_TEST; \ (bufp)[1] = XY1616(x, y); \ (bufp)[2] = (z); \ \ (bufp) += (1 + GXOP_POS_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 方向ベクトルテスト // //・テスト用の方向ベクトル構造体を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // vector 方向ベクトル(XYZ101010) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_VectorTest1(bufp, vector) \ { \ (bufp)[0] = GXOP_VEC_TEST; \ *(Vec10 *)&(bufp)[1] = (vector); \ \ (bufp) += (1 + GXOP_VEC_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // 方向ベクトルテスト // //・テスト用の方向ベクトルの各要素を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // x 方向ベクトルX成分(10bit) // y Y成分( 〃 ) // z Z成分( 〃 ) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_VectorTest3(bufp, x, y, z) \ { \ (bufp)[0] = GXOP_VEC_TEST; \ (bufp)[1] = XYZ101010(x, y, z); \ \ (bufp) += (1 + GXOP_VEC_TEST_NPARAMS); \ } //---------------------------------------------------------------------- // ライトベクトル設定 // //・ライトベクトルへライトベクトル構造体を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // lightVector ライトベクトル(XYZ101010) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_LightVector1(bufp, lightVector) \ { \ (bufp)[0] = GXOP_LIGHT_VECTOR; \ *(LightVector *)&(bufp)[1] = (lightVector); \ \ (bufp) += (1 + GXOP_LIGHT_VECTOR_NPARAMS); \ } //---------------------------------------------------------------------- // ライトカラー設定 // //・ライトカラーへライトカラー構造体を設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // lightColor ライトカラー(RGB555) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_LightColor1(bufp, lightColor) \ { \ (bufp)[0] = GXOP_LIGHT_COLOR; \ *(LightColor *)&(bufp)[1] = (lightColor); \ \ (bufp) += (1 + GXOP_LIGHT_COLOR_NPARAMS); \ } //---------------------------------------------------------------------- // ライトベクトル設定 // //・ライトベクトルへライト番号と方向ベクトルを設定する // ディスプレイリストを生成します。 // //・引数: // bufp ディスプレイリストバッファのポインタ // no ライト番号 // vector 方向ベクトル(XYZ101010) // //・戻り値:なし //---------------------------------------------------------------------- #define GXB_LightVector2(bufp, no, vector) \ { \ (bufp)[0] = GXOP_LIGHT_VECTOR; \ (bufp)[1] = ((no)<