/*============================================================================
  NuSYSTEM sample program SNAKE TAIL HACK
  
  graphic.h
  
  Copyright (C) 1997, NINTENDO Co,Ltd.
  ============================================================================*/

#ifndef _GRAPHIC_H_
#define _GRAPHIC_H_
#include "para.h"

/* The screen size */
#define SCREEN_HT        240
#define SCREEN_WD        320

/* The maximum length of the display list of one task */
#define GFX_GLIST_LEN     2048*10

/* The maximum value of the graphic task in 1 retrace period */
#define GFX_GTASK_NUM        2


/*-------------------------- define structure ------------------------------ */
/* The projection-matrix structure */
typedef struct {
  Mtx     projection;
  Mtx     modeling;
  Mtx     viewing;
  
  Mtx     base_trans;
  Mtx     base_rotate;
  Mtx     base_scale;

  Mtx     saku_trans;
  Mtx     saku_rotate;
  Mtx     saku_scale;

  Mtx     obj_trans[OBJ_MAX];
  Mtx     obj_rotate[OBJ_MAX];
  Mtx     obj_scale[OBJ_MAX];

  Mtx     snake_trans[SNAKE_MAX][SNAKE_MAX_LEN+1];
  Mtx     snake_rotate[SNAKE_MAX][SNAKE_MAX_LEN+1];
  Mtx     snake_scale[SNAKE_MAX][SNAKE_MAX_LEN+1];

  Mtx     shot_trans[20];
  Mtx     shot_rotate[20];
  Mtx     shot_scale[20];

  /* The buffer for movie drawing */
  unsigned short MovieBuf[8200];
} Dynamic;

/* Various parameters of the self-machine */
typedef struct {
    int tailcnt[SNAKE_MAX];	/*The number of tails connected to the self-machine*/
    int wallhit[SNAKE_MAX];	/*Whether or not the self-machine is within the range of the map*/
    int objhit[SNAKE_MAX];	/*Whether or not the self-machine is within the range of the map*/
    int shottailhit[SNAKE_MAX];	/*Whether or not the tail shot by the enemy has hit self*/
    int enemyhit[SNAKE_MAX];	/*Whether or not the self-machine has hit the enemy*/
    int bufidx[SNAKE_MAX];	/*The index of the buffer which is for that the tail chases the locus of the self-machine*/
    int bufidx_wk[SNAKE_MAX];	/*Work for the calculation of ^ */
    int stickon[SNAKE_MAX];	/*Whether or not the control stick is pulled down*/
    float head_dir[SNAKE_MAX];	/*The head direction of the self-machine*/
    int sleepcnt[SNAKE_MAX];	/*The fainting time (the V-unit)*/

    int enemytailhit[SNAKE_MAX];	/*Whether or not it has hit the opponent's tail*/
    int enemytailhitnum[SNAKE_MAX];	/*The opponent's tail number when it has hit the opponent's tail*/

    int tail_attr[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The type of the displaying tail*/

    float pos_x[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The displaying X-coordinate*/
    float pos_y[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The displaying Y-coordinate*/
    float pos_z[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The displaying Z-coordinate*/

    float rot_x[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The rotational angle of the displaying X-axis direction*/
    float rot_y[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The rotational angle of the displaying Y-axis direction*/
    float rot_z[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The rotational angle of the displaying Z-axis direction*/

    float size_x[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The scale of the displaying X-axis direction*/
    float size_y[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The scale of the displaying Y-axis direction*/
    float size_z[SNAKE_MAX][SNAKE_MAX_LEN+1];	/*The scale of the displaying Z-axis direction*/
} SnakePara;

/* The parameter of the tail for shooting */
typedef struct{
    float pos_x;	/*The X-coordinate*/
    float pos_y;	/*The Y-coordinate*/
    float pos_z;	/*The Z-coordinate*/
    float rot_x;	/*The rotational angle of the X-axis direction*/
    float rot_y;	/*The rotational angle of the Y-axis direction*/
    float rot_z;	/*The rotational angle of the Z-axis direction*/
    float size_x;
    float size_y;
    float size_z;
    int tail_pattern;
    int user;
    float tail_dir;
    int status;
}ShotTail;

/* The head locus of the self-machine */
typedef struct{
    float SnakeX[TAIL_MOVE_BUF];
    float SnakeY[TAIL_MOVE_BUF];
    float SnakeRotZ[TAIL_MOVE_BUF];
}SnakeMove;


/*-------------------------------- parameter---------------------------------*/
extern Dynamic gfx_dynamic[];
extern Gfx* glistp;
extern Gfx gfx_glist[GFX_GTASK_NUM][GFX_GLIST_LEN];
extern u32 gfx_gtask_no;
/*-------------------------------- function ---------------------------------*/
extern void gfxRCPInit(void);
extern void gfxClearCfb(void);
/*------------------------------- other extern define -----------------------*/
extern Gfx setup_rdpstate[];
extern Gfx setup_rspstate[];

#endif /* _GRAPHIC_H_ */