/***************************************************************/
//
//
//		DirectX	[ light.cpp ]
//
//											Author	kazuki tanaka
//											Date	2017 1/25
/*---------------------------------------------------------------
■Update : 2017/1/25
			light.cppの作成

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/

//#include <Windows.h>
//#include <stdio.h>
//#include <d3dx9.h>

#include "light.h"

//#pragma comment (lib,"d3d9.lib")
//#pragma comment (lib,"d3dx9.lib")
//#pragma comment (lib,"dxguid.lib")

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/

/*----------------------------------------------------------------
	スタティックメンバ変数の初期化
----------------------------------------------------------------*/

CLight* CLight::light[ LIGHT_MAX ] = {};
LPDIRECT3DDEVICE9 CLight::pDevice = nullptr;


// LIGHTの初期化
CLight::CLight( )
{

	// メンバ変数の初期化
	//ZeroMemory( &name, sizeof( char*MAX_LIGHTNAME ) );

	// 初期化
	for( int index = 0; index < LIGHT_MAX; index++ ){
		
		if( light[ index ] == NULL ){
			
			light[ index ] = this;
			lightIndex     = index;
			break;
		}
	}

}

// LIGHTの初期化
CLight::~CLight( )
{
	
	// 処理なし
	
}

// LIGHTの作成
CLight* CLight::Create( const char* LIGHT_NAME )
{


	// デバイスの取得
	if( !pDevice ){
	
		pDevice = GetDevice( );
	}
	
	// オブジェクトの作成
	CLight* pObject;
	pObject = new CLight;
	
	// ライトに名前設定
	strcpy( pObject->name, LIGHT_NAME );
	D3DLIGHT9 setLight;
	
	// ライトの初期化
	ZeroMemory( &setLight, sizeof( D3DLIGHT9 ) );

	{ // ディレクショナルライトの作成

		setLight.Type    = D3DLIGHT_DIRECTIONAL;
		setLight.Diffuse = D3DXCOLOR( 0.6f, 0.4f, 0.4f, 1.0f );
		setLight.Ambient = D3DXCOLOR( 0.6f, 0.4f, 0.4f, 1.0f );
		D3DXVECTOR3 vecDir( 1.0f, -1.0f, 1.0f );
	
		// 変換ベクトルの単位行列化
		D3DXVec3Normalize( (D3DXVECTOR3*)&setLight.Direction, &vecDir );
	
		// デバイスへのライトの設定
		pDevice ->SetLight( 
			pObject->lightIndex,				// ライトインデックス( 作成したライトの番号 )
			&setLight );

		// ライト使用するかどうか
		pDevice ->LightEnable( pObject->lightIndex, true );

		// ライティングを行うかどうか
		pDevice ->SetRenderState( D3DRS_LIGHTING, true );


	} // LIGHT SET -> END

	return pObject;


}

// LIGHTの作成
CLight* CLight::Create( const char* LIGHT_NAME, const D3DLIGHTTYPE  lightType, const D3DCOLORVALUE Diffuse, const D3DCOLORVALUE Specular, const D3DCOLORVALUE Ambient, const D3DVECTOR Position, const D3DVECTOR Direction, const float Range, const float Falloff, const float Attenuation0, const float Attenuation1, const float Attenuation2, const float Theta, const float Phi )
{

	// デバイスの取得
	if( !pDevice ){
	
		pDevice = GetDevice( );
	}
	
	// オブジェクトの作成
	CLight* pObject;
	pObject = new CLight;
	
	// ライトに名前設定
	strcpy( pObject->name, LIGHT_NAME );
	D3DLIGHT9 setLight;
	
	// ライトの初期化
	ZeroMemory( &setLight, sizeof( D3DLIGHT9 ) );

	{ // ライトの作成

		setLight.Type     = lightType;
		setLight.Diffuse  = Diffuse;
		setLight.Specular = Specular;
		setLight.Ambient  = Ambient;
		setLight.Position = Position;
		setLight.Direction= Direction;
		setLight.Range    = Range;
		setLight.Falloff  = Falloff;
		setLight.Attenuation0 = Attenuation0;
		setLight.Attenuation1 = Attenuation1;
		setLight.Attenuation2 = Attenuation2;
		setLight.Theta    = Theta;
		setLight.Phi      = Phi;

	
		// 変換ベクトルの単位行列化
		D3DXVec3Normalize( (D3DXVECTOR3*)&setLight.Direction, (D3DXVECTOR3*)&setLight.Direction );
	
		// デバイスへのライトの設定
		pDevice ->SetLight( 
			pObject->lightIndex,				// ライトインデックス( 作成したライトの番号 )
			&setLight );

		// ライト使用するかどうか
		pDevice ->LightEnable( pObject->lightIndex, true );

		// ライティングを行うかどうか
		pDevice ->SetRenderState( D3DRS_LIGHTING, true );


	} // LIGHT SET -> END

	return pObject;


}

// メモリ解放
void CLight::ReleaseAll( void )
{

	for( int index = 0; index < LIGHT_MAX; index++ ){

		if( light[ index ] ){
		
			SAFE_DELETE( light[index] )
		}
	}
}

// ライティング設定ON
inline void CLight::LightOn( const D3DRENDERSTATETYPE type )
{

	pDevice ->SetRenderState( type, true );

}

// ライティング設定OFF
inline void CLight::LightOff( const D3DRENDERSTATETYPE type )
{

	pDevice ->SetRenderState( type, false );

}

// 設定したライト取得
CLight* CLight::GetLight( const char* LIGHT_NAME )
{

	// モデルデータを取得してバインド
	for( int index = 0; index < LIGHT_MAX; index++ ){
		
		if( strcmp( light[index]->name, LIGHT_NAME ) == 0 ){
			
			return light[index];
		}
	}
	return 0;
}

// 設定したライト取得
CLight* CLight::GetLight( const int index )
{

	return light[index];

}

// 光源を設定
void CLight::SetLight( const D3DLIGHTTYPE  lightType, const D3DCOLORVALUE Diffuse, const D3DCOLORVALUE Specular, const D3DCOLORVALUE Ambient, const D3DVECTOR Position, const D3DVECTOR Direction, const float Range, const float Falloff, const float Attenuation0, const float Attenuation1, const float Attenuation2, const float Theta, const float Phi )
{

	D3DLIGHT9 setLight;
	
	// ライトの初期化
	//ZeroMemory( &setLight, sizeof( D3DLIGHT9 ) );

	// ライトの作成
	setLight.Type     = lightType;
	setLight.Diffuse  = Diffuse;
	setLight.Specular = Specular;
	setLight.Ambient  = Ambient;
	setLight.Position = Position;
	setLight.Direction= Direction;
	setLight.Range    = Range;
	setLight.Falloff  = Falloff;
	setLight.Attenuation0 = Attenuation0;
	setLight.Attenuation1 = Attenuation1;
	setLight.Attenuation2 = Attenuation2;
	setLight.Theta    = Theta;
	setLight.Phi      = Phi;

	
	// 変換ベクトルの単位行列化
	D3DXVec3Normalize( (D3DXVECTOR3*)&setLight.Direction, (D3DXVECTOR3*)&setLight.Direction );
	
	// デバイスへのライトの設定
	pDevice ->SetLight( 
		lightIndex,				// ライトインデックス( 作成したライトの番号 )
		&setLight );


}



