Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

462 lines
14KB

  1. /// @ref ext_vec1
  2. /// @file glm/ext/vec1.hpp
  3. ///
  4. /// @see core (dependence)
  5. ///
  6. /// @defgroup ext_vec1 GLM_EXT_vec1
  7. /// @ingroup ext
  8. ///
  9. /// Include <glm/ext/vec1.hpp> to use the features of this extension.
  10. ///
  11. /// Add vec1, ivec1, uvec1 and bvec1 types.
  12. #pragma once
  13. #include "../fwd.hpp"
  14. #include "../detail/type_vec.hpp"
  15. #if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
  16. # if GLM_HAS_UNRESTRICTED_UNIONS
  17. # include "../detail/_swizzle.hpp"
  18. # else
  19. # include "../detail/_swizzle_func.hpp"
  20. # endif
  21. #endif //GLM_SWIZZLE
  22. #include <cstddef>
  23. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED)
  24. # pragma message("GLM: GLM_EXT_vec1 extension included")
  25. #endif
  26. namespace glm
  27. {
  28. /// @addtogroup ext_vec1
  29. /// @{
  30. template<typename T, qualifier Q>
  31. struct vec<1, T, Q>
  32. {
  33. // -- Implementation detail --
  34. typedef T value_type;
  35. typedef vec type;
  36. typedef vec<1, bool, Q> bool_type;
  37. // -- Data --
  38. # if GLM_HAS_ONLY_XYZW
  39. T x;
  40. # elif GLM_HAS_ALIGNED_TYPE
  41. # if GLM_COMPILER & GLM_COMPILER_GCC
  42. # pragma GCC diagnostic push
  43. # pragma GCC diagnostic ignored "-Wpedantic"
  44. # endif
  45. # if GLM_COMPILER & GLM_COMPILER_CLANG
  46. # pragma clang diagnostic push
  47. # pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
  48. # pragma clang diagnostic ignored "-Wnested-anon-types"
  49. # endif
  50. union
  51. {
  52. T x;
  53. T r;
  54. T s;
  55. /*
  56. # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
  57. _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, x)
  58. _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, r)
  59. _GLM_SWIZZLE1_2_MEMBERS(T, Q, tvec2, s)
  60. _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, x)
  61. _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, r)
  62. _GLM_SWIZZLE1_3_MEMBERS(T, Q, tvec3, s)
  63. _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, x)
  64. _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, r)
  65. _GLM_SWIZZLE1_4_MEMBERS(T, Q, tvec4, s)
  66. # endif//GLM_SWIZZLE*/
  67. };
  68. # if GLM_COMPILER & GLM_COMPILER_CLANG
  69. # pragma clang diagnostic pop
  70. # endif
  71. # if GLM_COMPILER & GLM_COMPILER_GCC
  72. # pragma GCC diagnostic pop
  73. # endif
  74. # else
  75. union {T x, r, s;};
  76. /*
  77. # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
  78. GLM_SWIZZLE_GEN_VEC_FROM_VEC1(T, P, tvec2, tvec2, tvec3, tvec4)
  79. # endif//GLM_SWIZZLE*/
  80. # endif
  81. // -- Component accesses --
  82. /// Return the count of components of the vector
  83. typedef length_t length_type;
  84. GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 1;}
  85. GLM_FUNC_DECL T & operator[](length_type i);
  86. GLM_FUNC_DECL T const& operator[](length_type i) const;
  87. // -- Implicit basic constructors --
  88. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec() GLM_DEFAULT_CTOR;
  89. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec const& v) GLM_DEFAULT;
  90. template<qualifier P>
  91. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR vec(vec<1, T, P> const& v);
  92. // -- Explicit basic constructors --
  93. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR explicit vec(T scalar);
  94. // -- Conversion vector constructors --
  95. /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
  96. template<typename U, qualifier P>
  97. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<2, U, P> const& v);
  98. /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
  99. template<typename U, qualifier P>
  100. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<3, U, P> const& v);
  101. /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
  102. template<typename U, qualifier P>
  103. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<4, U, P> const& v);
  104. /// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
  105. template<typename U, qualifier P>
  106. GLM_FUNC_DECL GLM_CONSTEXPR_CTOR GLM_EXPLICIT vec(vec<1, U, P> const& v);
  107. // -- Swizzle constructors --
  108. /*
  109. # if(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))
  110. template<int E0>
  111. GLM_FUNC_DECL tvec(detail::_swizzle<1, T, Q, tvec1, E0, -1,-2,-3> const& that)
  112. {
  113. *this = that();
  114. }
  115. # endif//(GLM_HAS_UNRESTRICTED_UNIONS && (GLM_SWIZZLE == GLM_SWIZZLE_ENABLED))
  116. */
  117. // -- Unary arithmetic operators --
  118. GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec & operator=(vec const& v) GLM_DEFAULT;
  119. template<typename U>
  120. GLM_FUNC_DECL GLM_CONSTEXPR_CXX14 vec & operator=(vec<1, U, Q> const& v);
  121. template<typename U>
  122. GLM_FUNC_DECL vec & operator+=(U scalar);
  123. template<typename U>
  124. GLM_FUNC_DECL vec & operator+=(vec<1, U, Q> const& v);
  125. template<typename U>
  126. GLM_FUNC_DECL vec & operator-=(U scalar);
  127. template<typename U>
  128. GLM_FUNC_DECL vec & operator-=(vec<1, U, Q> const& v);
  129. template<typename U>
  130. GLM_FUNC_DECL vec & operator*=(U scalar);
  131. template<typename U>
  132. GLM_FUNC_DECL vec & operator*=(vec<1, U, Q> const& v);
  133. template<typename U>
  134. GLM_FUNC_DECL vec & operator/=(U scalar);
  135. template<typename U>
  136. GLM_FUNC_DECL vec & operator/=(vec<1, U, Q> const& v);
  137. // -- Increment and decrement operators --
  138. GLM_FUNC_DECL vec & operator++();
  139. GLM_FUNC_DECL vec & operator--();
  140. GLM_FUNC_DECL vec operator++(int);
  141. GLM_FUNC_DECL vec operator--(int);
  142. // -- Unary bit operators --
  143. template<typename U>
  144. GLM_FUNC_DECL vec & operator%=(U scalar);
  145. template<typename U>
  146. GLM_FUNC_DECL vec & operator%=(vec<1, U, Q> const& v);
  147. template<typename U>
  148. GLM_FUNC_DECL vec & operator&=(U scalar);
  149. template<typename U>
  150. GLM_FUNC_DECL vec & operator&=(vec<1, U, Q> const& v);
  151. template<typename U>
  152. GLM_FUNC_DECL vec & operator|=(U scalar);
  153. template<typename U>
  154. GLM_FUNC_DECL vec & operator|=(vec<1, U, Q> const& v);
  155. template<typename U>
  156. GLM_FUNC_DECL vec & operator^=(U scalar);
  157. template<typename U>
  158. GLM_FUNC_DECL vec & operator^=(vec<1, U, Q> const& v);
  159. template<typename U>
  160. GLM_FUNC_DECL vec & operator<<=(U scalar);
  161. template<typename U>
  162. GLM_FUNC_DECL vec & operator<<=(vec<1, U, Q> const& v);
  163. template<typename U>
  164. GLM_FUNC_DECL vec & operator>>=(U scalar);
  165. template<typename U>
  166. GLM_FUNC_DECL vec & operator>>=(vec<1, U, Q> const& v);
  167. };
  168. // -- Unary operators --
  169. template<typename T, qualifier Q>
  170. GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v);
  171. template<typename T, qualifier Q>
  172. GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v);
  173. // -- Binary operators --
  174. template<typename T, qualifier Q>
  175. GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar);
  176. template<typename T, qualifier Q>
  177. GLM_FUNC_DECL vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v);
  178. template<typename T, qualifier Q>
  179. GLM_FUNC_DECL vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  180. template<typename T, qualifier Q>
  181. GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar);
  182. template<typename T, qualifier Q>
  183. GLM_FUNC_DECL vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v);
  184. template<typename T, qualifier Q>
  185. GLM_FUNC_DECL vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  186. template<typename T, qualifier Q>
  187. GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar);
  188. template<typename T, qualifier Q>
  189. GLM_FUNC_DECL vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v);
  190. template<typename T, qualifier Q>
  191. GLM_FUNC_DECL vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  192. template<typename T, qualifier Q>
  193. GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar);
  194. template<typename T, qualifier Q>
  195. GLM_FUNC_DECL vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v);
  196. template<typename T, qualifier Q>
  197. GLM_FUNC_DECL vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  198. template<typename T, qualifier Q>
  199. GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar);
  200. template<typename T, qualifier Q>
  201. GLM_FUNC_DECL vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v);
  202. template<typename T, qualifier Q>
  203. GLM_FUNC_DECL vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  204. template<typename T, qualifier Q>
  205. GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar);
  206. template<typename T, qualifier Q>
  207. GLM_FUNC_DECL vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v);
  208. template<typename T, qualifier Q>
  209. GLM_FUNC_DECL vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  210. template<typename T, qualifier Q>
  211. GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar);
  212. template<typename T, qualifier Q>
  213. GLM_FUNC_DECL vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v);
  214. template<typename T, qualifier Q>
  215. GLM_FUNC_DECL vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  216. template<typename T, qualifier Q>
  217. GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar);
  218. template<typename T, qualifier Q>
  219. GLM_FUNC_DECL vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v);
  220. template<typename T, qualifier Q>
  221. GLM_FUNC_DECL vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  222. template<typename T, qualifier Q>
  223. GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar);
  224. template<typename T, qualifier Q>
  225. GLM_FUNC_DECL vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v);
  226. template<typename T, qualifier Q>
  227. GLM_FUNC_DECL vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  228. template<typename T, qualifier Q>
  229. GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar);
  230. template<typename T, qualifier Q>
  231. GLM_FUNC_DECL vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v);
  232. template<typename T, qualifier Q>
  233. GLM_FUNC_DECL vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  234. template<typename T, qualifier Q>
  235. GLM_FUNC_DECL vec<1, T, Q> operator~(vec<1, T, Q> const& v);
  236. // -- Boolean operators --
  237. template<typename T, qualifier Q>
  238. GLM_FUNC_DECL bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  239. template<typename T, qualifier Q>
  240. GLM_FUNC_DECL bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2);
  241. template<qualifier Q>
  242. GLM_FUNC_DECL vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);
  243. template<qualifier Q>
  244. GLM_FUNC_DECL vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2);
  245. /// 1 component vector of single-precision floating-point numbers using high precision arithmetic in term of ULPs.
  246. ///
  247. /// @see ext_vec1
  248. typedef vec<1, float, highp> highp_vec1;
  249. /// 1 component vector of single-precision floating-point numbers using medium precision arithmetic in term of ULPs.
  250. ///
  251. /// @see ext_vec1
  252. typedef vec<1, float, mediump> mediump_vec1;
  253. /// 1 component vector of single-precision floating-point numbers using low precision arithmetic in term of ULPs.
  254. ///
  255. /// @see ext_vec1
  256. typedef vec<1, float, lowp> lowp_vec1;
  257. /// 1 component vector of double-precision floating-point numbers using high precision arithmetic in term of ULPs.
  258. ///
  259. /// @see ext_vec1
  260. typedef vec<1, double, highp> highp_dvec1;
  261. /// 1 component vector of double-precision floating-point numbers using medium precision arithmetic in term of ULPs.
  262. ///
  263. /// @see ext_vec1
  264. typedef vec<1, double, mediump> mediump_dvec1;
  265. /// 1 component vector of double-precision floating-point numbers using low precision arithmetic in term of ULPs.
  266. ///
  267. /// @see ext_vec1
  268. typedef vec<1, double, lowp> lowp_dvec1;
  269. /// 1 component vector of signed integer numbers.
  270. ///
  271. /// @see ext_vec1
  272. typedef vec<1, int, highp> highp_ivec1;
  273. /// 1 component vector of signed integer numbers.
  274. ///
  275. /// @see ext_vec1
  276. typedef vec<1, int, mediump> mediump_ivec1;
  277. /// 1 component vector of signed integer numbers.
  278. ///
  279. /// @see ext_vec1
  280. typedef vec<1, int, lowp> lowp_ivec1;
  281. /// 1 component vector of unsigned integer numbers.
  282. ///
  283. /// @see ext_vec1
  284. typedef vec<1, uint, highp> highp_uvec1;
  285. /// 1 component vector of unsigned integer numbers.
  286. ///
  287. /// @see ext_vec1
  288. typedef vec<1, uint, mediump> mediump_uvec1;
  289. /// 1 component vector of unsigned integer numbers.
  290. ///
  291. /// @see ext_vec1
  292. typedef vec<1, uint, lowp> lowp_uvec1;
  293. /// 1 component vector of bool values.
  294. ///
  295. /// @see ext_vec1
  296. typedef vec<1, bool, highp> highp_bvec1;
  297. /// 1 component vector of bool values.
  298. ///
  299. /// @see ext_vec1
  300. typedef vec<1, bool, mediump> mediump_bvec1;
  301. /// 1 component vector of bool values.
  302. ///
  303. /// @see ext_vec1
  304. typedef vec<1, bool, lowp> lowp_bvec1;
  305. #if GLM_HAS_TEMPLATE_ALIASES
  306. template <typename T, qualifier Q = defaultp> using tvec1 = vec<1, T, Q>;
  307. #endif//GLM_HAS_TEMPLATE_ALIASES
  308. //////////////////////////
  309. // vec1 definition
  310. #if(defined(GLM_PRECISION_HIGHP_BOOL))
  311. typedef highp_bvec1 bvec1;
  312. #elif(defined(GLM_PRECISION_MEDIUMP_BOOL))
  313. typedef mediump_bvec1 bvec1;
  314. #elif(defined(GLM_PRECISION_LOWP_BOOL))
  315. typedef lowp_bvec1 bvec1;
  316. #else
  317. /// 1 component vector of boolean.
  318. /// @see gtc_vec1 extension.
  319. typedef highp_bvec1 bvec1;
  320. #endif//GLM_PRECISION
  321. #if(defined(GLM_PRECISION_HIGHP_FLOAT))
  322. typedef highp_vec1 vec1;
  323. #elif(defined(GLM_PRECISION_MEDIUMP_FLOAT))
  324. typedef mediump_vec1 vec1;
  325. #elif(defined(GLM_PRECISION_LOWP_FLOAT))
  326. typedef lowp_vec1 vec1;
  327. #else
  328. /// 1 component vector of floating-point numbers.
  329. /// @see gtc_vec1 extension.
  330. typedef highp_vec1 vec1;
  331. #endif//GLM_PRECISION
  332. #if(defined(GLM_PRECISION_HIGHP_DOUBLE))
  333. typedef highp_dvec1 dvec1;
  334. #elif(defined(GLM_PRECISION_MEDIUMP_DOUBLE))
  335. typedef mediump_dvec1 dvec1;
  336. #elif(defined(GLM_PRECISION_LOWP_DOUBLE))
  337. typedef lowp_dvec1 dvec1;
  338. #else
  339. /// 1 component vector of floating-point numbers.
  340. /// @see gtc_vec1 extension.
  341. typedef highp_dvec1 dvec1;
  342. #endif//GLM_PRECISION
  343. #if(defined(GLM_PRECISION_HIGHP_INT))
  344. typedef highp_ivec1 ivec1;
  345. #elif(defined(GLM_PRECISION_MEDIUMP_INT))
  346. typedef mediump_ivec1 ivec1;
  347. #elif(defined(GLM_PRECISION_LOWP_INT))
  348. typedef lowp_ivec1 ivec1;
  349. #else
  350. /// 1 component vector of signed integer numbers.
  351. /// @see gtc_vec1 extension.
  352. typedef highp_ivec1 ivec1;
  353. #endif//GLM_PRECISION
  354. #if(defined(GLM_PRECISION_HIGHP_UINT))
  355. typedef highp_uvec1 uvec1;
  356. #elif(defined(GLM_PRECISION_MEDIUMP_UINT))
  357. typedef mediump_uvec1 uvec1;
  358. #elif(defined(GLM_PRECISION_LOWP_UINT))
  359. typedef lowp_uvec1 uvec1;
  360. #else
  361. /// 1 component vector of unsigned integer numbers.
  362. /// @see gtc_vec1 extension.
  363. typedef highp_uvec1 uvec1;
  364. #endif//GLM_PRECISION
  365. /// @}
  366. }//namespace glm
  367. #ifndef GLM_EXTERNAL_TEMPLATE
  368. #include "../detail/type_vec1.inl"
  369. #endif//GLM_EXTERNAL_TEMPLATE