namespace glm
{
namespace detail
{
template<typename T>
struct tvec3
{
T x_, y_, z_;
tvec3(T x, T y, T z) : x_(x), y_(y), z_(z)
{
}
};
}
template<typename T>
detail::tvec3<T> cross(detail::tvec3<T> const& a, detail::tvec3<T> const& b)
{
return detail::tvec3<T>(a.y_ * b.z_ - a.z_ - b.y_,
a.z_ * b.x_ - a.x_ - b.z_,
a.x_ * b.y_ - a.y_ - b.x_);
}
}
template <typename T, unsigned int Dim>
struct vect
{
};
template <typename T>
struct vect<T, 3u>
{
typedef glm::detail::tvec3<T> value;
};
typedef vect<double, 3u>::value vec3d;
typedef vect<float, 3u>::value vec3f;
template <typename T, unsigned int Dim>
typename vect<T, Dim>::value cross_product( typename vect<T, Dim>::value const& left
, typename vect<T, Dim>::value const& right)
{
return glm::cross<T>(left, right);
}
int main()
{
vec3f v0 = vec3f(1.f, 0.f, 0.f);
vec3f v1 = vec3f(0.f, 1.f, 0.f);
vec3f res = cross_product<float, 3u>(v0, v1);
return 0;
}