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

#include <Darkstar/Resource System/Model/static_model.hpp>

using rs::StaticModel;
using math::Vect3;
using math::Matr4;
using rs::Mesh;
using gs::Camera;

StaticModel::StaticModel()
{
	angx = angy = angz = 0;
	scale_factor = 1.0f;
	position = Vect3(0, 0, 0);
	transformation_matrix = math::matr4_sing;
	need_to_matrix_update = false;
};

StaticModel::~StaticModel()
{

};

__forceinline void StaticModel::_buildTransformationMatrix()
{
	if(need_to_matrix_update)
	{
		Matr4 world_matrix = math::matr4_sing;
		world_matrix.ApplyTranslation(position);
		world_matrix.ApplyRotation(Vect3(angx, angy, angz));
		world_matrix.ApplyScaling(scale_factor);
		transformation_matrix = world_matrix;
		need_to_matrix_update = false;
	};
};

void StaticModel::setTranslation(const math::Vect3& new_position)
{
	position = new_position;
	need_to_matrix_update = true;
};

void StaticModel::setRotationX(const float angle)
{
	angx = angle;
	need_to_matrix_update = true;
};

void StaticModel::setRotationY(const float angle)
{
	angy = angle;
	need_to_matrix_update = true;
};

void StaticModel::setRotationZ(const float angle)
{
	angz = angle;
	need_to_matrix_update = true;
};

void StaticModel::setScaling(const float scale_factor)
{
	this->scale_factor = scale_factor;
	need_to_matrix_update = true;
};

const Vect3& StaticModel::getTranslation() const
{
	return position;
};

Vect3 StaticModel::getRotation() const
{
	return Vect3(angx, angy, angz);
};

const float StaticModel::getScaling() const
{
	return scale_factor;
};

void StaticModel::addNextMesh(const shared_ptr<Mesh>& next_mesh)
{
	meshes.push_back(next_mesh);
};

const unsigned int StaticModel::getMeshesNumber() const
{
	return (unsigned int)meshes.size();
};

const shared_ptr<Mesh>& StaticModel::getMesh(const unsigned int index) const
{
	return meshes[index];
};

void StaticModel::drawMesh(const unsigned int index, const shared_ptr<Camera>& camera)
{	
	_buildTransformationMatrix();
	meshes[index]->draw(transformation_matrix, camera);
};


