/***************************************************************/
//
//
//		DirectX	[mouse.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 07/08
/*---------------------------------------------------------------
■Update : 2016/07/08
			mouse.cppの作成

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/
#include "input.h"
#include "mouse.h"
#include "main.h"

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	定数定義
---------------------------------------------------------------*/
#define	NUM_KEY_MAX			( 8 )	// キーの最大数
#define	LIMIT_COUNT_REPEAT	( 5 )	// リピートカウントリミッター

/*---------------------------------------------------------------
	グローバル変数
---------------------------------------------------------------*/

LPDIRECTINPUTDEVICE8	g_pDevMouse = NULL;					// 入力デバイス(マウス)へのポインタ
//BYTE					g_dims[NUM_KEY_MAX];				// マウスの入力情報ワーク
BYTE					g_dimsTrigger[NUM_KEY_MAX];			// マウスのトリガー情報ワーク
BYTE					g_dimsRelease[NUM_KEY_MAX];			// マウスのリリース情報ワーク
BYTE					g_dimsRepeat[NUM_KEY_MAX];			// マウスのリピート情報ワーク
int						g_dimsRepeatCnt[NUM_KEY_MAX];		// マウスのリピートカウンタ

DIMOUSESTATE2			g_dims;								// マウスの初期化

// マウスの初期化
HRESULT InitMouse(HINSTANCE hInstance, HWND hWnd)
{
	// 入力処理の初期化
	if(FAILED(InitInput(hInstance, hWnd)))
	{
		MessageBox(hWnd, "DirectInputオブジェクトが作れねぇ！", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// デバイスの作成
	LPDIRECTINPUT8 g_pInput = GetInputDevice( );
	if(FAILED(g_pInput->CreateDevice(GUID_SysMouse, &g_pDevMouse, NULL)))
	{
		MessageBox(hWnd, "マウスがねぇ！", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// データフォーマットを設定
	if(FAILED(g_pDevMouse->SetDataFormat(&c_dfDIMouse2)))
	{
		MessageBox(hWnd, "マウスのデータフォーマットを設定できませんでした。", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// 協調モードを設定（フォアグラウンド＆非排他モード）
	if(FAILED(g_pDevMouse->SetCooperativeLevel(hWnd, (DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))))
	{
		MessageBox(hWnd, "マウスの協調モードを設定できませんでした。", "警告！", MB_ICONWARNING);
		return E_FAIL;
	}

	// マウスへのアクセス権を獲得(入力制御開始)
	if( FAILED( g_pDevMouse ->Poll() ) )
	{
		g_pDevMouse->Acquire();
	}

	return S_OK;
}

// マウスの終了処理
void UninitMouse(void)
{
	if(g_pDevMouse != NULL)
	{// 入力デバイス(マウス)の開放
		// マウスへのアクセス権を開放(入力制御終了)
		g_pDevMouse->Unacquire();

		g_pDevMouse->Release();
		g_pDevMouse = NULL;
	}

	// 入力処理の終了処理
	UninitInput();
}

// マウスの更新処理
void UpdateMouse(void)
{

	//BYTE aKeyState[NUM_KEY_MAX];

	DIMOUSESTATE2 dims;
	LPPOINT lpPoint = NULL;


	// デバイスからデータを取得
	//if(SUCCEEDED(g_pDevMouse->GetDeviceState(sizeof(aKeyState), aKeyState)))
	if(SUCCEEDED(g_pDevMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims )))
	{

		for(int nCnKey = 0; nCnKey < NUM_KEY_MAX; nCnKey++)
		{
			
			//キートリガーリリース情報の作成
			g_dimsTrigger[nCnKey]=(g_dims.rgbButtons[nCnKey] ^ dims.rgbButtons[nCnKey]) & dims.rgbButtons[nCnKey];

			g_dimsRelease[nCnKey]=(g_dims.rgbButtons[nCnKey] ^ dims.rgbButtons[nCnKey]) & g_dims.rgbButtons[nCnKey];

			//キーリピート情報の生成
			if( dims.rgbButtons[nCnKey] & 0x80 ){			//不具合起きた場合, if( dims.rgbButtons[nCnKey] & 0x80 )
				if(g_dimsRepeatCnt[nCnKey] < LIMIT_COUNT_REPEAT){
					g_dimsRepeatCnt[nCnKey]++;
					if( g_dimsRepeatCnt[nCnKey]==1){
					//if( g_dimsRepeatCnt[nCnKey]==1 || g_dimsRepeatCnt[nCnKey]>=LIMIT_COUNT_REPEAT ){

						g_dimsRepeat[nCnKey]=dims.rgbButtons[nCnKey];
					
					}
					else{
						
						g_dimsRepeat[nCnKey] = 0 ;

					}
				}
			}
			else{
			
				g_dimsRepeat[nCnKey]=0;
				g_dimsRepeatCnt[nCnKey]=0;

			}

			// キープレス情報を保存
			g_dims.rgbButtons[nCnKey] = dims.rgbButtons[nCnKey];

		}

		// キープレス情報を保存
		//g_dims = dims;

		HWND hWnd;
		POINT pos;

		// 現在のウィンドウ内のポジションであればどこでもよい
		pos.x = SCREEN_WIDTH;
		pos.y = SCREEN_HEIGHT;

		hWnd = WindowFromPoint( pos );

		// マウスの座標取得
		GetCursorPos( &pos );

		// スクリーン座標からクライアント座標へ
		ScreenToClient( hWnd, &pos );

		g_dims.lX = pos.x;
		g_dims.lY = pos.y;
		

	}
	else{
		// マウスへのアクセス権を取得
		g_pDevMouse->Acquire();
	}
}

// マウスのキー値の取得
DIMOUSESTATE2 GetMouse( void )
{
	return g_dims;
}

// マウスのプレス状態を取得
bool GetMousePress(int nKey)
{
	//return (g_dims[nKey] & 0x80) ? true: false;
	return (g_dims.rgbButtons[nKey] & 0x80) ? true: false;
}

// マウスのトリガー状態を取得
bool GetMouseTrigger(int nKey)
{
	return (g_dimsTrigger[nKey] & 0x80) ? true: false;
}

// マウスのリピート状態を取得
bool GetMouseRepeat(int nKey)
{
	return (g_dimsRepeat[nKey] & 0x80) ? true: false;
}

// マウスのリリ−ス状態を取得
bool GetMouseRelease(int nKey)
{
	return (g_dimsRelease[nKey] & 0x80) ? true: false;
}

// マウスの座標取得
LONG GetMouseX( void )
{
	return g_dims.lX;
}

// マウスの座標取得
LONG GetMouseY( void )
{
	return g_dims.lY;
}

// マウスの座標取得
LONG GetMouseZ( void )
{
	return g_dims.lZ;
}

