/*----------------------------------------------------------------------------
	SoH Ninja Layer
----------------------------------------------------------------------------*/

#ifndef _SNX_H_
#define _SNX_H_

#define SX_TEX_NONE 		(-1)
#define SX_MAX_PERI			(4)					/* 最大ペリフェラル数		*/
#define SX_TEX_CACHEONLY	(0x0001)			/* キャッシュのみロード		*/
#define SX_TEX_COLORKEY		(0x0002)			/* カラーキーを設定			*/
#define SX_TEX_ENABLE		(0)
#define SX_TEX_DISABLE		(1)
/*--------------------------------------------------------------------------*/
typedef          char SCHAR;
typedef unsigned char UCHAR;
typedef          short SSHORT;
typedef unsigned short USHORT;
typedef          long SLONG;
typedef unsigned long ULONG;
typedef float FLOAT;
typedef long SX_TEXID;
typedef long BOOL;
/*--------------------------------------------------------------------------*/
typedef enum {
	SX_OK				,						/* ＯＫ						*/
	SX_ERR				,						/* エラー有り				*/
	SX_CONTINUE			,						/* ループ続行				*/
	SX_EXIT				,						/* ループ終了				*/
	SX_FILENOTFOUND		,
	SX_ILLEGALFILE		,
	SX_OUTOFMEMORY		,
	SX_OUTOFMEMLST		,
	SX_BMPERROR			,
	SX_NOTEXTURE		,
	SX_CANTCREATE		
} SXERR;
typedef enum {
	SX_TEXFMT_ILLEAGAL	,
	SX_TEXFMT_RGB555	,
	SX_TEXFMT_RGB565	,
	SX_TEXFMT_RGB888	,
	SX_TEXFMT_ARGB1555	,
	SX_TEXFMT_ARGB4444	,
	SX_TEXFMT_ARGB8888	
} SXE_TEXFMT;
typedef enum {
	SX_SCREEN_FULL		,						/* フルスクリーンモード		*/
	SX_SCREEN_WINDOW							/* ウインドウモード			*/
} SXE_SCREEN_MODE;
typedef enum {
	SX_PRIM_POINT		,						/* ポイント					*/
	SX_PRIM_LINE		,						/* ライン					*/
	SX_PRIM_TRIANGLE	,						/* トライアングル			*/
	SX_PRIM_RECTANGLE	,						/* レクタングル				*/
	SX_PRIM_STRIP								/* ストリップ				*/
} SXE_PRIMITIVE;								/* プリミティブ定義			*/
typedef enum {
	SX_BREND_ON			,						/* ブレンド有効				*/
	SX_BREND_OFF		,						/* ブレンド無効				*/
	SX_BREND_ALPHA		,						/* αブレンドモード			*/
	SX_BREND_ADD								/* 加算モード				*/
} SXE_BRENDMODE;
typedef enum {
	SX_FILTER_OFF		,						/* フィルター無効			*/
	SX_FILTER_BILINEAR	,						/* バイリニアフィルター		*/
	SX_FILTER_TRILINEAR							/* トライリニアフィルター	*/
} SXE_FILTERMODE;
/*--------------------------------------------------------------------------*/
typedef struct {
	UCHAR		b;								/* Ｂ値(0-255)				*/
	UCHAR		g;								/* Ｇ値(0-255)				*/
	UCHAR		r;								/* Ｒ値(0-255)				*/
	UCHAR		a;								/* α値(0-255)				*/
} SX_ARGB;
typedef union {
	ULONG		color;							/* 32ビットカラー			*/
	SX_ARGB		argb;							/* ARGB8888					*/
} SX_COLOR;
typedef struct {
	FLOAT		x;								/* スクリーンＸ座標			*/
	FLOAT		y;								/* スクリーンＹ座標			*/
	FLOAT		z;								/* Ｚ値						*/
	FLOAT		u;								/* テクスチャＵ座標			*/
	FLOAT		v;								/* テクスチャＶ座標			*/
	SX_COLOR	c;								/* マテリアル				*/
} SX_VERTEX;
/*--------------------------------------------------------------------------*/
#define SX_BTN_TL		(1 << 17)				/* (0x00020000)	Ｑ			*/
#define SX_BTN_TR		(1 << 16)				/* (0x00010000)	Ｅ			*/
#define SX_DIR_R2		(1 << 15)				/* (0x00008000)	６			*/
#define SX_DIR_L2		(1 << 14)				/* (0x00004000)	４			*/
#define SX_DIR_D2		(1 << 13)				/* (0x00002000)	２			*/
#define SX_DIR_U2		(1 << 12)				/* (0x00001000)	８			*/
#define SX_BTN_TD		(1 << 11)				/* (0x00000800)	Ｗ			*/
#define SX_BTN_TX		(1 << 10)				/* (0x00000400)	Ａ			*/
#define SX_BTN_TY		(1 <<  9)				/* (0x00000200)	Ｓ			*/
#define SX_BTN_TZ		(1 <<  8)				/* (0x00000100)	Ｄ			*/
#define SX_DIR_R1		(1 <<  7)				/* (0x00000080)	→			*/
#define SX_DIR_L1		(1 <<  6)				/* (0x00000040)	←			*/
#define SX_DIR_D1		(1 <<  5)				/* (0x00000020)	↓			*/
#define SX_DIR_U1		(1 <<  4)				/* (0x00000010)	↑			*/
#define SX_BTN_ST		(1 <<  3)				/* (0x00000008)	SPACE		*/
#define SX_BTN_TA		(1 <<  2)				/* (0x00000004)	Ｚ			*/
#define SX_BTN_TB		(1 <<  1)				/* (0x00000002)	Ｘ			*/
#define SX_BTN_TC		(1 <<  0)				/* (0x00000001)	Ｃ			*/

#define SX_KEY_ON		(0)						/* どれか一つが押されている	*/
#define SX_KEY_OFF		(1)						/* どれか一つが離されている	*/
#define SX_KEY_PRESS	(2)						/* どれか一つが押された瞬間	*/
#define SX_KEY_ALLON	(3)						/* 全てのキーが押されている	*/
#define SX_KEY_ALLOFF	(4)						/* 全てのキーが離されている	*/
#define SX_KEY_ALLPRESS	(5)						/* 全てのキーが押された瞬間	*/

typedef enum {
	SX_NONE			,
	SX_JOYSTICK1	,
	SX_JOYSTICK2	,
	SX_JOYSTICK3	,
	SX_JOYSTICK4	
} SXE_INPUT;									/* 入力装置					*/

typedef struct {
	SXE_INPUT	input;							/* どの入力か				*/
	ULONG		on;								/* 押されているキー			*/
	ULONG		press;							/* 押された瞬間のキー		*/
	ULONG		back;							/* テンポラリ				*/
} SX_PERIPHERAL;
/*--------------------------------------------------------------------------*/

#define SX_MAX_MEMLST (999)
#define SX_MAX_VERTEX (999)

typedef struct {
	BOOL				isUsed;					/* 使用中か？				*/
	BOOL				isReal;					/* リアル使用中か？			*/
	NJS_TEXINFO			info;
	NJS_TEXNAME			name;
	NJS_TEXLIST			list;
} SX_TEXMEMLST;									/* テクスチャメモリリスト	*/

typedef struct {								/* DirectX用のワーク		*/
	SLONG				mem_num;				/* メモリリスト数			*/
	SX_TEXMEMLST		mem_lst[SX_MAX_MEMLST];	/* テクスチャメモリリスト	*/
	BOOL				isBrend;
	BOOL				isAlpha;
	SLONG				isGI;
	void				*texcache;				/* テクスチャキャッシュ		*/
	SX_PERIPHERAL		peri[SX_MAX_PERI];		/* ペリフェラル情報			*/
} SX_NINJAX;

extern SX_NINJAX *SDX;
/*--------------------------------------------------------------------------*/
/* SDXシステムAPI															*/
extern SXERR sxInit(void);
extern SXERR sxExit(void);
extern ULONG LzSH(UCHAR *src,UCHAR *dst);
extern void sxInitPeripheral(void);
extern void sxGetPeripheral(void);
extern BOOL sxKeyStatus(SLONG no, ULONG keys, ULONG flag);
extern BOOL sxCheckSoftReset(void);
extern void sxVibrate(ULONG md, ULONG dir, SLONG vol);
/*--------------------------------------------------------------------------*/
/* ユーティリティAPI														*/
extern void sxMemSetB(void *DST, UCHAR  SRC, SLONG num);
extern void sxMemSetW(void *DST, USHORT SRC, SLONG num);
extern void sxMemSetL(void *DST, ULONG  SRC, SLONG num);
extern void sxMemCpyB(void *DST, void *SRC, SLONG num);
extern void sxMemCpyW(void *DST, void *SRC, SLONG num);
extern void sxMemCpyL(void *DST, void *SRC, SLONG num);
extern SLONG sxBitCount(SLONG bits);
extern void sxMakeBits(ULONG *sft, ULONG *scl, ULONG mask);
extern void sxErrorBox(SCHAR *title);
/*--------------------------------------------------------------------------*/
/* ファイルAPI																*/
extern SXERR sxLoadBin(SCHAR *name,void *buf,ULONG size);
extern ULONG sxFileSize(SCHAR *name);
/*--------------------------------------------------------------------------*/
/* テクスチャAPI															*/
extern SXERR sxLoadTextureBMP(SCHAR *name, SX_TEXID *id, ULONG flag);
extern SXERR sxLoadTexturePVR(SCHAR *name, SX_TEXID *id, ULONG flag);
extern SXERR sxReleaseTexture(SX_TEXID id);
extern SXERR sxReleaseTextureAll(void);
extern SXERR sxSetColorKey(SX_TEXID id);
extern SXERR sxSetTexture(SX_TEXID id);
extern SXERR sxTextureCache(SX_TEXID id, ULONG flag);
extern SXERR sxTextureCache2(SX_TEXID id, ULONG flag);
/*--------------------------------------------------------------------------*/
/* 描画API																	*/
extern SXERR sxSetBackColor(FLOAT R,FLOAT G,FLOAT B);
extern SXERR sxDraw2D(ULONG prim, SX_VERTEX *vtx, SLONG num, ULONG flag);
extern SXERR sxDraw3D(ULONG prim, SX_VERTEX *vtx, SLONG num, ULONG flag);
extern SXERR sxSetBrendMode(ULONG flag);
extern SXERR sxSetFilterMode(ULONG flag);
/*--------------------------------------------------------------------------*/
#endif
