// __author__ = Juan Carlos De Abreu (jcabreur@gmail.com)

/**
 * TODO(jcabreur): write a general comment here
 */

#ifndef MATH_VECTOR_H__
#define MATH_VECTOR_H__

#include "Vector/Vec2.h"
#include "Vector/Vec3.h"
#include "Vector/Vec4.h"
#include "Vector/Vec2-inl.h"
#include "Vector/Vec3-inl.h"
#include "Vector/Vec4-inl.h"

BEGIN_TEG_NAMESPACE();

//
typedef math::Vec2<int> Vec2i;
typedef math::Vec3<int> Vec3i;
typedef math::Vec4<int> Vec4i;

// 
typedef math::Vec2<float> Vec2f;
typedef math::Vec3<float> Vec3f;
typedef math::Vec4<float> Vec4f;


namespace math {

template<class _T>
__forceinline Vec2<_T> vec2(const Vec3<_T>& v) {
	return Vec2<_T>(v.x, v.y);
}

template<class _T>
__forceinline Vec2<_T> vec2(const Vec4<_T>& v) {
	return Vec2<_T>(v.x, v.y);
}

template<class _T>
__forceinline Vec3<_T> vec3(const Vec2<_T>& v, const _T& t) {
	return Vec3<_T>(v.x, v.y, t);
}

template<class _T>
__forceinline Vec3<_T> vec3(const Vec4<_T>& v) {
	return Vec3<_T>(v.x, v.y, v.z);
}

template<class _T>
__forceinline Vec4<_T> vec4(const Vec2<_T>& v1, const Vec2<_T>& v2) {
	return Vec4<_T>(v1.x, v1.y, v2.x, v2.y);
}

template<class _T>
__forceinline Vec4<_T> vec4(const Vec2<_T>& v, const _T& t1, const _T& t2) {
	return Vec4<_T>(v.x, v.y, t1, t2);
}

template<class _T>
__forceinline Vec4<_T> vec4(const Vec3<_T>& v, const _T& t) {
	return Vec4<_T>(v.x, v.y, v.z, t);
}

}; // Namespace math

END_TEG_NAMESPACE();

#endif  // MATH_VECTOR_H__
