/********************************************************************************
	gfxmain.h: Ultra 64 MARIO Brothers include file

	Copyright (c) 1996 Nintendo co., ltd.  All rights reserved

	March 29, 1996
 ********************************************************************************/

#ifndef GFXMAIN_H
#define	GFXMAIN_H

#define	GRAPH_TASK		0
#define	AUDIO_TASK		1

#define	SCREEN_WIDTH		320
#define	SCREEN_HEIGHT		240
#define	SCREEN_ASPECT		(320.0f/240.0f)
#define	SCREEN_NEAR			100.0f
#define	SCREEN_FAR			12800.0f
#define	SCREEN_ANGLE		30.0f

#define	CLIP_UPPER			8
#define	CLIP_LOWER			(SCREEN_HEIGHT-8)


#define	LIGHT_X				40
#define	LIGHT_Y				40
#define	LIGHT_Z				40

#define	SC_CLIENT_AUDIO		1
#define	SC_CLIENT_GRAPHIC	2


#define	GAME_DEMO			0
#define	GAME_ONE_PLAYER		1
#define	GAME_TWO_PLAYER		2

#define	MARIO_ID			0
#define	LUIGI_ID			1


typedef void (*RDPDoneProc)(void);


/********************************************************************************/
/*																				*/
/*	Controller button assignment												*/
/*																				*/
/********************************************************************************/

#define	CONT_XA		CONT_A
#define	CONT_XB		CONT_B
#define	CONT_XL		CONT_C
#define	CONT_XD		CONT_D
#define	CONT_XU		CONT_E
#define	CONT_XR		CONT_F
#define	CONT_BACK	CONT_G
#define	CONT_EXIT	0x0080

#define AUTO_A		0x80
#define AUTO_B		0x40
#define AUTO_Z		0x20
#define	AUTO_END	0x10
#define AUTO_CU		0x08
#define AUTO_CD		0x04
#define AUTO_CL		0x02
#define AUTO_CR		0x01


/*################################################################################
 *
 *
 *	Memory types.
 *
 */

/********************************************************************************/
/*	Pixel map.																	*/
/********************************************************************************/

typedef ushort	Pixmap[SCREEN_HEIGHT][SCREEN_WIDTH];

/********************************************************************************/
/*	Dynamic data record.														*/
/********************************************************************************/

typedef struct {
	wlong	memblock[DYNAMIC_BLKSIZE];			/* dynamic memory block			*/
	RSPTask	rsptask;							/* graphic task record			*/
} DynamicRecord, *DynamicPtr;

/********************************************************************************/
/*	player's cap location storage record.										*/
/********************************************************************************/

typedef struct {
	uchar		stage;					/*   1 byte: cap stage					*/
	uchar		scene;					/*   1 byte: cap scene					*/
	SVector		position;				/*   6 byte: cap position				*/
} BuCapLocate;							/*   8 byte: (total)					*/

/********************************************************************************/
/*	player's cap location storage record.										*/
/********************************************************************************/

typedef struct {
	BuCapLocate	caplocate;				/*   8 byte: cap location				*/
	ulong		itemflags;				/*   4 byte: item flags					*/
	uchar		starflags[25];			/*  25 byte: star flags					*/
	uchar		numcoins[15];			/*  15 byte: number of coins			*/
	ushort		dataID;					/*   2 byte: data ID					*/
	ushort		checksum;				/*   2 byte: check sum					*/
} BuStorage;							/*  56 byte: total						*/

/********************************************************************************/
/*	High score backup record.													*/
/********************************************************************************/

typedef struct {
	ulong		order[4];				/*  16 byte: winner						*/
	ushort		sndmode;				/*   2 byte: audio mode					*/
	ushort		reserved[5];			/*	10 byte: reserved					*/
	ushort		dataID;					/*   2 byte: data ID					*/
	ushort		checksum;				/*   2 byte: check sum					*/
} BuHiScore;							/*  32 byte: (total)					*/

/********************************************************************************/
/*	player's cap location storage record.										*/
/********************************************************************************/

typedef struct {
	BuStorage	storage[4][2];			/* 56*2*4 = 448 byte: player storage	*/
	BuHiScore	hiscore[2];				/* 32*2   =  64 byte: high score		*/
} BackupRecord;							/*			512 byte: total				*/

/********************************************************************************/
/*	Controller data record.														*/
/********************************************************************************/

typedef struct {
	short		 stickx;				/* analog stick position x				*/
	short		 sticky;				/* analog stick position y				*/
	float		 levelx;				/* level of stick x						*/
	float		 levely;				/* level of stick y						*/
	float		 length;
	ushort		 status;				/* controller button status				*/
	ushort		 trigger;				/* controller button trigger			*/
	OSContStatus *contst;				/* pointer to the controller status		*/
	OSContPad	 *contdt;				/* pointer to the controller data		*/
	int			  contNo;				/* controller number					*/
} Controller;

/********************************************************************************/
/*	Controller demo data record.												*/
/********************************************************************************/

typedef struct {
	uchar	repeat;						/* repeat time							*/
	char	stickx;						/* analog stick position x				*/
	char	sticky;						/* analog stick position y				*/
	uchar	button;						/* controller button					*/
} DemoController;

/********************************************************************************
 *
 *	External works
 *
 ********************************************************************************/

extern BackupRecord backupMemory;		/* Backup EEROM I/O buffer				*/ 

extern ulong	   frameCounter;		/* game frame counter					*/
extern RSPTask	   *taskPtr;			/* pointer to the task list				*/
extern GfxPtr	   graphPtr;			/* pointer to the gfx list				*/
extern MemPtr	   blockPtr;			/* pointer to the dynamic memory		*/
extern DynamicPtr  currentDynamic;		/* pointer to the current dynamic work	*/
extern RDPDoneProc rdpdoneProc;

/*--------------------------------------------------------------------------------
 *	Controller works
 */
extern Controller controller[3];		/* contoller works						*/
extern Controller *cont1p;				/* pointer to the controller 1			*/
extern Controller *cont2p;				/* pointer to the controoler 2			*/
extern Controller *contOr;				/* pointer to the controller 1 or 2		*/

extern DemoController *autoDemoPtr;
extern ushort		  demoIndexNo;

extern uchar contConnection;			/* controller connection				*/
extern char  eepromExists;				/* EEPROM exists flag					*/

/********************************************************************************
 *
 *	External static datas
 *
 ********************************************************************************/

extern Pixmap frameMemoryA;
extern Pixmap frameMemoryB;
extern Pixmap frameMemoryC;
extern Pixmap depthMemory;
extern ushort textureMemory[32][2048];


extern uwlong rspDramStack[SP_DRAM_STACK_SIZE64];	/* RSP tasks stack			*/

extern DynamicRecord dynamicData[DBLBUF];			/* dynamic data memory		*/
extern PartialRecord playerAnimation;
extern PartialRecord controllerData;


extern Gfx RCP_ClearScreen[];
extern Gfx RCP_hmsBeginString[];
extern Gfx RCP_hmsDrawCharacter[];
extern Gfx RCP_hmsEndString[];


/********************************************************************************
 *
 *	Function prototypes
 *
 ********************************************************************************/

/* RCP segment operations */

extern void
GraphProcess(void *arg);


/* drawing oparations */

extern void BeginDrawing(void);
extern int  EndDrawing(void);
extern void SoftwareBlanking(long color);
extern void SoftwareTrimBlanking(Vp *trimming, long color);
extern void SetTrimmingRectangle(Vp *trimming);

#endif
