//=========================================================================
//	モデルクラス [ sceneModel.cpp ]
//	作成者：2017/04/26
//	作成日：小暮大樹
//=========================================================================
//=========================================================================
//	インクルードファイル
//=========================================================================
#include	"manager.h"
#include	"renderer.h"
#include	"k_hotate.h"
#include	"camera.h"

//=========================================================================
//	定数定義
//=========================================================================
#define	TEXTURE_PATH	("data/TEXTURE/")	//テクスチャパス

#define MODEL_NAME		( "data/MODEL/hotate.x" )

//=========================================================================
//	コンストラクタ
//=========================================================================
KHotate::KHotate()
{
	m_pTextures = NULL;
	m_pMat = NULL;
	m_pMatBuffer = NULL;
	m_pMesh = NULL;
	m_nNumMat = 0;

	SetPosition( D3DXVECTOR3( 0.0f , 50.0f , 0.0f ) );
	SetScale( D3DXVECTOR3( 1.0f , 1.0f , 1.0f ) );
	SetRotate( D3DXVECTOR3( D3DXToRadian( 30.0f ) , D3DXToRadian( 180.0f ) , D3DXToRadian( 20.0f ) ) );

}

//=========================================================================
//	初期化処理
//=========================================================================
void	KHotate::Init(void)
{
	m_pTextures = NULL;
	m_pMat = NULL;
	m_pMatBuffer = NULL;
	m_pMesh = NULL;
	m_nNumMat = 0;

	SetPosition( D3DXVECTOR3( 0.0f , 0.0f , 0.0f ) );
	SetScale( D3DXVECTOR3( 1.0f , 1.0f , 1.0f ) );
	SetRotate( D3DXVECTOR3( 0.0f , 0.0f , 0.0f ) );

	LoadModel( MODEL_NAME );
}

//=========================================================================
//	終了処理
//=========================================================================
void	KHotate::Uninit(void)
{
	for( int i = 0 ; i < (int) m_nNumMat ; i++ )
	{
		if( m_pTextures[i] != NULL )
		{
			m_pTextures[i]->Release();
			m_pTextures[i] = NULL;
		}
	}

	if( m_pTextures != NULL )
	{
		delete[] m_pTextures;
		m_pTextures = NULL;
	}
	//リリース
	if(m_pMesh != NULL)
	{
		m_pMesh->Release();	
		m_pMesh = NULL;		
	}

	//リリース
	if(m_pMatBuffer != NULL)
	{
		m_pMatBuffer->Release();	
		m_pMatBuffer = NULL;	
	}
}

//=========================================================================
// 更新処理
//=========================================================================
void	KHotate::Update(void)
{
	
}

//=========================================================================
//描画処理
//=========================================================================
void	KHotate::Draw(void)
{
	//モデルが読み込まれていなかったら何もしない
	if( m_pMesh == NULL )
	{
		UINT nID = MessageBox( NULL , "モデルが読み込まれていません\n" , "ERROR[ sceneModel.cpp ]" , MB_OK | MB_ICONEXCLAMATION );
		return;
	}

	LPDIRECT3DDEVICE9	pDevice;
	pDevice = CRenderer::GetDevice();

	D3DXMATRIX	mtxWorld;	//ワールドマトリクス
	D3DXMatrixIdentity( &mtxWorld );

	//拡大の処理
	D3DXMATRIX	mtxKakudai;	//拡大行列
	D3DXMatrixScaling( &mtxKakudai , GetScale().x , GetScale().y , GetScale().z );

	//回転の処理
	D3DXMATRIX	mtxKaiten;	//回転行列
	D3DXMatrixRotationYawPitchRoll( &mtxKaiten , GetRotate().y , GetRotate().x , GetRotate().z );	
	
	D3DXMATRIX	mtxHeikou;	//並行移動行列
	D3DXMatrixTranslation( &mtxHeikou , GetPosition().x , GetPosition().y , GetPosition().z );

	//行列の掛け算
	D3DXMatrixMultiply( &mtxWorld , &mtxWorld , &mtxKakudai );	
	D3DXMatrixMultiply( &mtxWorld , &mtxWorld , &mtxKaiten );	
	D3DXMatrixMultiply( &mtxWorld , &mtxWorld , &mtxHeikou );	

	//デバイスにワールド変換行列を登録
	pDevice->SetTransform( D3DTS_WORLD , &mtxWorld );

	//ビュー行列の作成
	D3DXMATRIX	mtxView = CManager::GetCamera()->GetView();

	//デバイスにビュー変換行列を設定
	pDevice->SetTransform( D3DTS_VIEW , &mtxView);

	//現在デバイスの設定されているマテリアル情報の取得
	D3DMATERIAL9	matDef;
	pDevice->GetMaterial( &matDef );

	// マテリアルへのポインタを取得
	m_pMat = (D3DXMATERIAL*)m_pMatBuffer->GetBufferPointer();


	for( int i = 0 ; i < (int) m_nNumMat ; i++ )
	{

		//デバイスにマテリアルを設定
		pDevice->SetMaterial( &m_pMat[i].MatD3D );
	
		//テクスチャの設定
		pDevice->SetTexture( 0 , m_pTextures[i] );
		
		//描画
		m_pMesh->DrawSubset( i );
	}

	pDevice->SetMaterial( &matDef );
}

//=========================================================================
//	モデルの読み込み
//=========================================================================
void	KHotate::LoadModel( const char* ModelName )
{
	LPDIRECT3DDEVICE9 pDevice;
	pDevice = CRenderer::GetDevice();

	HRESULT hr;	
	hr = D3DXLoadMeshFromX( ModelName , D3DXMESH_MANAGED , pDevice , NULL , &m_pMatBuffer , NULL , &m_nNumMat , &m_pMesh );
	//中身の頂点を加工する場合、システムメムを使う	D3DXMESH_SYSTEMMEM
	if( FAILED( hr ) )
	{
		//失敗
		UINT nID = MessageBox( NULL , "メッシュモデルを作成できません\n" , "ERROR[ sceneModel.cpp ]" , MB_OK | MB_ICONEXCLAMATION );
		return;
	}


	//マテリアル情報のポインタとしてバッファのアドレスを取得
	m_pMat = ( D3DXMATERIAL* )m_pMatBuffer->GetBufferPointer();
	m_pTextures	= new LPDIRECT3DTEXTURE9[m_nNumMat];

	for( DWORD i =0; i < m_nNumMat; i++ )
	{
		m_pTextures[ i ] = NULL;

		if( m_pMat[ i ].pTextureFilename )
		{
			char filePath[ MAX_PATH ];
			strcpy_s( filePath, TEXTURE_PATH );
			strcat_s( filePath, m_pMat[ i ].pTextureFilename );

			D3DXCreateTextureFromFile( pDevice, filePath, &m_pTextures[ i ] );
		}
	}
}
