2
0
Эх сурвалжийг харах

Added EXT_vec1: *vec1 types

Christophe Riccio 8 жил өмнө
parent
commit
d550798ca0

+ 0 - 7
glm/detail/func_geometric.inl

@@ -174,13 +174,6 @@ namespace detail
 		return detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
 	}
 
-	template<typename T, qualifier Q>
-	GLM_FUNC_QUALIFIER T dot(tquat<T, Q> const& x, tquat<T, Q> const& y)
-	{
-		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
-		return detail::compute_dot<tquat<T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
-	}
-
 	// cross
 	template<typename T, qualifier Q>
 	GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& x, vec<3, T, Q> const& y)

+ 1 - 0
glm/detail/func_integer.inl

@@ -1,6 +1,7 @@
 /// @ref core
 /// @file glm/detail/func_integer.inl
 
+#include "../ext/vec1.hpp"
 #include "type_vec2.hpp"
 #include "type_vec3.hpp"
 #include "type_vec4.hpp"

+ 1 - 0
glm/detail/glm.cpp

@@ -3,6 +3,7 @@
 
 #define GLM_ENABLE_EXPERIMENTAL
 #include <glm/glm.hpp>
+#include <glm/ext/vec1.hpp>
 #include <glm/gtc/quaternion.hpp>
 #include <glm/gtx/dual_quaternion.hpp>
 

+ 0 - 17
glm/detail/type_vec.hpp

@@ -103,28 +103,11 @@ namespace detail
 }//namespace detail
 
 #if GLM_HAS_TEMPLATE_ALIASES
-	template <typename T, qualifier Q = defaultp> using tvec1 = vec<1, T, Q>;
 	template <typename T, qualifier Q = defaultp> using tvec2 = vec<2, T, Q>;
 	template <typename T, qualifier Q = defaultp> using tvec3 = vec<3, T, Q>;
 	template <typename T, qualifier Q = defaultp> using tvec4 = vec<4, T, Q>;
 #endif//GLM_HAS_TEMPLATE_ALIASES
 
-	typedef vec<1, float, highp>	highp_vec1_t;
-	typedef vec<1, float, mediump>	mediump_vec1_t;
-	typedef vec<1, float, lowp>		lowp_vec1_t;
-	typedef vec<1, double, highp>	highp_dvec1_t;
-	typedef vec<1, double, mediump>	mediump_dvec1_t;
-	typedef vec<1, double, lowp>	lowp_dvec1_t;
-	typedef vec<1, int, highp>		highp_ivec1_t;
-	typedef vec<1, int, mediump>	mediump_ivec1_t;
-	typedef vec<1, int, lowp>		lowp_ivec1_t;
-	typedef vec<1, uint, highp>		highp_uvec1_t;
-	typedef vec<1, uint, mediump>	mediump_uvec1_t;
-	typedef vec<1, uint, lowp>		lowp_uvec1_t;
-	typedef vec<1, bool, highp>		highp_bvec1_t;
-	typedef vec<1, bool, mediump>	mediump_bvec1_t;
-	typedef vec<1, bool, lowp>		lowp_bvec1_t;
-
 	/// @addtogroup core_precision
 	/// @{
 

+ 0 - 301
glm/detail/type_vec1.hpp

@@ -1,301 +0,0 @@
-/// @ref core
-/// @file glm/detail/type_vec1.hpp
-
-#pragma once
-
-#include "../fwd.hpp"
-#include "type_vec.hpp"
-#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
-#	if GLM_HAS_UNRESTRICTED_UNIONS
-#		include "_swizzle.hpp"
-#	else
-#		include "_swizzle_func.hpp"
-#	endif
-#endif //GLM_SWIZZLE
-#include <cstddef>
-
-namespace glm
-{
-	template<typename T, qualifier Q>
-	struct vec<1, T, Q>
-	{
-		// -- Implementation detail --
-
-		typedef T value_type;
-		typedef vec type;
-		typedef vec<1, bool, Q> bool_type;
-
-		// -- Data --
-
-#		if GLM_HAS_ONLY_XYZW
-			T x;
-
-#		elif GLM_HAS_ALIGNED_TYPE
-#			if GLM_COMPILER & GLM_COMPILER_GCC
-#				pragma GCC diagnostic push
-#				pragma GCC diagnostic ignored "-Wpedantic"
-#			endif
-#			if GLM_COMPILER & GLM_COMPILER_CLANG
-#				pragma clang diagnostic push
-#				pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
-#				pragma clang diagnostic ignored "-Wnested-anon-types"
-#			endif
-		
-			union
-			{
-				T x;
-				T r;
-				T s;
-/*
-#				if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
-					_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, x)
-					_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, r)
-					_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, s)
-					_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, x)
-					_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, r)
-					_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, s)
-					_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, x)
-					_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, r)
-					_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, s)
-#				endif//GLM_SWIZZLE*/
-			};
-		
-#			if GLM_COMPILER & GLM_COMPILER_CLANG
-#				pragma clang diagnostic pop
-#			endif
-#			if GLM_COMPILER & GLM_COMPILER_GCC
-#				pragma GCC diagnostic pop
-#			endif
-#		else
-			union {T x, r, s;};
-/*
-#			if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
-				GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4)
-#			endif//GLM_SWIZZLE*/
-#		endif
-
-		// -- Component accesses --
-
-		/// Return the count of components of the vector
-		typedef length_t length_type;
-		GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;}
-
-		GLM_FUNC_DECL T & operator[](length_type i);
-		GLM_FUNC_DECL T const& operator[](length_type i) const;
-
-		// -- Implicit basic constructors --
-
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT;
-		template<qualifier P>
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, T, P> const& v);
-
-		// -- Explicit basic constructors --
-
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);
-
-		// -- Conversion vector constructors --
-
-		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
-		template<typename U, qualifier P>
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v);
-		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
-		template<typename U, qualifier P>
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v);
-		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
-		template<typename U, qualifier P>
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);
-
-		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
-		template<typename U, qualifier P>
-		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<1, U, P> const& v);
-
-		// -- Swizzle constructors --
-/*
-#		if(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))
-			template<int E0>
-			GLM_FUNC_DECL tvec(detail::_swizzle<1, T, Q, tvec1, E0, -1,-2,-3> const& that)
-			{
-				*this = that();
-			}
-#		endif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))
-*/
-		// -- Unary arithmetic operators --
-
-		GLM_FUNC_DECL vec & operator=(vec const& v) GLM_DEFAULT;
-
-		template<typename U>
-		GLM_FUNC_DECL vec & operator=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator+=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator-=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator*=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator/=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v);
-
-		// -- Increment and decrement operators --
-
-		GLM_FUNC_DECL vec & operator++();
-		GLM_FUNC_DECL vec & operator--();
-		GLM_FUNC_DECL vec operator++(int);
-		GLM_FUNC_DECL vec operator--(int);
-
-		// -- Unary bit operators --
-
-		template<typename U>
-		GLM_FUNC_DECL vec & operator%=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator&=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator|=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator^=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator<<=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator>>=(U scalar);
-		template<typename U>
-		GLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v);
-	};
-
-	// -- Unary operators --
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v);
-
-	// -- Binary operators --
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<1, T, Q> operator~(vec<1, T, Q> const& v);
-
-	// -- Boolean operators --
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
-
-	template<qualifier Q>
-	GLM_FUNC_DECL vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);
-
-	template<qualifier Q>
-	GLM_FUNC_DECL vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);
-}//namespace glm
-
-#ifndef GLM_EXTERNAL_TEMPLATE
-#include "type_vec1.inl"
-#endif//GLM_EXTERNAL_TEMPLATE

+ 398 - 0
glm/ext/vec1.hpp

@@ -0,0 +1,398 @@
+/// @ref ext_vec1
+/// @file glm/ext/vec1.hpp
+///
+/// @see core (dependence)
+///
+/// @defgroup ext_vec1 GLM_EXT_vec1
+/// @ingroup ext
+///
+/// Include <glm/ext/vec1.hpp> to use the features of this extension.
+/// 
+/// Add vec1, ivec1, uvec1 and bvec1 types.
+
+#pragma once
+
+#include "../fwd.hpp"
+#include "../detail/type_vec.hpp"
+#if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
+#	if GLM_HAS_UNRESTRICTED_UNIONS
+#		include "../detail/_swizzle.hpp"
+#	else
+#		include "../detail/_swizzle_func.hpp"
+#	endif
+#endif //GLM_SWIZZLE
+#include <cstddef>
+
+#if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)
+#	pragma message("GLM: GLM_EXT_vec1 extension included")
+#endif
+
+namespace glm
+{
+	/// @addtogroup ext_vec1
+	/// @{
+
+	template<typename T, qualifier Q>
+	struct vec<1, T, Q>
+	{
+		// -- Implementation detail --
+
+		typedef T value_type;
+		typedef vec type;
+		typedef vec<1, bool, Q> bool_type;
+
+		// -- Data --
+
+#		if GLM_HAS_ONLY_XYZW
+			T x;
+
+#		elif GLM_HAS_ALIGNED_TYPE
+#			if GLM_COMPILER & GLM_COMPILER_GCC
+#				pragma GCC diagnostic push
+#				pragma GCC diagnostic ignored "-Wpedantic"
+#			endif
+#			if GLM_COMPILER & GLM_COMPILER_CLANG
+#				pragma clang diagnostic push
+#				pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
+#				pragma clang diagnostic ignored "-Wnested-anon-types"
+#			endif
+		
+			union
+			{
+				T x;
+				T r;
+				T s;
+/*
+#				if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
+					_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, x)
+					_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, r)
+					_GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, s)
+					_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, x)
+					_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, r)
+					_GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, s)
+					_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, x)
+					_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, r)
+					_GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, s)
+#				endif//GLM_SWIZZLE*/
+			};
+		
+#			if GLM_COMPILER & GLM_COMPILER_CLANG
+#				pragma clang diagnostic pop
+#			endif
+#			if GLM_COMPILER & GLM_COMPILER_GCC
+#				pragma GCC diagnostic pop
+#			endif
+#		else
+			union {T x, r, s;};
+/*
+#			if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
+				GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4)
+#			endif//GLM_SWIZZLE*/
+#		endif
+
+		// -- Component accesses --
+
+		/// Return the count of components of the vector
+		typedef length_t length_type;
+		GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;}
+
+		GLM_FUNC_DECL T & operator[](length_type i);
+		GLM_FUNC_DECL T const& operator[](length_type i) const;
+
+		// -- Implicit basic constructors --
+
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT;
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT;
+		template<qualifier P>
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, T, P> const& v);
+
+		// -- Explicit basic constructors --
+
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);
+
+		// -- Conversion vector constructors --
+
+		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+		template<typename U, qualifier P>
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v);
+		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+		template<typename U, qualifier P>
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v);
+		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+		template<typename U, qualifier P>
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);
+
+		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
+		template<typename U, qualifier P>
+		GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<1, U, P> const& v);
+
+		// -- Swizzle constructors --
+/*
+#		if(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))
+			template<int E0>
+			GLM_FUNC_DECL tvec(detail::_swizzle<1, T, Q, tvec1, E0, -1,-2,-3> const& that)
+			{
+				*this = that();
+			}
+#		endif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))
+*/
+		// -- Unary arithmetic operators --
+
+		GLM_FUNC_DECL vec & operator=(vec const& v) GLM_DEFAULT;
+
+		template<typename U>
+		GLM_FUNC_DECL vec & operator=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator+=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator-=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator*=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator/=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v);
+
+		// -- Increment and decrement operators --
+
+		GLM_FUNC_DECL vec & operator++();
+		GLM_FUNC_DECL vec & operator--();
+		GLM_FUNC_DECL vec operator++(int);
+		GLM_FUNC_DECL vec operator--(int);
+
+		// -- Unary bit operators --
+
+		template<typename U>
+		GLM_FUNC_DECL vec & operator%=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator&=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator|=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator^=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator<<=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator>>=(U scalar);
+		template<typename U>
+		GLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v);
+	};
+
+	// -- Unary operators --
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v);
+
+	// -- Binary operators --
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL vec<1, T, Q> operator~(vec<1, T, Q> const& v);
+
+	// -- Boolean operators --
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_DECL bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
+
+	template<qualifier Q>
+	GLM_FUNC_DECL vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);
+
+	template<qualifier Q>
+	GLM_FUNC_DECL vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);
+
+	/// 1 component vector of single-precision floating-point numbers using high precision arithmetic in term of ULPs.
+	///
+	/// @see ext_vec1
+	typedef vec<1, float, highp>		highp_vec1;
+
+	/// 1 component vector of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.
+	///
+	/// @see ext_vec1
+	typedef vec<1, float, mediump>		mediump_vec1;
+
+	/// 1 component vector of single-precision floating-point numbers using low precision arithmetic in term of ULPs.
+	///
+	/// @see ext_vec1
+	typedef vec<1, float, lowp>			lowp_vec1;
+
+	/// 1 component vector of double-precision floating-point numbers using high precision arithmetic in term of ULPs.
+	///
+	/// @see ext_vec1
+	typedef vec<1, double, highp>		highp_dvec1;
+
+	/// 1 component vector of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.
+	///
+	/// @see ext_vec1
+	typedef vec<1, double, mediump>		mediump_dvec1;
+
+	/// 1 component vector of double-precision floating-point numbers using low precision arithmetic in term of ULPs.
+	///
+	/// @see ext_vec1
+	typedef vec<1, double, lowp>		lowp_dvec1;
+
+	/// 1 component vector of signed integer numbers.
+	///
+	/// @see ext_vec1
+	typedef vec<1, int, highp>			highp_ivec1;
+
+	/// 1 component vector of signed integer numbers.
+	///
+	/// @see ext_vec1
+	typedef vec<1, int, mediump>		mediump_ivec1;
+
+	/// 1 component vector of signed integer numbers.
+	///
+	/// @see ext_vec1
+	typedef vec<1, int, lowp>			lowp_ivec1;
+
+	/// 1 component vector of unsigned integer numbers.
+	///
+	/// @see ext_vec1
+	typedef vec<1, uint, highp>			highp_uvec1;
+
+	/// 1 component vector of unsigned integer numbers.
+	///
+	/// @see ext_vec1
+	typedef vec<1, uint, mediump>		mediump_uvec1;
+
+	/// 1 component vector of unsigned integer numbers.
+	///
+	/// @see ext_vec1
+	typedef vec<1, uint, lowp>			lowp_uvec1;
+
+	/// 1 component vector of bool values.
+	///
+	/// @see ext_vec1
+	typedef vec<1, bool, highp>			highp_bvec1;
+
+	/// 1 component vector of bool values.
+	///
+	/// @see ext_vec1
+	typedef vec<1, bool, mediump>		mediump_bvec1;
+
+	/// 1 component vector of bool values.
+	///
+	/// @see ext_vec1
+	typedef vec<1, bool, lowp>			lowp_bvec1;
+
+#if GLM_HAS_TEMPLATE_ALIASES
+	template <typename T, qualifier Q = defaultp> using tvec1 = vec<1, T, Q>;
+#endif//GLM_HAS_TEMPLATE_ALIASES
+
+	/// @}
+}//namespace glm
+
+#ifndef GLM_EXTERNAL_TEMPLATE
+#include "../detail/type_vec1.inl"
+#endif//GLM_EXTERNAL_TEMPLATE

+ 7 - 0
glm/gtc/quaternion.inl

@@ -364,6 +364,13 @@ namespace detail
 
 	// -- Operations --
 
+	template<typename T, qualifier Q>
+	GLM_FUNC_QUALIFIER T dot(tquat<T, Q> const& x, tquat<T, Q> const& y)
+	{
+		GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
+		return detail::compute_dot<tquat<T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
+	}
+
 	template<typename T, qualifier Q>
 	GLM_FUNC_QUALIFIER T length(tquat<T, Q> const& q)
 	{

+ 1 - 0
glm/gtc/random.inl

@@ -4,6 +4,7 @@
 #include "../geometric.hpp"
 #include "../exponential.hpp"
 #include "../trigonometric.hpp"
+#include "../ext/vec1.hpp"
 #include <cstdlib>
 #include <ctime>
 #include <cassert>

+ 1 - 77
glm/gtc/vec1.hpp

@@ -13,8 +13,7 @@
 #pragma once
 
 // Dependency:
-#include "../glm.hpp"
-#include "../detail/type_vec1.hpp"
+#include "../ext/vec1.hpp"
 
 #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)
 #	pragma message("GLM: GLM_GTC_vec1 extension included")
@@ -22,81 +21,6 @@
 
 namespace glm
 {
-	/// 1 component vector of high qualifier floating-point numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef highp_vec1_t			highp_vec1;
-
-	/// 1 component vector of medium qualifier floating-point numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef mediump_vec1_t			mediump_vec1;
-
-	/// 1 component vector of low qualifier floating-point numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef lowp_vec1_t				lowp_vec1;
-
-	/// 1 component vector of high qualifier floating-point numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef highp_dvec1_t			highp_dvec1;
-
-	/// 1 component vector of medium qualifier floating-point numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef mediump_dvec1_t			mediump_dvec1;
-
-	/// 1 component vector of low qualifier floating-point numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef lowp_dvec1_t			lowp_dvec1;
-
-	/// 1 component vector of high qualifier signed integer numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef highp_ivec1_t			highp_ivec1;
-
-	/// 1 component vector of medium qualifier signed integer numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef mediump_ivec1_t			mediump_ivec1;
-
-	/// 1 component vector of low qualifier signed integer numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef lowp_ivec1_t			lowp_ivec1;
-
-	/// 1 component vector of high qualifier unsigned integer numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef highp_uvec1_t			highp_uvec1;
-
-	/// 1 component vector of medium qualifier unsigned integer numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef mediump_uvec1_t			mediump_uvec1;
-
-	/// 1 component vector of low qualifier unsigned integer numbers. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef lowp_uvec1_t			lowp_uvec1;
-
-	/// 1 component vector of high qualifier boolean. 
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef highp_bvec1_t			highp_bvec1;
-
-	/// 1 component vector of medium qualifier boolean.
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef mediump_bvec1_t			mediump_bvec1;
-
-	/// 1 component vector of low qualifier boolean.
-	/// There is no guarantee on the actual qualifier.
-	/// @see gtc_vec1 extension.
-	typedef lowp_bvec1_t			lowp_bvec1;
-
 	//////////////////////////
 	// vec1 definition
 

+ 1 - 0
readme.md

@@ -64,6 +64,7 @@ glm::mat4 camera(float Translate, glm::vec2 const& Rotate)
 - Added quatLookAt to GTX_quaternion #659
 - Added fmin, fmax and fclamp to GTX_extended_min_max #372
 - Added EXT_vector_relational: extend equal and notEqual to take an epsilon argument
+- Added EXT_vec1: *vec1 types
 
 #### Improvements:
 - No more default initialization of vector, matrix and quaternion types

+ 1 - 0
test/core/core_type_vec1.cpp

@@ -1,6 +1,7 @@
 #define GLM_FORCE_SWIZZLE
 #include <glm/vector_relational.hpp>
 #include <glm/gtc/vec1.hpp>
+#include <glm/vec2.hpp>
 #include <vector>
 
 static glm::vec1 g1;

+ 1 - 0
test/gtc/gtc_noise.cpp

@@ -1,5 +1,6 @@
 #define GLM_ENABLE_EXPERIMENTAL
 #include <glm/gtc/noise.hpp>
+#include <glm/gtc/type_precision.hpp>
 #include <glm/gtx/raw_data.hpp>
 
 int test_simplex()

+ 1 - 0
test/gtc/gtc_packing.cpp

@@ -1,3 +1,4 @@
+#include <glm/packing.hpp>
 #include <glm/gtc/packing.hpp>
 #include <glm/gtc/epsilon.hpp>
 #include <cstdio>