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

namespace math
{
	inline SSE_Vect4::SSE_Vect4()
	{

	};

	inline SSE_Vect4::SSE_Vect4(const SSE_Vect4& v)
	{
		svec = v.svec;
	};

	inline SSE_Vect4::SSE_Vect4(const Vect4& v)
	{
		svec = _mm_set_ps(v.x, v.y, v.z, v.w);
	};

	inline SSE_Vect4::SSE_Vect4(const float x, const float y, const float z, const float w)
	{
		svec = _mm_set_ps(x, y, z, w);
	};

	inline SSE_Vect4::SSE_Vect4(const float f)
	{
		svec = _mm_set1_ps(f);
	};

	inline SSE_Vect4::SSE_Vect4(const __m128 svec)
	{
		this->svec = svec;
	};

	inline SSE_Vect4::~SSE_Vect4()
	{

	};

	inline SSE_Vect4& SSE_Vect4::operator =(const SSE_Vect4& v)
	{
		svec = v.svec;
		return *this;
	};

	inline const float SSE_Vect4::operator [](const unsigned int i) const
	{
		return svec.m128_f32[3-i];
	};

	inline float& SSE_Vect4::operator [](const unsigned int i)
	{
		return svec.m128_f32[3-i];
	};

	inline SSE_Vect4 SSE_Vect4::operator +(const SSE_Vect4& v) const
	{
		return SSE_Vect4(_mm_add_ps(svec, v.svec));
	};

	inline const SSE_Vect4& SSE_Vect4::operator +=(const SSE_Vect4& v)
	{
		svec = _mm_add_ps(svec, v.svec);
		return *this;
	};

	inline SSE_Vect4 SSE_Vect4::operator -(const SSE_Vect4& v) const
	{
		return SSE_Vect4(_mm_sub_ps(svec, v.svec));
	};

	inline const SSE_Vect4& SSE_Vect4::operator -=(const SSE_Vect4& v)
	{
		svec = _mm_sub_ps(svec, v.svec);
		return *this;
	};

	inline SSE_Vect4 SSE_Vect4::operator *(const float f) const
	{
		return SSE_Vect4(_mm_mul_ps(svec, SSE_Vect4(f).svec));
	};

	inline const SSE_Vect4& SSE_Vect4::operator *=(const float f)
	{
		svec = _mm_mul_ps(svec, SSE_Vect4(f).svec);
		return *this;
	};

	inline SSE_Vect4 SSE_Vect4::operator /(const float f) const
	{
		return SSE_Vect4(_mm_div_ps(svec, SSE_Vect4(f).svec));
	};

	inline const SSE_Vect4& SSE_Vect4::operator /=(const float f)
	{
		svec = _mm_div_ps(svec, SSE_Vect4(f).svec);
		return *this;
	};

	inline SSE_Vect4 SSE_Vect4::operator *(const SSE_Vect4& v) const
	{
		return SSE_Vect4(_mm_mul_ps(svec, v.svec));
	};

	inline const SSE_Vect4& SSE_Vect4::operator *=(const SSE_Vect4& v)
	{
		svec = _mm_mul_ps(svec, v.svec);
		return *this;
	};

	inline SSE_Vect4 SSE_Vect4::operator /(const SSE_Vect4& v) const
	{
		return SSE_Vect4(_mm_div_ps(svec, v.svec));
	};

	inline const SSE_Vect4& SSE_Vect4::operator /=(const SSE_Vect4& v)
	{
		svec = _mm_div_ps(svec, v.svec);
		return *this;
	};
};