/*---------------------------------------------------------------------------

    NN utility library for sample

    Copyright (C) 2002 - 2004 SEGA Corporation Library R&D Dept.
    All Rights Reserved.

    Module  : NN utility library for sample
    File    : smputil.h
    Create  : 2004/06/14
    Modify  : 2004/09/17 ライトモーション対応
    Modify  : 2008/11/14 smpConfigureSystemDX 関数名を smpConfigureSystemDXG20 に変更。
	                     smpConfigureSystemDXG20 関数の引数なしに変更。
    Modify  : 2009/01/19 smpExitConfigureSystemDXG20 関数を追加。
	                     smpSetIncludePathDXG20 を追加。
						 smpIncludeCallbackDXG20 を追加。
    Modify  : 2009/01/21 smpOutputCompileShaderErrorDXG20 を追加。
    Modify  : 2009/05/13 ヘッダ整理
	                     smpClearVertexBufferInfoXB を smpClearVertexBufferInfoDXG20 に変更して頂点バッファのクリアが出来るよう修正した。
    Version : 1.17.04
    Note    : 

---------------------------------------------------------------------------*/
#ifndef __SMPUTIL_H__
#define __SMPUTIL_H__
#ifdef __cplusplus
extern "C" {
#endif

/* Port number */
#define	SMPPAD_PORT1		(1)			/* コントローラポート１ */
#define	SMPPAD_PORT2		(2)			/* コントローラポート２ */
#define	SMPPAD_PORT_MAX		(2)			/* 最大コントローラポート番号 */

/* Button */
#define	SMPPAD_BTN_A	((Uint32)1 << 0)	/* Ａボタン (PS2は×ボタン) */
#define	SMPPAD_BTN_B	((Uint32)1 << 1)	/* Ｂボタン (PS2は○ボタン) */
#define	SMPPAD_BTN_X	((Uint32)1 << 2)	/* Ｘボタン (PS2は□ボタン) */
#define	SMPPAD_BTN_Y	((Uint32)1 << 3)	/* Ｙボタン (PS2は△ボタン) */
#define	SMPPAD_BTN_U	((Uint32)1 << 4)	/* デジタル方向上ボタン */
#define	SMPPAD_BTN_D	((Uint32)1 << 5)	/* デジタル方向下ボタン */
#define	SMPPAD_BTN_L	((Uint32)1 << 6)	/* デジタル方向左ボタン */
#define	SMPPAD_BTN_R	((Uint32)1 << 7)	/* デジタル方向右ボタン */
#define	SMPPAD_BTN_ST	((Uint32)1 << 8)	/* スタートボタン */
#define	SMPPAD_BTN_TL	((Uint32)1 << 9)	/* Lトリガー（PS2はL1）（デジタル）*/
#define	SMPPAD_BTN_TR	((Uint32)1 << 10)	/* Rトリガー（PS2はR1）（デジタル）*/
#define	SMPPAD_BTN_MAX	(11)				/* ボタン数 */

#define SMPPAD_ANALOG_VALUE_MAX	(100)	/* アナログ値の最大値 */

/* Pad data  */
typedef struct {
	Uint32 On;			/* 現在押されているボタンのビットが立っている        */
	Uint32 Off;			/* 現在押されていないボタンのビットが立っている      */
	Uint32 Press;		/* このフレームで押されたボタンのビットが立っている  */
	Uint32 Release;		/* このフレームで放されたボタンのビットが立っている  */
	Sint16 X1;			/* アナログスティック１ Ｘ値 ( -100(左)〜 +100(右) ) */
	Sint16 Y1;			/* アナログスティック１ Ｙ値 ( -100(下)〜 +100(上) ) */
	Sint16 X2;			/* アナログスティック２ Ｘ値 ( -100(左)〜 +100(右) ) */
	Sint16 Y2;			/* アナログスティック２ Ｙ値 ( -100(下)〜 +100(上) ) */
} SMPPAD_STATUS;

typedef struct {
	Uint32 bit;
	Uint8 data;
} SMP_KEYEMUDATA;

/*-------------------------------------------------------------------------*/
#define UXDI_KEYDOWN(key) (diks[key] & 0x80)
#define KEYDOWN(key)      UXDI_KEYDOWN(key)
static DWORD ConvertKeyDataToPD(SMPPAD_STATUS* p);
/*-------------------------------------------------------------------------*/
typedef enum{
	SMPE_OK = 0,
	SMPE_ERR_FILEOPEN = -2,
	SMPE_ERR_ID = -3,
	SMPE_ERR_OTHER_PARAM = -4,
	SMPE_ERR_NULL_POINTER = -5
} SMPE_RESULT;

/* Prototypes */

/* サンプルライブラリの初期化 */
void smpConfigureSystemDXG20( void );

/* サンプルライブラリの終了 */
void smpExitConfigureSystemDXG20( void );

/* サンプルパッドライブラリ初期化 */
void smpPadInit( void );

/* コントローラデータ更新 */
void smpPadCheck( void );

/* コントローラデータ取得 */
SMPPAD_STATUS *smpPadGet( Uint32 port );

/* メモリアロケーション */
void *smpMemAlloc( Uint32 size );

/* メモリ解放 */
void smpMemFree( void *ptr );

/* メモリコピー */
void smpMemCopy( void *dst, const void *src, Uint32 size );

/* メモリセット */
void smpMemSet( void *dst, Uint8 src, Uint32 size );

/* サンプルタイマライブラリ初期化 */
void smpTmrInit( void );

/* タイマ取得 */
Uint32 smpTmrGet( void );

/* タイマ差分計算 */
Uint32 smpTmrDiff( Uint32 time1, Uint32 time0 );

/* ファイルサイズ取得 */
Uint32 smpGetFileSize( char *sFile );

/* ファイル読み込み */
void smpReadFile( char *sFile, void *pBuf );

/* バイナリファイルロードパス設定 */
void smpBinSetFilePath( const char *sPath );

/* ファイルサイズ取得 */
Uint32 smpBinGetFileSize( char *sFile );

/* ファイル読み込み */
void smpBinReadFile( char *sFile, void *pBuf );

/* バイナリデータアドレス解決 */
void smpBinResolvePointer( NNS_BINCNK_DATAHEADER *pData, NNS_BINCNK_NOF0HEADER *pNOF0 );

/* オブジェクト、テクスチャデータアドレス取得 */
void smpBinSetUpObject( NNS_OBJECT **pObj, NNS_TEXFILELIST **pTexFileList, void *pBuf );

/* ノードモーションデータアドレス取得 */
void smpBinSetUpMotion( NNS_MOTION **pMotion, void *pBuf );

/* モーフモーションデータアドレス取得 */
void smpBinSetUpMorphMotion( NNS_MOTION **pMotion, void *pBuf );

/* モーフターゲットリストアドレス取得 */
void smpBinSetUpMorphTargetList( NNS_MORPHTARGETLIST **MorphTargetList, void *pBuf );

/* ノードネームリストアドレス取得 */
void smpBinSetUpNodeNameList( NNS_NODENAMELIST **NodeNameList, void *pBuf );

/* ライトポインタアドレス取得 */
void smpBinSetUpLightPtr( NNS_LIGHTPTR **LightPtr, void *pBuf );

/* カメラポインタアドレス取得 */
void smpBinSetUpCameraPtr( NNS_CAMERAPTR **CameraPtr, void *pBuf );

/* カメラポインタアドレス、カメラモーションアドレス取得 */
void smpBinSetUpCameraMotion( NNS_CAMERAPTR **CameraPtr, NNS_MOTION **pMotion, void *pBuf );

/* マテリアルモーションアドレスの取得 */
void smpBinSetUpMaterialMotion( NNS_MOTION **pMotion, void *pBuf );

/* ノードツリーオブジェクトアドレスの取得 */
void smpBinSetUpNodeTreeObject( NNS_OBJECT **pObj, void *pBuf );

/* メッシュセットオブジェクトアドレスの取得 */
void smpBinSetUpMeshObject( NNS_OBJECT **pObj, void *pBuf );

/* ライトポインタ、ライトモーションアドレスの取得 */
void smpBinSetUpLightMotion( NNS_LIGHTPTR **pLightPtr, NNS_MOTION **pMotion, void *pBuf );

/* チャンクデータをコピーし、オブジェクト、テクスチャデータアドレス取得 */
void smpBinSetUpObjectCopy( NNS_OBJECT **pObj, NNS_TEXFILELIST **pTexFileList, void *pBufDst, void *pBufSrc);

/* チャンクデータをコピーし、ノードモーションデータアドレス取得 */
void smpBinSetUpMotionCopy( NNS_MOTION **pMotion, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、モーフモーションデータアドレス取得 */
void smpBinSetUpMorphMotionCopy( NNS_MOTION **pMotion, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、モーフターゲットリストアドレス取得 */
void smpBinSetUpMorphTargetListCopy( NNS_MORPHTARGETLIST **MorphTargetList, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、ノードネームリストアドレス取得 */
void smpBinSetUpNodeNameListCopy( NNS_NODENAMELIST **pNodeNameList, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、ライトポインタアドレス取得 */
void smpBinSetUpLightPtrCopy( NNS_LIGHTPTR **LightPtr, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、カメラポインタアドレス取得 */
void smpBinSetUpCameraPtrCopy( NNS_CAMERAPTR **CameraPtr, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、カメラポインタアドレス、カメラモーションアドレス取得 */
void smpBinSetUpCameraMotionCopy( NNS_CAMERAPTR **CameraPtr, NNS_MOTION **pMotion, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、マテリアルモーションデータアドレス取得 */
void smpBinSetUpMaterialMotionCopy( NNS_MOTION **pMotion, void *pBufDst, void *pBufSrc );

/* チャンクデータをコピーし、ノードツリーオブジェクトアドレスの取得 */
void smpBinSetUpNodeTreeObjectCopy( NNS_OBJECT **pObj, void *pBufDst, void *pBufSrc);

/* チャンクデータをコピーし、メッシュセットオブジェクトアドレスの取得 */
void smpBinSetUpMeshObjectCopy( NNS_OBJECT **pObj, void *pBufDst, void *pBufSrc);

/* チャンクデータをコピーし、ライトポインタアドレス、ライトモーションアドレス取得 */
void smpBinSetUpLightMotion( NNS_LIGHTPTR **pLightPtr, NNS_MOTION **pMotion, void *pBuf );

/* データサイズ取得 */
Uint32 smpBinGetBinaryDataSize( void *pBuf );

/* テクスチャファイルパスの設定 */
void smpTexSetFilePath( const char *sPath );

/* テクスチャファイル1枚ロード */
Sint32 smpTexLoadFileOne( NNS_TEXINFO *pTexInfo, NNS_TEXFILE *pTexFile );

/* テクスチャファイルリストロード */
Sint32 smpTexLoadFile( NNS_TEXLIST *pTexList, NNS_TEXFILELIST *pFileList );

/* テクスチャリリース */
Sint32 smpTexRelease( NNS_TEXLIST *pTexList );

/* 頂点バッファのクリア */
void smpClearVertexBufferInfoDXG20( NNS_OBJECT *pObj );

/* シェーダコンパイル＆ロード */
Sint32 smpPreBuildStdShader( const char *vertexshader,  Uint32 vtxshadersize,
							 const char *fragmentshader, Uint32 fragshadersize,
							 const char *compiledshaderpath,
							 NNE_BOOL recompile );

/* パスの設定 */
Sint32 smpSetIncludePathDXG20(const char *pPath);
/* #include 擬似命令用のコールバック関数 */
long smpIncludeCallbackDXG20( unsigned int mode, unsigned int argc, const void *argv[]);

/* シェーダコンパイルエラーをファイル出力 */
void smpOutputCompileShaderErrorDXG20(Uint32 shaderProfile, const void *buf, Uint32 bufSize);

#ifdef __cplusplus
}
#endif
#endif /* __SMPUTIL_H__ */

/* End of file */
