/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


		#include "gpu/gpu_renderer.h"
		#include "core/camera.h"

		using namespace GS::GPU;


//------------------------------------------------------------------------------
void				Renderer::DrawSkybox(GS::Render::sTexture t[2], GS::Render::Shader *s)
{
	static const size_t stride = sizeof(float) * 3;

	SetDepthFunc(DepthEqual);	// only draw on Z = 1
	EnableDepthWrite(false);

	Shader &p = s ? (Shader &)*s : *skybox_program;

	SetShaderProgram(&p);
	SetIndexSource(skybox_idx_vbo);
	SetVertexSource(skybox_vtx_vbo, stride);

	ShaderInput	*vtx_parm = p.GetInput(Core::ShaderInput::Position),
				*layer0_parm = p.GetInput("u_layer0"),
				*layer1_parm = p.GetInput("u_layer1");

	p.Set(*vtx_parm->location, 3, Types::ValueFloat, false, stride, (const void *)0);
	if	(layer0_parm && t[0].IsValid())
		p.Set(*layer0_parm->location, (Render::Texture &)*t[0], layer0_parm->index);
	if	(layer1_parm && t[1].IsValid())
		p.Set(*layer1_parm->location, (Render::Texture &)*t[1], layer1_parm->index);

	p.SetRendererInputs(*this);
	p.SetTransformInputs(m_projection, m_view, m_iview, &Matrix4::IdentityMatrix(), &Matrix4::IdentityMatrix());
	p.CommitInputs();

	DrawElements(Types::PrimitiveTriangle, 3 * 2, Types::ValueUShort);

	p.Set(*vtx_parm->location, 0, Types::ValueLast, false, 0, NULL);

	EnableDepthWrite(true);
	SetDepthFunc(DepthLess);
}
//------------------------------------------------------------------------------
