#include "BasicStaticData.h"

using namespace std;

namespace HPL {
using namespace DirectX;

namespace E3D {
using namespace BasicStaticDataConsts;

int BasicStaticData::get_CameraMode() {
	return this->m_nCameraMode;
}

/** カメラモード変更
  *
  */
VOID BasicStaticData::set_CameraMode( int nCameraMode,
									 int nPlayerSigID)
{
	if( this->m_nCameraMode == nCameraMode ) {
		return ;
	}
	int ret = 0;

	if( nPlayerSigID >= 0 ) {
		D3DXVECTOR3 vPlayerDirection;
		E3DGetCharaDir( nPlayerSigID, 0,0, &vPlayerDirection );
		// プレイヤー番号がある
		// 存在しないうちは処理しない

		// プレイヤーの位置
		D3DXVECTOR3 vPlayerPosition;
		ret = E3DGetPos( nPlayerSigID, &vPlayerPosition );

		// AtTargetカメラの位置
		D3DXVECTOR3 vAtTargetCameraPosition;
		this->m_cameraAtTarget->get_SatellitePosition(
			vPlayerPosition, &vAtTargetCameraPosition );

		// 差分
		D3DXVECTOR3 vDiff = vPlayerPosition - vAtTargetCameraPosition;
		// 正規化
		D3DXVec3Normalize( &vDiff, &vDiff );

		if( nCameraMode == CameraMode::SNIPER_MODE  &&
			this->get_CameraMode() != CameraMode::SNIPER_MODE)
		{
			// すないぽんに変わった

			// カメラ（サテライト側）の初期方向をAT_TARGETカメラ→プレイヤーの方向にする
			this->m_cameraSniper->set_NormalizedQuatanionDirection( vDiff );

		} else if(nCameraMode == CameraMode::SHOT_BEHIND_MODE  &&
			this->get_CameraMode() != CameraMode::SHOT_BEHIND_MODE )
		{
			// TPS射撃モードに変わった

			// サテライト＝照準の初期位置をAtTargetカメラ→プレイヤーの方向にする
			this->m_cameraShotBehind->set_NormalizedQuatanionDirection( vDiff );



		}
	 }

	// カメラモード変更
	this->m_nCameraMode = nCameraMode;

}


DirectX::DCameraManager* BasicStaticData::get_Camera() {
	if( this->get_CameraMode() == CameraMode::SHOT_BEHIND_MODE ) {
		return this->m_cameraShotBehind;
	} else if( this->get_CameraMode() == CameraMode::SNIPER_MODE ) {
		return this->m_cameraSniper;
	}
	return this->m_cameraAtTarget;
}


/** サテライトカメラ位置、方向を設定
  * @param[in]	nPlayerSigID	プレイヤーのSIGID
  * @param[in]	vPlayerPosition	プレイヤーの座標
  * @retval		0				異常なし
  *	@retval		1				異常あり
  */
int BasicStaticData::updateCameraPosition( int nPlayerSigID, D3DXVECTOR3& vPlayerPosition, float fHeight) {

	int ret = 0;

	// 微調整（目の高さ）
	D3DXVECTOR3 vEyeHeightVector(0, fHeight,0);

	// サテライトの位置
	// AtTarget		：サテライト→プレイヤー（＋⊿目線の高さ）
	// ShotBehind	：サテライト→プレイヤーの方向＋⊿（マウス移動でプレイヤーの位置も移動する必要がある）
	// Sniper		：プレイヤー→サテライト
	if( this->get_CameraMode() == CameraMode::AT_TARGET_MODE) {
		D3DXVECTOR3 vCameraPosition;

		// サテライトの位置を取得
		this->get_Camera()->get_SatellitePosition( vPlayerPosition + vEyeHeightVector, &vCameraPosition );

		//vCameraPosition += vEyeHeightVector;

		// カメラ位置設定
		E3DSetCameraPos( vCameraPosition );

	}else if(this->get_CameraMode() == CameraMode::SHOT_BEHIND_MODE) {

		/*
		// 専用の座標取得
		D3DXVECTOR3 vCameraPosition;
		ret = get_ShotBehindCameraPosition( nPlayerSigID, &vCameraPosition );
		*/

		D3DXVECTOR3 vPlayerDirection;
		E3DGetCharaDir( nPlayerSigID, 0,0,&vPlayerDirection );

		// 常にプレイヤーの肩より少し後ろ側の位置にカメラを置く
		D3DXVECTOR3 vCameraPosition = vPlayerDirection * -1;


		// Y軸中心に（左回転）N度
		D3DXMATRIX matrixY;
		D3DXMatrixRotationY( &matrixY, D3DXToRadian( - 25 ) );

		// 行列変換
		D3DXVec3TransformCoord( &vCameraPosition, &vCameraPosition, &(matrixY) );

		// 距離
		D3DXVec3Scale( &vCameraPosition, &vCameraPosition, CAMERA_SHOT_BEHIND_MODE_CAMERA_DISTANCE );

		// 上に少しずらす
		D3DXVec3Add( &vCameraPosition, &vCameraPosition, &D3DXVECTOR3(0,CAMERA_SHOT_BEHIND_DELTA_HEIGHT,0 ) );

		// カメラ位置設定
		E3DSetCameraPos( vCameraPosition + vPlayerPosition + vEyeHeightVector);

	} else if(this->get_CameraMode() == CameraMode::SNIPER_MODE ) {
		// コア			＝プレイヤーの目の位置
		// サテライト	＝照準

		// カメラ位置設定
		E3DSetCameraPos( vPlayerPosition + vEyeHeightVector);
	}

	return 0;
}

/**
  *
  * @param[in]	lQuatanionHorizontal	クォータニオン的横回転
  * @param[in]	fQuatanionVertical	クォータニオン的縦回転
  */
int BasicStaticData::moveCameraPosition(
	long lQuatanionHorizontal,
	long lQuatanionVertical,
	float *fRateHorizontal,
	float *fRateVertical)
{
	*fRateHorizontal = MOUSE_LOOK_AT_TARGET_MODE_DEGREE_HORIZONTAL;
	*fRateVertical = MOUSE_LOOK_AT_TARGET_MODE_DEGREE_VERTICAL;

	if( this->get_CameraMode() == CameraMode::SHOT_BEHIND_MODE ) {
		*fRateHorizontal = MOUSE_LOOK_SHOT_BEHIND_MODE_DEGREE_HORIZONTAL;
		*fRateVertical = - MOUSE_LOOK_SHOT_BEHIND_MODE_DEGREE_VERTICAL;

	} else if( this->get_CameraMode() == CameraMode::SNIPER_MODE ) {

		*fRateHorizontal = MOUSE_LOOK_SNIPER_MODE_DEGREE_HORIZONTAL;
		*fRateVertical = -MOUSE_LOOK_SNIPER_MODE_DEGREE_VERTICAL;
	}

	// 緯度方向回転（左右回転）
	if( lQuatanionHorizontal != 0 ){

		float fRotateY = (*fRateHorizontal) * lQuatanionHorizontal;

		this->get_Camera()->rotateHorizontalDegree( fRotateY );

		//E3DRotateQY(this->get_Camera()->m_nQuatanionID, fRotateY );
	}

	// 経度方向回転（仰角）
	if( lQuatanionVertical != 0 ){

		float fRotateXZ = (*fRateVertical) * lQuatanionVertical;

		this->get_Camera()->rotateVerticalDegree( fRotateXZ );

		//E3DRotateQLocalX(this->get_Camera()->m_nQuatanionID, fRotateXZ );
	}
	return 0;
}

/** カメラターゲット設定（E3Dのあれまで実施する）
  * @param[in]	
  */
int BasicStaticData::set_CameraLookAt(
	int nPlayerSigID, int nPlayerQuatanionID , float fHeight)
{
	D3DXVECTOR3 vDiff;

	/*float fHeight = PLAYER_EYE_HEIGHT_FROM_CENTER;
	if( bLow ) {
		fHeight = PLAYER_EYE_HEIGHT_FROM_CENTER_LOW;
	}*/
	D3DXVECTOR3 vEyeHeightVector(0, fHeight,0);
	D3DXVECTOR3 vCameraPosition;

	int ret = 0;
	ret = E3DGetCameraPos( &vCameraPosition );
	if( ret ) {
		_ASSERT( 0 );
		return ret;
	}

	// プレイヤーの位置
	D3DXVECTOR3 vPlayerPosition;
	ret = E3DGetPos( nPlayerSigID, &vPlayerPosition );
	if( ret ) {
		_ASSERT( 0 );
		return ret;
	}

	// 上フラグ
	int nUpFlag = CameraUpFlag::ALWAYS_Y_AXIS;


	if( this->get_CameraMode() == CameraMode::AT_TARGET_MODE ) {
		// 方向＝プレイヤーへの方向
		vDiff = (vPlayerPosition + vEyeHeightVector) - vCameraPosition;

	} else if( this->get_CameraMode() == CameraMode::SHOT_BEHIND_MODE ) {
		// コア				＝プレイヤーの目の位置
		// サブサテライト	＝照準
		// メインサテライト	＝カメラ位置

		// よって、LookAtはサブサテライト

		// 目標＝サテライトの位置
		D3DXVECTOR3 vSatellitePosition =
			( this->get_Camera()->get_NormalizedQuatanionDirection() * this->get_Camera()->get_Distance() ) +
			(vPlayerPosition + vEyeHeightVector);


		vDiff = vSatellitePosition - vCameraPosition;
		D3DXVec3Normalize( &vDiff, &vDiff );

		// プレイヤーキャラクターもそっちを向かせる
		D3DXVECTOR3 vPlayerNewDirection = -vDiff;
		vPlayerNewDirection.y = 0;
		this->face( vPlayerNewDirection, 1, nPlayerSigID, nPlayerQuatanionID );

	} else if( this->get_CameraMode() == CameraMode::SNIPER_MODE ) {

		// 目標＝サテライトの位置
		//D3DXVECTOR3 vSatellitePosition =
		//	( this->get_Camera()->get_NormalizedQuatanionDirection() * this->get_Camera()->get_Distance() );
		//+			vPlayerPosition + vEyeHeightVector;

		vDiff = this->get_Camera()->get_NormalizedQuatanionDirection();// - (vPlayerPosition + vEyeHeightVector);
		D3DXVECTOR3 vPlayerNewDirection = -vDiff;
		vPlayerNewDirection.y = 0;
		
		// プレイヤーキャラクターもそっちを向かせる
		this->face( vPlayerNewDirection, 1, nPlayerSigID, nPlayerQuatanionID );
	}

	ret = E3DCameraLookAt( vDiff, 0, CAMERA_ROTATE_DIV);// );
	if( ret ) {
		_ASSERT( 0 );
		return ret;
	}

	return 0;
}



} // E3D
} // HPL	
