//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2008)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: mesh.cpp
//      Краткое описание: class mesh
//

#include <Darkstar/Resource System/Model/mesh.hpp>
#include <Darkstar/Kernel/logh.hpp>
#include <Darkstar/Graphic System/Direct3D/graphicDriver.hpp>
#include <Darkstar/Graphic System/Effect/eccSetter.hpp>
#include <Darkstar/Graphic System/Render State/render_state_manager.hpp>

using gs::GraphicDriver;
using gs::Camera;
using gs::Effect;
using rs::VertexBuffer;
using rs::IndexBuffer;
using rs::Material;
using rs::Mesh;
using math::Matr4;
using gs::ECCSetter;
using rs::DE_PRIMITIVE_TOPOLOGY;
using gs::RenderStateManager;

Mesh::Mesh(const shared_ptr<VertexBuffer>& vb, const shared_ptr<IndexBuffer>& ib, const shared_ptr<Material>& mat, const Matr4& tr_mat_os)
{
	vertex_buffer = vb;
	index_buffer = ib;
	material = mat;

	transform_matrix_os = tr_mat_os;

	primitive_topology = DEPT_TRIANGLELIST;
};

Mesh::~Mesh()
{

};

const shared_ptr<VertexBuffer>& Mesh::getVertexBuffer() const
{
	return vertex_buffer;
};

const shared_ptr<IndexBuffer>& Mesh::getIndexBuffer() const
{
	return index_buffer;
};

const shared_ptr<Material>& Mesh::getMaterial() const
{
	return material;
};

const shared_ptr<gs::Effect>& Mesh::getEffect() const
{
	material->set();
	return material->getEffect();
};

math::Matr4& Mesh::getTransformOS2WS()
{
	return transform_matrix_os;
};

void Mesh::draw(const math::Matr4& world_matr, const shared_ptr<Camera>& camera)
{
	vertex_buffer->set();
	index_buffer->set();
	material->set();
	ECCSetter::ptr()->set(material->getEffect(), world_matr*transform_matrix_os, camera);
	GraphicDriver::ptr()->setPrimitiveTopology(primitive_topology);
	material->getEffect()->set();
	RenderStateManager::ptr()->flush();
#ifdef GD_D3D10
	GraphicDriver::ptr()->setConstantBuffers();
	GraphicDriver::ptr()->getDevice()->DrawIndexed(index_buffer->getIndicesNumber(), 0, 0);
#endif
#ifdef GD_D3D9
	GraphicDriver::ptr()->getDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, vertex_buffer->getElementsCount(), 0, index_buffer->getIndicesNumber()/3);
#endif
};