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

#ifndef DSE_MATH_SSE_VECT4_HPP
#define DSE_MATH_SSE_VECT4_HPP

#include <Darkstar/math.hpp>

#include <xmmintrin.h>

namespace math
{
	class Vect4;

	class SSE_Vect4
	{
	public:
		__m128 svec;

		SSE_Vect4();
		SSE_Vect4(const SSE_Vect4& v);
		SSE_Vect4(const Vect4& v);
		SSE_Vect4(const float x, const float y, const float z, const float w);
		SSE_Vect4(const __m128 svec);
		SSE_Vect4(const float f);
		~SSE_Vect4();

		const float operator[](const unsigned int i) const;
		float& operator[](const unsigned int i);

		SSE_Vect4& operator=(const SSE_Vect4& v);

		SSE_Vect4 operator+(const SSE_Vect4& v) const;
		const SSE_Vect4& operator+=(const SSE_Vect4& v);
		SSE_Vect4 operator-(const SSE_Vect4& v) const;
		const SSE_Vect4& operator-=(const SSE_Vect4& v);
		
		SSE_Vect4 operator*(const float f) const;
		const SSE_Vect4& operator*=(const float f);
		SSE_Vect4 operator/(const float f) const;
		const SSE_Vect4& operator/=(const float f);

		SSE_Vect4 operator*(const SSE_Vect4& v) const;
		const SSE_Vect4& operator*=(const SSE_Vect4& v);
		SSE_Vect4 operator/(const SSE_Vect4& v) const;
		const SSE_Vect4& operator/=(const SSE_Vect4& v);
	};
};

#include <Darkstar/Math/sse_vect4.inl>

#endif