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

namespace math
{
	inline SSE_Vect4 sse_sin(const SSE_Vect4& v)
	{
		SSE_Vect4 v2 = v*v;
		SSE_Vect4 v3 = v2*v;
		SSE_Vect4 v6 = v3*v3;
		return v - v3*0.166666666f + v3*v2*0.0083333333f - v6*v*0.0001984126f + v6*v3*0.0000027557f;
	};

	inline SSE_Vect4 sse_cos(const SSE_Vect4& v)
	{
		SSE_Vect4 v2 = v*v;
		SSE_Vect4 v4 = v2*v2;
		SSE_Vect4 v8 = v4*v4;
		return SSE_Vect4(1) - v2*0.5f + v4*0.0416666666f - v4*v2*0.0013888888f + v8*0.000024801f - v8*v2*0.000000275f;
	};

	inline SSE_Vect4 sse_cross(const SSE_Vect4& v1, const SSE_Vect4& v2)
	{
		return SSE_Vect4(_mm_sub_ps(_mm_mul_ps(_mm_shuffle_ps(v1.svec, v1.svec, _MM_SHUFFLE(2, 1, 3, 0)), _mm_shuffle_ps(v2.svec, v2.svec, _MM_SHUFFLE(1, 3, 2, 0))), _mm_mul_ps(_mm_shuffle_ps(v1.svec, v1.svec, _MM_SHUFFLE(1, 3, 2, 0)), _mm_shuffle_ps(v2.svec, v2.svec, _MM_SHUFFLE(2, 1, 3, 0)))));
	};

};