#pragma once
#include "Mesh.h"

// 平面投影法による影
class Shadow {
protected:
	LPDIRECT3DDEVICE9	pDevice;
	LPD3DXMESH			pMesh;
	int					NumMaterial;		// メッシュのマテリアル数
	D3DMATERIAL9		shadow_material;	// 影のマテリアル
	void StencileEnable();					// ステンシルバッファを有効にする
	void StencileDisable();					// ステンシルバッファを無効にする

public:
	// @param pDevice		D3Dデバイス
	// @param pMesh			メッシュ
	// @param NumMaterial	メッシュの材料数
	Shadow(LPDIRECT3DDEVICE9 pDevice, LPD3DXMESH pMesh, int NumMaterial);

	// @param position	メッシュの位置
	// @param rotation	メッシュの回転
	// @param direction 光の方向
	// @param plane		影の落ちる平面
	virtual void Draw(D3DXVECTOR3 position, D3DXMATRIX rotation, D3DXVECTOR3 direction, D3DXPLANE plane);
};


// マテリアルとテクスチャをセットしない影用フレームオペレータ
class FrameOperatorForShadow sealed : public FrameOperator {
private:
	void RenderMeshContainer(LPDIRECT3DDEVICE9, MYMESHCONTAINER* ,MYFRAME*) override;
};

// アニメーション用 平面投影法による影 
class AnimationShadow sealed : public Shadow {
	FrameOperatorForShadow frameOperatorForShadow;
	LPD3DXFRAME pFrame;
public:
	// @param pDevice	D3Dデバイス
	// @param pFrame	フレーム
	AnimationShadow(LPDIRECT3DDEVICE9 pDevice, LPD3DXFRAME pFrame);

	void Draw(D3DXVECTOR3 position, D3DXMATRIX rotation, D3DXVECTOR3 direction, D3DXPLANE plane);
};



//シャドウボリュームクラス
class ShadowVolume sealed {
private:
	LPDIRECT3DDEVICE9	pDevice;
	LPD3DXMESH			pMesh;
	unsigned long		numVertex;			// シャドウボリュームの頂点の数
	D3DXVECTOR3			vertex[100000];		// シャドウボリュームの頂点の位置データ
	void CreateVolume(D3DXVECTOR3 direction);
	void RenderVolume(D3DXMATRIX world);
	void RenderVolumeToStencil(D3DXMATRIX world);
	void RenderShadowBoard();
	D3DXMATRIX GetWorldMatrix(D3DXVECTOR3 position, D3DXMATRIX rotation);
	D3DXVECTOR3 GetLocalDirection(D3DXMATRIX rotation, D3DXVECTOR3 direction);
public:
	ShadowVolume(LPDIRECT3DDEVICE9 pDevice, LPD3DXMESH pMesh);
	void Draw(D3DXVECTOR3 position, D3DXMATRIX rotation, D3DXVECTOR3 direction);
	void DrawVolume(D3DXVECTOR3 position, D3DXMATRIX rotation, D3DXVECTOR3 direction);
};
