text: ///////////////////////////////////////////////////////////////////////////////////////////////////
  // OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
  ///////////////////////////////////////////////////////////////////////////////////////////////////
  // Created : 2005-12-21
  // Updated : 2008-07-24
  // Licence : This source is under MIT License
  // File    : glm/gtx/norm.inl
  ///////////////////////////////////////////////////////////////////////////////////////////////////
  
  namespace glm
  {
  	template <typename T>
  	GLM_FUNC_QUALIFIER T length2
  	(
  		T const & x
  	)
  	{
  		return x * x;
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T length2
  	(
  		detail::tvec2<T, P> const & x
  	)
  	{
  		return dot(x, x);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T length2
  	(
  		detail::tvec3<T, P> const & x
  	)
  	{
  		return dot(x, x);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T length2
  	(
  		detail::tvec4<T, P> const & x
  	)
  	{
  		return dot(x, x);
  	}
  
  	template <typename T>
  	GLM_FUNC_QUALIFIER T distance2
  	(
  		T const & p0,
  		T const & p1
  	)
  	{
  		return length2(p1 - p0);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T distance2
  	(
  		detail::tvec2<T, P> const & p0,
  		detail::tvec2<T, P> const & p1
  	)
  	{
  		return length2(p1 - p0);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T distance2
  	(
  		detail::tvec3<T, P> const & p0,
  		detail::tvec3<T, P> const & p1
  	)
  	{
  		return length2(p1 - p0);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T distance2
  	(
  		detail::tvec4<T, P> const & p0,
  		detail::tvec4<T, P> const & p1
  	)
  	{
  		return length2(p1 - p0);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T l1Norm
  	(
  		detail::tvec3<T, P> const & a,
  		detail::tvec3<T, P> const & b
  	)
  	{
  		return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T l1Norm
  	(
  		detail::tvec3<T, P> const & v
  	)
  	{
  		return abs(v.x) + abs(v.y) + abs(v.z);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T l2Norm
  	(
  		detail::tvec3<T, P> const & a,
  		detail::tvec3<T, P> const & b
  	)
  	{
  		return length(b - a);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T l2Norm
  	(
  		detail::tvec3<T, P> const & v
  	)
  	{
  		return length(v);
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T lxNorm
  	(
  		detail::tvec3<T, P> const & x,
  		detail::tvec3<T, P> const & y,
  		unsigned int Depth
  	)
  	{
  		return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth));
  	}
  
  	template <typename T, precision P>
  	GLM_FUNC_QUALIFIER T lxNorm
  	(
  		detail::tvec3<T, P> const & v,
  		unsigned int Depth
  	)
  	{
  		return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth));
  	}
  
  }//namespace glm
  