#include "Sky.h"

Sky::Sky(
	std::shared_ptr<Mesh>								_mesh,
	std::shared_ptr<SimpleVertexShader>					_vertexShader,
	std::shared_ptr<SimplePixelShader>					_pixelShader,
	Microsoft::WRL::ComPtr<ID3D11ShaderResourceView>	_cubemap,
	Microsoft::WRL::ComPtr<ID3D11SamplerState>			_sampler,
	Microsoft::WRL::ComPtr<ID3D11Device>				_device)
{
	mesh = _mesh;
	cubemap = _cubemap;
	sampler = _sampler;
	vertexShader = _vertexShader;
	pixelShader = _pixelShader;

	D3D11_RASTERIZER_DESC rDesc = {};
	rDesc.FillMode = D3D11_FILL_SOLID;
	rDesc.CullMode = D3D11_CULL_FRONT;
	_device->CreateRasterizerState(&rDesc, rasterizerState.GetAddressOf());

	D3D11_DEPTH_STENCIL_DESC dDesc = {};
	dDesc.DepthEnable = true;
	dDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;
	_device->CreateDepthStencilState(&dDesc, depthState.GetAddressOf());
}

Sky::~Sky()
{
}

void Sky::Draw(Microsoft::WRL::ComPtr<ID3D11DeviceContext> _context, std::shared_ptr<Camera> _camera)
{
	_context->RSSetState(rasterizerState.Get());
	_context->OMSetDepthStencilState(depthState.Get(), 0);

	vertexShader->SetMatrix4x4("view", _camera->GetViewMatrix());
	vertexShader->SetMatrix4x4("projection", _camera->GetProjectionMatrix());
	vertexShader->CopyAllBufferData();
	vertexShader->SetShader();

	pixelShader->SetShaderResourceView("SkyTexture", cubemap.Get());
	pixelShader->SetSamplerState("Sampler", sampler.Get());
	pixelShader->CopyAllBufferData();
	pixelShader->SetShader();

	mesh->Draw();

	_context->RSSetState(0);
	_context->OMSetDepthStencilState(0, 0);
}