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

#include <Darkstar/math.hpp>

using namespace math;

Matr3::Matr3(const Quat& q)
{
	setOnlyRotation(q);
};

const Matr3& Matr3::setOnlyRotation(const Quat& q)
{
	*this = q.getAsMatrix3();
	return *this;
};

const Matr3& Matr3::ApplyRotation(const Quat& q)
{
	*this *= Matr3(q);
	return *this;
};

Quat Matr3::getQuaternion() const
{
	Quat q = Quat(*this);
	return q;
};

Matr4::Matr4(const Quat& q)
{
	setOnlyRotation(q);
};

Matr4::Matr4(const Quat& rot, const Vect3& tran, const float scale)
{
	setOnlyRotation(rot);
	_a00 *= scale;
	_a11 *= scale;
	_a22 *= scale;
	_a03 = tran.x;
	_a13 = tran.y;
	_a23 = tran.z;
};

Matr4::Matr4(const Quat& rot, const Vect3& tran, const Vect3& scale)
{
	setOnlyRotation(rot);
	_a00 *= scale.x;
	_a11 *= scale.y;
	_a22 *= scale.z;
	_a03 = tran.x;
	_a13 = tran.y;
	_a23 = tran.z;
};

const Matr4& Matr4::setRotation(const Quat& q)
{
	Matr3 m = q.getAsMatrix3();
	row0.x = m.row0.x;
	row0.y = m.row0.y;
	row0.z = m.row0.z;
	row1.x = m.row1.x;
	row1.y = m.row1.y;
	row1.z = m.row1.z;
	row2.x = m.row2.x;
	row2.y = m.row2.y;
	row2.z = m.row2.z;
	return *this;
};

const Matr4& Matr4::ApplyRotation(const Quat& q)
{
	*this *= q.getAsMatrix4();
	return *this;
};

const Matr4& Matr4::setOnlyRotation(const Quat& q)
{
	*this = q.getAsMatrix4();
	return *this;
};

Quat Matr4::getQuaternion() const
{
	Quat q = Quat(*this);
	return q;
};

Matr34::Matr34(const Quat& q)
{
	setOnlyRotation(q);
};

Matr34::Matr34(const Quat& rot, const Vect3& tran, const float scale)
{
	setOnlyRotation(rot);
	_a00 *= scale;
	_a11 *= scale;
	_a22 *= scale;
	_a03 = tran.x;
	_a13 = tran.y;
	_a23 = tran.z;
};

Matr34::Matr34(const Quat& rot, const Vect3& tran, const Vect3& scale)
{
	setOnlyRotation(rot);
	_a00 *= scale.x;
	_a11 *= scale.y;
	_a22 *= scale.z;
	_a03 = tran.x;
	_a13 = tran.y;
	_a23 = tran.z;
};

const Matr34& Matr34::setRotation(const Quat& q)
{
	Matr3 m = q.getAsMatrix3();
	row0.x = m.row0.x;
	row0.y = m.row0.y;
	row0.z = m.row0.z;
	row1.x = m.row1.x;
	row1.y = m.row1.y;
	row1.z = m.row1.z;
	row2.x = m.row2.x;
	row2.y = m.row2.y;
	row2.z = m.row2.z;
	return *this;
};

const Matr34& Matr34::ApplyRotation(const Quat& q)
{
	*this *= q.getAsMatrix34();
	return *this;
};

const Matr34& Matr34::setOnlyRotation(const Quat& q)
{
	*this = q.getAsMatrix34();
	return *this;
};

Quat Matr34::getQuaternion() const
{
	Quat q = Quat(*this);
	return q;
};