//******************************************************************************
//
// MIDITrail / MTFirstPersonCam
//
// 一人称カメラクラス
//
// Copyright (C) 2010-2019 WADA Masashi. All Rights Reserved.
//
//******************************************************************************

// MEMO:
// FPSゲームライクな視点移動を実現する。
// 本クラス内でキーボード／マウスの状態を取得する。

#import <GameController/GameController.h>
#import "OGLUtil.h"
#import "DIKeyCtrl.h"
#import "SMIDILib.h"
#import "MTNoteDesign.h"
#import "MTMachTime.h"
#import "MTTouchCtrl.h"
#import "MTScene.h"


//******************************************************************************
// パラメータ定義
//******************************************************************************
//カメラ位置最大範囲
#define MTFIRSTPERSONCAM_CAMVECTOR_LIMIT  (1000000.0f)

//******************************************************************************
// 一人称カメラクラス
//******************************************************************************
class MTFirstPersonCam
{
public:
	
	enum MTProgressDirection {
		DirX,
		DirY,
		DirZ
	};
	
public:
	
	//コンストラクタ／デストラクタ
	MTFirstPersonCam(void);
	virtual ~MTFirstPersonCam(void);
	
	//クリア
	int Clear();
	
	//初期化
	int Initialize(UIView* pView, NSString* pSceneName, SMSeqData* pSeqData);
	
	//カメラ位置設定
	void SetPosition(
			OGLVECTOR3 camVector
		);
	
	//カメラ方向設定
	//  方位角：XZ平面上のX軸との角度 +X軸方向=0度 +Z軸方向=90度
	//  天頂角：Y軸との角度           +Y軸方向=0度 XZ平面上=90度
	void SetDirection(
			float phi,		//方位角
			float theta		//天頂角
		);
	
	//カメラ位置取得
	void GetPosition(OGLVECTOR3* pCamVector);
	void GetPositionRightEye(OGLVECTOR3* pCamVector);
	
	//カメラ方向取得
	void GetDirection(
			float* pPhi,
			float* pTheta
		);
	
	//マウス視線移動モード登録
	void SetMouseCamMode(bool isEnable);
	
	//自動回転モード登録
	void SetAutoRollMode(bool isEnable);
	void SwitchAutoRllDirecton();
	
	//更新
	int Transform(OGLDevice* pOGLDevice, bool isActive);
	int TransformLeftEye(OGLDevice* pOGLDevice, bool isActive);
	int TransformRightEye(OGLDevice* pOGLDevice, bool isActive);
	
	//演奏チックタイム登録
	void SetCurTickTime(unsigned int curTickTime);
	
	//リセット
	void Reset();
	
	//回転角度取得
	float GetManualRollAngle();
	float GetAutoRollVelocity();
	
	//回転角度設定
	void SetManualRollAngle(float rollAngle);
	void SetAutoRollVelocity(float rollVelocity);
	
	//進行方向設定
	void SetProgressDirection(MTProgressDirection dir);
	
	//マウスホイールイベント受信
	void OnScrollWheel(
			float deltaWheelX,	//ホイール左右傾斜
			float deltaWheelY,	//ホイール回転
			float deltaWheelZ	//？
		);
	
	//タッチイベント制御登録
	void SetTouchCtrl(MTTouchCtrl* pTouchCtrl);
	
	//スクリーン種別設定
	void SetScreenType(MTScene::ScreenType type);
	
	//デバイス方向設定
	void SetDeviceDirection(OGLQuaternion quaternion);
	
	//ゲームコントローラー設定
	void SetGameController(const GCController* pController);
	
private:
	
	//カメラ制御系
	OGLCamera m_Camera;
	OGLVECTOR3 m_CamVector;
	OGLVECTOR3 m_CamVectorRightEye;
	OGLVECTOR3 m_CamUpVector;
	float m_CamDirPhi;
	float m_CamDirTheta;
	float m_VRViewEyeSeparation;
	MTProgressDirection m_ProgressDirection;
	MTNoteDesign m_NoteDesign;
	
	//ユーザ操作制御系
	DIKeyCtrl m_DIKeyCtrl;
	bool m_IsMouseCamMode;
	bool m_IsAutoRollMode;
	UIView* m_pView;
	MTTouchCtrl* m_pTouchCtrl;
	MTScene::ScreenType m_ScreenType;
	float m_DevDirPhiOffset;
	const GCController* m_pGameController;
	
	//移動速度
	float m_VelocityFB;		//前後移動量 m/sec.
	float m_VelocityLR;		//左右移動量 m/sec.
	float m_VelocityUD;		//上下移動量 m/sec.
	float m_VelocityPT;		//視線移動量 degrees/sec.
	float m_AcceleRate;		//加速倍率
	
	//回転制御系
	float m_RollAngle;
	float m_VelocityAutoRoll;
	float m_VelocityManualRoll;
	
	//時間制御系
	uint64_t m_PrevTime;
	uint64_t m_DeltaTime;
	unsigned int m_PrevTickTime;
	unsigned int m_CurTickTime;
	MTMachTime m_MachTime;
	
	int _TransformEyeDirection(float dX, float dY);
	int _TransformCamPosition();
	int _TransformRolling(float dW);
	int _SetCamPosition(OGLVECTOR3 camVector, float camDirPhi, float camDirTheta, OGLVECTOR3 camUpVector);
	void _CalcDeltaTime();
	int _LoadConfFile(NSString* pSceneName);
	void _ClipCamVector(OGLVECTOR3* pVector);
	
};


