/*****************************************************************
         一般的に使えないマクロ（変数などを書き込んでいる）
 *****************************************************************/

#ifndef	_MO_MACRO2_HEAD
#define	_MO_MACRO2_HEAD



#if 0
#define  RAD2DEG(x)    ((x)*180.0f/PI)    /*  ラジアンを度になおすマクロ  */
#define  DEG2RAD(x)    ((x)*PI/180.0f)    /*  度をラジアンになおすマクロ  */
#define  moSIN(degree)    SINF((int)(SIN_RANGE*degree/360))    /*  sin  */
#endif
#if (FLAG_ENV_ORTHO==1)
#define  moCOS(degree)    COSF((int)(SIN_RANGE*degree/360))    /*  cos  */
#endif


/*****  カーソルを描画するマクロ  *****/
#define  gmDrawCursol( pkt )                                                          \
{                                                                                     \
  /*  カーソルが画面の端に行ったとき、カーソルをシザリングをする必要がある。*/        \
  /*  テクスチャレクタングルをシザリングするときは gSPScisTextureRectangle  */        \
  /*  を使う必要がある。また、コピーモードの場合は正しくシザリングが行われ  */        \
  /*  ないので、１サイクルモードにする必要がある。 */                                 \
                                                                                      \
  /*  ＲＧＢＡ（１サイクルモード）のテクスチャレクタングルを描くための準備  */        \
  gSPDisplayList( pkt, mo_basic_rgba_texture_rectangle_dl );                          \
                                                                                      \
  /*  テクスチャのロード  */                                                          \
  gDPLoadTextureBlock( pkt, cursol, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 16, 0,           \
		       G_TX_NOMIRROR, G_TX_NOMIRROR,                                  \
		       G_TX_NOMASK, G_TX_NOMASK,                                      \
		       G_TX_NOLOD, G_TX_NOLOD );                                      \
                                                                                      \
   /*  タイル 0 番（G_TX_RENDERTILE）に割り当てる  */                                 \
  gDPSetTile( pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 0, G_TX_RENDERTILE, 0,             \
	      G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD,                                 \
	      G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD );                               \
                                                                                      \
  /*  シザリング付きレクタングルを描く（１サイクルなので、右下の座標は含まれない） */ \
  gSPScisTextureRectangle( pkt,                                                       \
			   mo_cursol_x << 2,                                          \
			   mo_cursol_y << 2,                                          \
			   ( mo_cursol_x + 16 ) << 2,                                 \
 			   ( mo_cursol_y + 16 ) << 2,                                 \
			   G_TX_RENDERTILE, 0, 0, 1<<10, 1<<10 )                      \
}



/*****  16bitＲＧＢのテクスチャの上にインテンシティ４bitのテクスチャを重ねて描画するマクロ  *****/
#define  gmDrawIonRGB( pkt, RGB_name, I_name, x_pos, y_pos, x_size, y_size, I_color_r, I_color_g, I_color_b )    \
{                                                                                                                \
  /*  コピーモードでテクスチャレクタングルを描く際、全てに共通する Gfx  */                                       \
  gSPDisplayList( pkt, mo_basic_copy_texture_rectangle_dl );                                                     \
                                                                                                                 \
  /*  16bitRGBA（コピーモード）のテクスチャをロードし、描画するマクロ  */                                        \
  gmDrawCopyTexture( pkt, RGB_name, x_pos, y_pos, x_size, y_size );                                              \
                                                                                                                 \
  /*  インテンシティのテクスチャ用の設定  */                                                                     \
  gDPPipeSync( pkt );                                                                                            \
  gDPSetCycleType( pkt, G_CYC_1CYCLE );                                                                          \
  gDPSetPrimColor( pkt, 0, 0, I_color_r, I_color_g, I_color_b, 255 );                                            \
  gDPSetCombineMode( pkt, G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM );                                \
  gDPSetRenderMode( pkt, G_RM_XLU_SURF, G_RM_XLU_SURF2 );                                                        \
  gDPSetAlphaCompare( pkt, G_AC_NONE );                                                                          \
  gDPSetTextureFilter( pkt, G_TF_POINT );                                                                        \
                                                                                                                 \
  /*  インテンシティのテクスチャのロード  */                                                                     \
  gDPLoadTextureBlock_4b( pkt, I_name, G_IM_FMT_I, x_size, y_size, 0,                                            \
		       G_TX_NOMIRROR, G_TX_NOMIRROR,                                                             \
		       G_TX_NOMASK, G_TX_NOMASK,                                                                 \
		       G_TX_NOLOD, G_TX_NOLOD );                                                                 \
                                                                                                                 \
  /*  タイル 0 番（G_TX_RENDERTILE）に割り当てる  */                                                             \
  gDPSetTile( pkt, G_IM_FMT_I, G_IM_SIZ_4b, x_size/16, 0, G_TX_RENDERTILE, 0,                                    \
	      G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD,                                                            \
	      G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD );                                                          \
                                                                                                                 \
  /*  レクタングルを描く（１サイクルなので、右下の座標は含まれない） */                                          \
  gSPTextureRectangle( pkt,                                                                                      \
		       x_pos << 2,                                                                               \
		       y_pos << 2,                                                                               \
		       ( x_pos + x_size ) << 2,                                                                  \
		       ( y_pos + y_size ) << 2,                                                                  \
		       G_TX_RENDERTILE, 0<<5, 0<<5, 1<<10, 1<<10 )                                               \
}



/*****  正射影でマシンのパーツを描画するマクロ  *****/
#define  gmDrawOrthoParts( pkt, mtx1, mtx2, mtx3, parts_dl )                                          \
{                                                                                                     \
  gSPMatrix( pkt, (u32)(&dynamic_p->machine_MT[mtx1]), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_PUSH );    \
  gSPMatrix( pkt, (u32)(&dynamic_p->machine_MT[mtx2]), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH );  \
  gSPMatrix( pkt, (u32)(&dynamic_p->machine_MT[mtx3]), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH );  \
  gSPDisplayList( pkt, parts_dl );                                                                    \
  gSPPopMatrix( pkt, G_MTX_MODELVIEW )                                                                \
}



/*****  正射影で全てのマシンパーツ（ウイングＧとウイングＦを除く）を描画するマクロ  *****/
#define  gmDrawOrthoParts_ALL( pkt, table )                                                  \
{                                                                                            \
  gmDrawOrthoParts( pkt,  3, 0, 0, table[PARTS_BODY][TYPE_G] );   /*  ボディＧ  */           \
  gmDrawOrthoParts( pkt,  4, 3, 0, table[PARTS_BODY][TYPE_F] );   /*  ボディＦ  */           \
  gmDrawOrthoParts( pkt,  5, 3, 0, table[PARTS_BODY][TYPE_E] );   /*  ボディＥ  */           \
  gmDrawOrthoParts( pkt,  6, 3, 0, table[PARTS_BODY][TYPE_D] );   /*  ボディＤ  */           \
  gmDrawOrthoParts( pkt,  7, 3, 0, table[PARTS_BODY][TYPE_C] );   /*  ボディＣ  */           \
  gmDrawOrthoParts( pkt,  8, 3, 0, table[PARTS_BODY][TYPE_B] );   /*  ボディＢ  */           \
  gmDrawOrthoParts( pkt,  9, 3, 0, table[PARTS_BODY][TYPE_A] );   /*  ボディＡ  */           \
  gmDrawOrthoParts( pkt, 10, 3, 0, table[PARTS_ENGINE][TYPE_G] );   /*  エンジンＧ  */       \
  gmDrawOrthoParts( pkt, 10, 4, 3, table[PARTS_ENGINE][TYPE_F] );   /*  エンジンＦ  */       \
  gmDrawOrthoParts( pkt, 10, 5, 3, table[PARTS_ENGINE][TYPE_E] );   /*  エンジンＥ  */       \
  gmDrawOrthoParts( pkt, 10, 6, 3, table[PARTS_ENGINE][TYPE_D] );   /*  エンジンＤ  */       \
  gmDrawOrthoParts( pkt, 10, 7, 3, table[PARTS_ENGINE][TYPE_C] );   /*  エンジンＣ  */       \
  gmDrawOrthoParts( pkt, 10, 8, 3, table[PARTS_ENGINE][TYPE_B] );   /*  エンジンＢ  */       \
  gmDrawOrthoParts( pkt, 10, 9, 3, table[PARTS_ENGINE][TYPE_A] );   /*  エンジンＡ  */       \
  gmDrawOrthoParts( pkt, 11, 5, 3, table[PARTS_WING][TYPE_E] );   /*  ウイングＥ  */         \
  gmDrawOrthoParts( pkt, 11, 6, 3, table[PARTS_WING][TYPE_D] );   /*  ウイングＤ  */         \
  gmDrawOrthoParts( pkt, 11, 7, 3, table[PARTS_WING][TYPE_C] );   /*  ウイングＣ  */         \
  gmDrawOrthoParts( pkt, 11, 8, 3, table[PARTS_WING][TYPE_B] );   /*  ウイングＢ  */         \
  gmDrawOrthoParts( pkt, 11, 9, 3, table[PARTS_WING][TYPE_A] )    /*  ウイングＡ  */         \
}



#endif


