setup.hpp 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188
  1. #ifndef GLM_SETUP_INCLUDED
  2. #include <cassert>
  3. #include <cstddef>
  4. #define GLM_VERSION_MAJOR 1
  5. #define GLM_VERSION_MINOR 0
  6. #define GLM_VERSION_PATCH 0
  7. #define GLM_VERSION_REVISION 0 // Deprecated
  8. #define GLM_VERSION 1000 // Deprecated
  9. #define GLM_VERSION_MESSAGE "GLM: version 1.0.0"
  10. #define GLM_MAKE_API_VERSION(variant, major, minor, patch) \
  11. ((((uint32_t)(variant)) << 29U) | (((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch)))
  12. #define GLM_VERSION_COMPLETE GLM_MAKE_API_VERSION(0, GLM_VERSION_MAJOR, GLM_VERSION_MINOR, GLM_VERSION_PATCH)
  13. #define GLM_SETUP_INCLUDED GLM_VERSION
  14. #define GLM_GET_VERSION_VARIANT(version) ((uint32_t)(version) >> 29U)
  15. #define GLM_GET_VERSION_MAJOR(version) (((uint32_t)(version) >> 22U) & 0x7FU)
  16. #define GLM_GET_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU)
  17. #define GLM_GET_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU)
  18. ///////////////////////////////////////////////////////////////////////////////////
  19. // Active states
  20. #define GLM_DISABLE 0
  21. #define GLM_ENABLE 1
  22. ///////////////////////////////////////////////////////////////////////////////////
  23. // Messages
  24. #if defined(GLM_FORCE_MESSAGES)
  25. # define GLM_MESSAGES GLM_ENABLE
  26. #else
  27. # define GLM_MESSAGES GLM_DISABLE
  28. #endif
  29. ///////////////////////////////////////////////////////////////////////////////////
  30. // Detect the platform
  31. #include "../simd/platform.h"
  32. ///////////////////////////////////////////////////////////////////////////////////
  33. // Build model
  34. #if defined(_M_ARM64) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__)
  35. # define GLM_MODEL GLM_MODEL_64
  36. #elif defined(__i386__) || defined(__ppc__) || defined(__ILP32__) || defined(_M_ARM)
  37. # define GLM_MODEL GLM_MODEL_32
  38. #else
  39. # define GLM_MODEL GLM_MODEL_32
  40. #endif//
  41. #if !defined(GLM_MODEL) && GLM_COMPILER != 0
  42. # error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message."
  43. #endif//GLM_MODEL
  44. ///////////////////////////////////////////////////////////////////////////////////
  45. // C++ Version
  46. // User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14, GLM_FORCE_CXX17, GLM_FORCE_CXX2A
  47. #define GLM_LANG_CXX98_FLAG (1 << 1)
  48. #define GLM_LANG_CXX03_FLAG (1 << 2)
  49. #define GLM_LANG_CXX0X_FLAG (1 << 3)
  50. #define GLM_LANG_CXX11_FLAG (1 << 4)
  51. #define GLM_LANG_CXX14_FLAG (1 << 5)
  52. #define GLM_LANG_CXX17_FLAG (1 << 6)
  53. #define GLM_LANG_CXX20_FLAG (1 << 7)
  54. #define GLM_LANG_CXXMS_FLAG (1 << 8)
  55. #define GLM_LANG_CXXGNU_FLAG (1 << 9)
  56. #define GLM_LANG_CXX98 GLM_LANG_CXX98_FLAG
  57. #define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)
  58. #define GLM_LANG_CXX0X (GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG)
  59. #define GLM_LANG_CXX11 (GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG)
  60. #define GLM_LANG_CXX14 (GLM_LANG_CXX11 | GLM_LANG_CXX14_FLAG)
  61. #define GLM_LANG_CXX17 (GLM_LANG_CXX14 | GLM_LANG_CXX17_FLAG)
  62. #define GLM_LANG_CXX20 (GLM_LANG_CXX17 | GLM_LANG_CXX20_FLAG)
  63. #define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG
  64. #define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG
  65. #if (defined(_MSC_EXTENSIONS))
  66. # define GLM_LANG_EXT GLM_LANG_CXXMS_FLAG
  67. #elif ((GLM_COMPILER & (GLM_COMPILER_CLANG | GLM_COMPILER_GCC)) && (GLM_ARCH & GLM_ARCH_SIMD_BIT))
  68. # define GLM_LANG_EXT GLM_LANG_CXXMS_FLAG
  69. #else
  70. # define GLM_LANG_EXT 0
  71. #endif
  72. #if (defined(GLM_FORCE_CXX_UNKNOWN))
  73. # define GLM_LANG 0
  74. #elif defined(GLM_FORCE_CXX20)
  75. # define GLM_LANG (GLM_LANG_CXX20 | GLM_LANG_EXT)
  76. # define GLM_LANG_STL11_FORCED
  77. #elif defined(GLM_FORCE_CXX17)
  78. # define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT)
  79. # define GLM_LANG_STL11_FORCED
  80. #elif defined(GLM_FORCE_CXX14)
  81. # define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_EXT)
  82. # define GLM_LANG_STL11_FORCED
  83. #elif defined(GLM_FORCE_CXX11)
  84. # define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_EXT)
  85. # define GLM_LANG_STL11_FORCED
  86. #elif defined(GLM_FORCE_CXX03)
  87. # define GLM_LANG (GLM_LANG_CXX03 | GLM_LANG_EXT)
  88. #elif defined(GLM_FORCE_CXX98)
  89. # define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_EXT)
  90. #else
  91. # if GLM_COMPILER & GLM_COMPILER_VC && defined(_MSVC_LANG)
  92. # if GLM_COMPILER >= GLM_COMPILER_VC15_7
  93. # define GLM_LANG_PLATFORM _MSVC_LANG
  94. # elif GLM_COMPILER >= GLM_COMPILER_VC15
  95. # if _MSVC_LANG > 201402L
  96. # define GLM_LANG_PLATFORM 201402L
  97. # else
  98. # define GLM_LANG_PLATFORM _MSVC_LANG
  99. # endif
  100. # else
  101. # define GLM_LANG_PLATFORM 0
  102. # endif
  103. # else
  104. # define GLM_LANG_PLATFORM 0
  105. # endif
  106. # if __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L
  107. # define GLM_LANG (GLM_LANG_CXX20 | GLM_LANG_EXT)
  108. # elif __cplusplus == 201703L || GLM_LANG_PLATFORM == 201703L
  109. # define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT)
  110. # elif __cplusplus == 201402L || __cplusplus == 201406L || __cplusplus == 201500L || GLM_LANG_PLATFORM == 201402L
  111. # define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_EXT)
  112. # elif __cplusplus == 201103L || GLM_LANG_PLATFORM == 201103L
  113. # define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_EXT)
  114. # elif defined(__INTEL_CXX11_MODE__) || defined(_MSC_VER) || defined(__GXX_EXPERIMENTAL_CXX0X__)
  115. # define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_EXT)
  116. # elif __cplusplus == 199711L
  117. # define GLM_LANG (GLM_LANG_CXX98 | GLM_LANG_EXT)
  118. # else
  119. # define GLM_LANG (0 | GLM_LANG_EXT)
  120. # endif
  121. #endif
  122. ///////////////////////////////////////////////////////////////////////////////////
  123. // Has of C++ features
  124. // http://clang.llvm.org/cxx_status.html
  125. // http://gcc.gnu.org/projects/cxx0x.html
  126. // http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx
  127. // Android has multiple STLs but C++11 STL detection doesn't always work #284 #564
  128. #if GLM_PLATFORM == GLM_PLATFORM_ANDROID && !defined(GLM_LANG_STL11_FORCED)
  129. # define GLM_HAS_CXX11_STL 0
  130. #elif (GLM_COMPILER & GLM_COMPILER_CUDA_RTC) == GLM_COMPILER_CUDA_RTC
  131. # define GLM_HAS_CXX11_STL 0
  132. #elif (GLM_COMPILER & GLM_COMPILER_HIP)
  133. # define GLM_HAS_CXX11_STL 0
  134. #elif GLM_COMPILER & GLM_COMPILER_CLANG
  135. # if (defined(_LIBCPP_VERSION) || (GLM_LANG & GLM_LANG_CXX11_FLAG) || defined(GLM_LANG_STL11_FORCED))
  136. # define GLM_HAS_CXX11_STL 1
  137. # else
  138. # define GLM_HAS_CXX11_STL 0
  139. # endif
  140. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  141. # define GLM_HAS_CXX11_STL 1
  142. #else
  143. # define GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  144. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \
  145. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  146. ((GLM_PLATFORM != GLM_PLATFORM_WINDOWS) && (GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15))))
  147. #endif
  148. // N1720
  149. #if GLM_COMPILER & GLM_COMPILER_CLANG
  150. # define GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert)
  151. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  152. # define GLM_HAS_STATIC_ASSERT 1
  153. #else
  154. # define GLM_HAS_STATIC_ASSERT ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  155. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  156. ((GLM_COMPILER & GLM_COMPILER_VC)) || \
  157. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  158. #endif
  159. // N1988
  160. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  161. # define GLM_HAS_EXTENDED_INTEGER_TYPE 1
  162. #else
  163. # define GLM_HAS_EXTENDED_INTEGER_TYPE (\
  164. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC)) || \
  165. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  166. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG)) || \
  167. ((GLM_COMPILER & GLM_COMPILER_HIP)))
  168. #endif
  169. // N2672 Initializer lists http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm
  170. #if GLM_COMPILER & GLM_COMPILER_CLANG
  171. # define GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers)
  172. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  173. # define GLM_HAS_INITIALIZER_LISTS 1
  174. #else
  175. # define GLM_HAS_INITIALIZER_LISTS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  176. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \
  177. ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \
  178. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  179. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  180. #endif
  181. // N2544 Unrestricted unions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf
  182. #if GLM_COMPILER & GLM_COMPILER_CLANG
  183. # define GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions)
  184. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  185. # define GLM_HAS_UNRESTRICTED_UNIONS 1
  186. #else
  187. # define GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  188. (GLM_COMPILER & GLM_COMPILER_VC) || \
  189. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  190. ((GLM_COMPILER & GLM_COMPILER_HIP)))
  191. #endif
  192. // N2346
  193. #if GLM_COMPILER & GLM_COMPILER_CLANG
  194. # define GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions)
  195. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  196. # define GLM_HAS_DEFAULTED_FUNCTIONS 1
  197. #else
  198. # define GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  199. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  200. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  201. (GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  202. ((GLM_COMPILER & GLM_COMPILER_HIP)))
  203. #endif
  204. // N2118
  205. #if GLM_COMPILER & GLM_COMPILER_CLANG
  206. # define GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references)
  207. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  208. # define GLM_HAS_RVALUE_REFERENCES 1
  209. #else
  210. # define GLM_HAS_RVALUE_REFERENCES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  211. ((GLM_COMPILER & GLM_COMPILER_VC)) || \
  212. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  213. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  214. #endif
  215. // N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf
  216. #if GLM_COMPILER & GLM_COMPILER_CLANG
  217. # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions)
  218. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  219. # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1
  220. #else
  221. # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  222. ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \
  223. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  224. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  225. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  226. #endif
  227. // N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf
  228. #if GLM_COMPILER & GLM_COMPILER_CLANG
  229. # define GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates)
  230. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  231. # define GLM_HAS_TEMPLATE_ALIASES 1
  232. #else
  233. # define GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  234. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  235. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  236. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  237. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  238. #endif
  239. // N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html
  240. #if GLM_COMPILER & GLM_COMPILER_CLANG
  241. # define GLM_HAS_RANGE_FOR __has_feature(cxx_range_for)
  242. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  243. # define GLM_HAS_RANGE_FOR 1
  244. #else
  245. # define GLM_HAS_RANGE_FOR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  246. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  247. ((GLM_COMPILER & GLM_COMPILER_VC)) || \
  248. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  249. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  250. #endif
  251. // N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf
  252. #if GLM_COMPILER & GLM_COMPILER_CLANG
  253. # define GLM_HAS_ALIGNOF __has_feature(cxx_alignas)
  254. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  255. # define GLM_HAS_ALIGNOF 1
  256. #else
  257. # define GLM_HAS_ALIGNOF ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  258. ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)) || \
  259. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)) || \
  260. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  261. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  262. #endif
  263. // N2235 Generalized Constant Expressions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf
  264. // N3652 Extended Constant Expressions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html
  265. #if (GLM_ARCH & GLM_ARCH_SIMD_BIT) // Compiler SIMD intrinsics don't support constexpr...
  266. # define GLM_HAS_CONSTEXPR 0
  267. #elif (GLM_COMPILER & GLM_COMPILER_CLANG)
  268. # define GLM_HAS_CONSTEXPR __has_feature(cxx_relaxed_constexpr)
  269. #elif (GLM_LANG & GLM_LANG_CXX14_FLAG)
  270. # define GLM_HAS_CONSTEXPR 1
  271. #else
  272. # define GLM_HAS_CONSTEXPR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && GLM_HAS_INITIALIZER_LISTS && (\
  273. ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL17)) || \
  274. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15))))
  275. #endif
  276. #if GLM_HAS_CONSTEXPR
  277. # define GLM_CONSTEXPR constexpr
  278. #else
  279. # define GLM_CONSTEXPR
  280. #endif
  281. //
  282. #if GLM_HAS_CONSTEXPR
  283. # if (GLM_COMPILER & GLM_COMPILER_CLANG)
  284. # if __has_feature(cxx_if_constexpr)
  285. # define GLM_HAS_IF_CONSTEXPR 1
  286. # else
  287. # define GLM_HAS_IF_CONSTEXPR 0
  288. # endif
  289. # elif (GLM_LANG & GLM_LANG_CXX17_FLAG)
  290. # define GLM_HAS_IF_CONSTEXPR 1
  291. # else
  292. # define GLM_HAS_IF_CONSTEXPR 0
  293. # endif
  294. #else
  295. # define GLM_HAS_IF_CONSTEXPR 0
  296. #endif
  297. #if GLM_HAS_IF_CONSTEXPR
  298. # define GLM_IF_CONSTEXPR if constexpr
  299. #else
  300. # define GLM_IF_CONSTEXPR if
  301. #endif
  302. // [nodiscard]
  303. #if GLM_LANG & GLM_LANG_CXX17_FLAG
  304. # define GLM_NODISCARD [[nodiscard]]
  305. #else
  306. # define GLM_NODISCARD
  307. #endif
  308. //
  309. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  310. # define GLM_HAS_ASSIGNABLE 1
  311. #else
  312. # define GLM_HAS_ASSIGNABLE ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  313. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \
  314. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49))))
  315. #endif
  316. //
  317. #define GLM_HAS_TRIVIAL_QUERIES 0
  318. //
  319. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  320. # define GLM_HAS_MAKE_SIGNED 1
  321. #else
  322. # define GLM_HAS_MAKE_SIGNED ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  323. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  324. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  325. ((GLM_COMPILER & GLM_COMPILER_HIP))))
  326. #endif
  327. //
  328. #if defined(GLM_FORCE_INTRINSICS)
  329. # define GLM_HAS_BITSCAN_WINDOWS ((GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && (\
  330. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  331. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14) && (GLM_ARCH & GLM_ARCH_X86_BIT))))
  332. #else
  333. # define GLM_HAS_BITSCAN_WINDOWS 0
  334. #endif
  335. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  336. # define GLM_HAS_NOEXCEPT 1
  337. #else
  338. # define GLM_HAS_NOEXCEPT 0
  339. #endif
  340. #if GLM_HAS_NOEXCEPT
  341. # define GLM_NOEXCEPT noexcept
  342. #else
  343. # define GLM_NOEXCEPT
  344. #endif
  345. ///////////////////////////////////////////////////////////////////////////////////
  346. // OpenMP
  347. #ifdef _OPENMP
  348. # if GLM_COMPILER & GLM_COMPILER_GCC
  349. # if GLM_COMPILER >= GLM_COMPILER_GCC61
  350. # define GLM_HAS_OPENMP 45
  351. # elif GLM_COMPILER >= GLM_COMPILER_GCC49
  352. # define GLM_HAS_OPENMP 40
  353. # elif GLM_COMPILER >= GLM_COMPILER_GCC47
  354. # define GLM_HAS_OPENMP 31
  355. # else
  356. # define GLM_HAS_OPENMP 0
  357. # endif
  358. # elif GLM_COMPILER & GLM_COMPILER_CLANG
  359. # if GLM_COMPILER >= GLM_COMPILER_CLANG38
  360. # define GLM_HAS_OPENMP 31
  361. # else
  362. # define GLM_HAS_OPENMP 0
  363. # endif
  364. # elif GLM_COMPILER & GLM_COMPILER_VC
  365. # define GLM_HAS_OPENMP 20
  366. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  367. # if GLM_COMPILER >= GLM_COMPILER_INTEL16
  368. # define GLM_HAS_OPENMP 40
  369. # else
  370. # define GLM_HAS_OPENMP 0
  371. # endif
  372. # else
  373. # define GLM_HAS_OPENMP 0
  374. # endif
  375. #else
  376. # define GLM_HAS_OPENMP 0
  377. #endif
  378. ///////////////////////////////////////////////////////////////////////////////////
  379. // nullptr
  380. #if GLM_LANG & GLM_LANG_CXX0X_FLAG
  381. # define GLM_CONFIG_NULLPTR GLM_ENABLE
  382. #else
  383. # define GLM_CONFIG_NULLPTR GLM_DISABLE
  384. #endif
  385. #if GLM_CONFIG_NULLPTR == GLM_ENABLE
  386. # define GLM_NULLPTR nullptr
  387. #else
  388. # define GLM_NULLPTR 0
  389. #endif
  390. ///////////////////////////////////////////////////////////////////////////////////
  391. // Static assert
  392. #if GLM_HAS_STATIC_ASSERT
  393. # define GLM_STATIC_ASSERT(x, message) static_assert(x, message)
  394. #elif GLM_COMPILER & GLM_COMPILER_VC
  395. # define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1]
  396. #else
  397. # define GLM_STATIC_ASSERT(x, message) assert(x)
  398. #endif//GLM_LANG
  399. ///////////////////////////////////////////////////////////////////////////////////
  400. // Qualifiers
  401. // User defines: GLM_CUDA_FORCE_DEVICE_FUNC, GLM_CUDA_FORCE_HOST_FUNC
  402. #if (GLM_COMPILER & GLM_COMPILER_CUDA) || (GLM_COMPILER & GLM_COMPILER_HIP)
  403. # if defined(GLM_CUDA_FORCE_DEVICE_FUNC) && defined(GLM_CUDA_FORCE_HOST_FUNC)
  404. # error "GLM error: GLM_CUDA_FORCE_DEVICE_FUNC and GLM_CUDA_FORCE_HOST_FUNC should not be defined at the same time, GLM by default generates both device and host code for CUDA compiler."
  405. # endif//defined(GLM_CUDA_FORCE_DEVICE_FUNC) && defined(GLM_CUDA_FORCE_HOST_FUNC)
  406. # if defined(GLM_CUDA_FORCE_DEVICE_FUNC)
  407. # define GLM_CUDA_FUNC_DEF __device__
  408. # define GLM_CUDA_FUNC_DECL __device__
  409. # elif defined(GLM_CUDA_FORCE_HOST_FUNC)
  410. # define GLM_CUDA_FUNC_DEF __host__
  411. # define GLM_CUDA_FUNC_DECL __host__
  412. # else
  413. # define GLM_CUDA_FUNC_DEF __device__ __host__
  414. # define GLM_CUDA_FUNC_DECL __device__ __host__
  415. # endif//defined(GLM_CUDA_FORCE_XXXX_FUNC)
  416. #else
  417. # define GLM_CUDA_FUNC_DEF
  418. # define GLM_CUDA_FUNC_DECL
  419. #endif
  420. #if defined(GLM_FORCE_INLINE)
  421. # if GLM_COMPILER & GLM_COMPILER_VC
  422. # define GLM_INLINE __forceinline
  423. # define GLM_NEVER_INLINE __declspec(noinline)
  424. # elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)
  425. # define GLM_INLINE inline __attribute__((__always_inline__))
  426. # define GLM_NEVER_INLINE __attribute__((__noinline__))
  427. # elif (GLM_COMPILER & GLM_COMPILER_CUDA) || (GLM_COMPILER & GLM_COMPILER_HIP)
  428. # define GLM_INLINE __forceinline__
  429. # define GLM_NEVER_INLINE __noinline__
  430. # else
  431. # define GLM_INLINE inline
  432. # define GLM_NEVER_INLINE
  433. # endif//GLM_COMPILER
  434. #else
  435. # define GLM_INLINE inline
  436. # define GLM_NEVER_INLINE
  437. #endif//defined(GLM_FORCE_INLINE)
  438. #define GLM_CTOR_DECL GLM_CUDA_FUNC_DECL GLM_CONSTEXPR
  439. #define GLM_FUNC_DISCARD_DECL GLM_CUDA_FUNC_DECL
  440. #define GLM_FUNC_DECL GLM_NODISCARD GLM_CUDA_FUNC_DECL
  441. #define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE
  442. // Do not use CUDA function qualifiers on CUDA compiler when functions are made default
  443. #if GLM_HAS_DEFAULTED_FUNCTIONS
  444. # define GLM_DEFAULTED_FUNC_DECL
  445. # define GLM_DEFAULTED_FUNC_QUALIFIER GLM_INLINE
  446. #else
  447. # define GLM_DEFAULTED_FUNC_DECL GLM_FUNC_DISCARD_DECL
  448. # define GLM_DEFAULTED_FUNC_QUALIFIER GLM_FUNC_QUALIFIER
  449. #endif//GLM_HAS_DEFAULTED_FUNCTIONS
  450. #if !defined(GLM_FORCE_CTOR_INIT)
  451. # define GLM_DEFAULTED_DEFAULT_CTOR_DECL GLM_CUDA_FUNC_DECL
  452. # define GLM_DEFAULTED_DEFAULT_CTOR_QUALIFIER GLM_DEFAULTED_FUNC_QUALIFIER
  453. #else
  454. # define GLM_DEFAULTED_DEFAULT_CTOR_DECL GLM_FUNC_DISCARD_DECL
  455. # define GLM_DEFAULTED_DEFAULT_CTOR_QUALIFIER GLM_FUNC_QUALIFIER
  456. #endif//GLM_FORCE_CTOR_INIT
  457. ///////////////////////////////////////////////////////////////////////////////////
  458. // Swizzle operators
  459. // User defines: GLM_FORCE_SWIZZLE
  460. #define GLM_SWIZZLE_DISABLED 0
  461. #define GLM_SWIZZLE_OPERATOR 1
  462. #define GLM_SWIZZLE_FUNCTION 2
  463. #if defined(GLM_SWIZZLE)
  464. # pragma message("GLM: GLM_SWIZZLE is deprecated, use GLM_FORCE_SWIZZLE instead.")
  465. # define GLM_FORCE_SWIZZLE
  466. #endif
  467. #if defined(GLM_FORCE_SWIZZLE) && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && !defined(GLM_FORCE_XYZW_ONLY)
  468. # define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_OPERATOR
  469. #elif defined(GLM_FORCE_SWIZZLE)
  470. # define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_FUNCTION
  471. #else
  472. # define GLM_CONFIG_SWIZZLE GLM_SWIZZLE_DISABLED
  473. #endif
  474. ///////////////////////////////////////////////////////////////////////////////////
  475. // Allows using not basic types as genType
  476. // #define GLM_FORCE_UNRESTRICTED_GENTYPE
  477. #ifdef GLM_FORCE_UNRESTRICTED_GENTYPE
  478. # define GLM_CONFIG_UNRESTRICTED_GENTYPE GLM_ENABLE
  479. #else
  480. # define GLM_CONFIG_UNRESTRICTED_GENTYPE GLM_DISABLE
  481. #endif
  482. ///////////////////////////////////////////////////////////////////////////////////
  483. // Allows using any scaler as float
  484. // #define GLM_FORCE_UNRESTRICTED_FLOAT
  485. #ifdef GLM_FORCE_UNRESTRICTED_FLOAT
  486. # define GLM_CONFIG_UNRESTRICTED_FLOAT GLM_ENABLE
  487. #else
  488. # define GLM_CONFIG_UNRESTRICTED_FLOAT GLM_DISABLE
  489. #endif
  490. ///////////////////////////////////////////////////////////////////////////////////
  491. // Clip control, define GLM_FORCE_DEPTH_ZERO_TO_ONE before including GLM
  492. // to use a clip space between 0 to 1.
  493. // Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM
  494. // to use left handed coordinate system by default.
  495. #define GLM_CLIP_CONTROL_ZO_BIT (1 << 0) // ZERO_TO_ONE
  496. #define GLM_CLIP_CONTROL_NO_BIT (1 << 1) // NEGATIVE_ONE_TO_ONE
  497. #define GLM_CLIP_CONTROL_LH_BIT (1 << 2) // LEFT_HANDED, For DirectX, Metal, Vulkan
  498. #define GLM_CLIP_CONTROL_RH_BIT (1 << 3) // RIGHT_HANDED, For OpenGL, default in GLM
  499. #define GLM_CLIP_CONTROL_LH_ZO (GLM_CLIP_CONTROL_LH_BIT | GLM_CLIP_CONTROL_ZO_BIT)
  500. #define GLM_CLIP_CONTROL_LH_NO (GLM_CLIP_CONTROL_LH_BIT | GLM_CLIP_CONTROL_NO_BIT)
  501. #define GLM_CLIP_CONTROL_RH_ZO (GLM_CLIP_CONTROL_RH_BIT | GLM_CLIP_CONTROL_ZO_BIT)
  502. #define GLM_CLIP_CONTROL_RH_NO (GLM_CLIP_CONTROL_RH_BIT | GLM_CLIP_CONTROL_NO_BIT)
  503. #ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE
  504. # ifdef GLM_FORCE_LEFT_HANDED
  505. # define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_LH_ZO
  506. # else
  507. # define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_RH_ZO
  508. # endif
  509. #else
  510. # ifdef GLM_FORCE_LEFT_HANDED
  511. # define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_LH_NO
  512. # else
  513. # define GLM_CONFIG_CLIP_CONTROL GLM_CLIP_CONTROL_RH_NO
  514. # endif
  515. #endif
  516. ///////////////////////////////////////////////////////////////////////////////////
  517. // Qualifiers
  518. #if (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))
  519. # define GLM_DEPRECATED __declspec(deprecated)
  520. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name
  521. #elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL)
  522. # define GLM_DEPRECATED __attribute__((__deprecated__))
  523. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment)))
  524. #elif (GLM_COMPILER & GLM_COMPILER_CUDA) || (GLM_COMPILER & GLM_COMPILER_HIP)
  525. # define GLM_DEPRECATED
  526. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x)
  527. #else
  528. # define GLM_DEPRECATED
  529. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name
  530. #endif
  531. ///////////////////////////////////////////////////////////////////////////////////
  532. #ifdef GLM_FORCE_EXPLICIT_CTOR
  533. # define GLM_EXPLICIT explicit
  534. #else
  535. # define GLM_EXPLICIT
  536. #endif
  537. ///////////////////////////////////////////////////////////////////////////////////
  538. // Length type: all length functions returns a length_t type.
  539. // When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise
  540. // length_t is a typedef of int like GLSL defines it.
  541. #define GLM_LENGTH_INT 1
  542. #define GLM_LENGTH_SIZE_T 2
  543. #ifdef GLM_FORCE_SIZE_T_LENGTH
  544. # define GLM_CONFIG_LENGTH_TYPE GLM_LENGTH_SIZE_T
  545. # define GLM_ASSERT_LENGTH(l, max) (assert ((l) < (max)))
  546. #else
  547. # define GLM_CONFIG_LENGTH_TYPE GLM_LENGTH_INT
  548. # define GLM_ASSERT_LENGTH(l, max) (assert ((l) >= 0 && (l) < (max)))
  549. #endif
  550. namespace glm
  551. {
  552. using std::size_t;
  553. # if GLM_CONFIG_LENGTH_TYPE == GLM_LENGTH_SIZE_T
  554. typedef size_t length_t;
  555. # else
  556. typedef int length_t;
  557. # endif
  558. }//namespace glm
  559. ///////////////////////////////////////////////////////////////////////////////////
  560. // constexpr
  561. #if GLM_HAS_CONSTEXPR
  562. # define GLM_CONFIG_CONSTEXP GLM_ENABLE
  563. namespace glm
  564. {
  565. template<typename T, std::size_t N>
  566. constexpr std::size_t countof(T const (&)[N])
  567. {
  568. return N;
  569. }
  570. }//namespace glm
  571. # define GLM_COUNTOF(arr) glm::countof(arr)
  572. #elif defined(_MSC_VER)
  573. # define GLM_CONFIG_CONSTEXP GLM_DISABLE
  574. # define GLM_COUNTOF(arr) _countof(arr)
  575. #else
  576. # define GLM_CONFIG_CONSTEXP GLM_DISABLE
  577. # define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0])
  578. #endif
  579. ///////////////////////////////////////////////////////////////////////////////////
  580. // uint
  581. namespace glm{
  582. namespace detail
  583. {
  584. template<typename T>
  585. struct is_int
  586. {
  587. enum test {value = 0};
  588. };
  589. template<>
  590. struct is_int<unsigned int>
  591. {
  592. enum test {value = ~0};
  593. };
  594. template<>
  595. struct is_int<signed int>
  596. {
  597. enum test {value = ~0};
  598. };
  599. }//namespace detail
  600. typedef unsigned int uint;
  601. }//namespace glm
  602. ///////////////////////////////////////////////////////////////////////////////////
  603. // 64-bit int
  604. #if GLM_HAS_EXTENDED_INTEGER_TYPE
  605. # include <cstdint>
  606. #endif
  607. namespace glm{
  608. namespace detail
  609. {
  610. # if GLM_HAS_EXTENDED_INTEGER_TYPE
  611. typedef std::uint64_t uint64;
  612. typedef std::int64_t int64;
  613. # elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available
  614. typedef uint64_t uint64;
  615. typedef int64_t int64;
  616. # elif GLM_COMPILER & GLM_COMPILER_VC
  617. typedef unsigned __int64 uint64;
  618. typedef signed __int64 int64;
  619. # elif GLM_COMPILER & GLM_COMPILER_GCC
  620. # pragma GCC diagnostic ignored "-Wlong-long"
  621. __extension__ typedef unsigned long long uint64;
  622. __extension__ typedef signed long long int64;
  623. # elif (GLM_COMPILER & GLM_COMPILER_CLANG)
  624. # pragma clang diagnostic ignored "-Wc++11-long-long"
  625. typedef unsigned long long uint64;
  626. typedef signed long long int64;
  627. # else//unknown compiler
  628. typedef unsigned long long uint64;
  629. typedef signed long long int64;
  630. # endif
  631. }//namespace detail
  632. }//namespace glm
  633. ///////////////////////////////////////////////////////////////////////////////////
  634. // make_unsigned
  635. #if GLM_HAS_MAKE_SIGNED
  636. # include <type_traits>
  637. namespace glm{
  638. namespace detail
  639. {
  640. using std::make_unsigned;
  641. }//namespace detail
  642. }//namespace glm
  643. #else
  644. namespace glm{
  645. namespace detail
  646. {
  647. template<typename genType>
  648. struct make_unsigned
  649. {};
  650. template<>
  651. struct make_unsigned<char>
  652. {
  653. typedef unsigned char type;
  654. };
  655. template<>
  656. struct make_unsigned<signed char>
  657. {
  658. typedef unsigned char type;
  659. };
  660. template<>
  661. struct make_unsigned<short>
  662. {
  663. typedef unsigned short type;
  664. };
  665. template<>
  666. struct make_unsigned<int>
  667. {
  668. typedef unsigned int type;
  669. };
  670. template<>
  671. struct make_unsigned<long>
  672. {
  673. typedef unsigned long type;
  674. };
  675. template<>
  676. struct make_unsigned<int64>
  677. {
  678. typedef uint64 type;
  679. };
  680. template<>
  681. struct make_unsigned<unsigned char>
  682. {
  683. typedef unsigned char type;
  684. };
  685. template<>
  686. struct make_unsigned<unsigned short>
  687. {
  688. typedef unsigned short type;
  689. };
  690. template<>
  691. struct make_unsigned<unsigned int>
  692. {
  693. typedef unsigned int type;
  694. };
  695. template<>
  696. struct make_unsigned<unsigned long>
  697. {
  698. typedef unsigned long type;
  699. };
  700. template<>
  701. struct make_unsigned<uint64>
  702. {
  703. typedef uint64 type;
  704. };
  705. }//namespace detail
  706. }//namespace glm
  707. #endif
  708. ///////////////////////////////////////////////////////////////////////////////////
  709. // Only use x, y, z, w as vector type components
  710. #ifdef GLM_FORCE_XYZW_ONLY
  711. # define GLM_CONFIG_XYZW_ONLY GLM_ENABLE
  712. #else
  713. # define GLM_CONFIG_XYZW_ONLY GLM_DISABLE
  714. #endif
  715. ///////////////////////////////////////////////////////////////////////////////////
  716. // Configure the use of defaulted initialized types
  717. #define GLM_CTOR_INIT_DISABLE 0
  718. #define GLM_CTOR_INITIALIZER_LIST 1
  719. #define GLM_CTOR_INITIALISATION 2
  720. #if defined(GLM_FORCE_CTOR_INIT) && GLM_HAS_INITIALIZER_LISTS
  721. # define GLM_CONFIG_CTOR_INIT GLM_CTOR_INITIALIZER_LIST
  722. #elif defined(GLM_FORCE_CTOR_INIT) && !GLM_HAS_INITIALIZER_LISTS
  723. # define GLM_CONFIG_CTOR_INIT GLM_CTOR_INITIALISATION
  724. #else
  725. # define GLM_CONFIG_CTOR_INIT GLM_CTOR_INIT_DISABLE
  726. #endif
  727. ///////////////////////////////////////////////////////////////////////////////////
  728. // Use SIMD instruction sets
  729. #if GLM_HAS_ALIGNOF && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && (GLM_ARCH & GLM_ARCH_SIMD_BIT)
  730. # define GLM_CONFIG_SIMD GLM_ENABLE
  731. #else
  732. # define GLM_CONFIG_SIMD GLM_DISABLE
  733. #endif
  734. ///////////////////////////////////////////////////////////////////////////////////
  735. // Configure the use of defaulted function
  736. #if GLM_HAS_DEFAULTED_FUNCTIONS
  737. # define GLM_CONFIG_DEFAULTED_FUNCTIONS GLM_ENABLE
  738. # define GLM_DEFAULT = default
  739. #else
  740. # define GLM_CONFIG_DEFAULTED_FUNCTIONS GLM_DISABLE
  741. # define GLM_DEFAULT
  742. #endif
  743. #if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INIT_DISABLE && GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_ENABLE
  744. # define GLM_CONFIG_DEFAULTED_DEFAULT_CTOR GLM_ENABLE
  745. # define GLM_DEFAULT_CTOR GLM_DEFAULT
  746. #else
  747. # define GLM_CONFIG_DEFAULTED_DEFAULT_CTOR GLM_DISABLE
  748. # define GLM_DEFAULT_CTOR
  749. #endif
  750. ///////////////////////////////////////////////////////////////////////////////////
  751. // Configure the use of aligned gentypes
  752. #ifdef GLM_FORCE_ALIGNED // Legacy define
  753. # define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
  754. #endif
  755. #ifdef GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
  756. # define GLM_FORCE_ALIGNED_GENTYPES
  757. #endif
  758. #if GLM_HAS_ALIGNOF && (GLM_LANG & GLM_LANG_CXXMS_FLAG) && (defined(GLM_FORCE_ALIGNED_GENTYPES) || (GLM_CONFIG_SIMD == GLM_ENABLE))
  759. # define GLM_CONFIG_ALIGNED_GENTYPES GLM_ENABLE
  760. #else
  761. # define GLM_CONFIG_ALIGNED_GENTYPES GLM_DISABLE
  762. #endif
  763. ///////////////////////////////////////////////////////////////////////////////////
  764. // Configure the use of anonymous structure as implementation detail
  765. #if ((GLM_CONFIG_SIMD == GLM_ENABLE) || (GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR) || (GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE))
  766. # define GLM_CONFIG_ANONYMOUS_STRUCT GLM_ENABLE
  767. #else
  768. # define GLM_CONFIG_ANONYMOUS_STRUCT GLM_DISABLE
  769. #endif
  770. ///////////////////////////////////////////////////////////////////////////////////
  771. // Silent warnings
  772. #ifdef GLM_FORCE_WARNINGS
  773. # define GLM_SILENT_WARNINGS GLM_DISABLE
  774. #else
  775. # define GLM_SILENT_WARNINGS GLM_ENABLE
  776. #endif
  777. ///////////////////////////////////////////////////////////////////////////////////
  778. // Precision
  779. #define GLM_HIGHP 1
  780. #define GLM_MEDIUMP 2
  781. #define GLM_LOWP 3
  782. #if defined(GLM_FORCE_PRECISION_HIGHP_BOOL) || defined(GLM_PRECISION_HIGHP_BOOL)
  783. # define GLM_CONFIG_PRECISION_BOOL GLM_HIGHP
  784. #elif defined(GLM_FORCE_PRECISION_MEDIUMP_BOOL) || defined(GLM_PRECISION_MEDIUMP_BOOL)
  785. # define GLM_CONFIG_PRECISION_BOOL GLM_MEDIUMP
  786. #elif defined(GLM_FORCE_PRECISION_LOWP_BOOL) || defined(GLM_PRECISION_LOWP_BOOL)
  787. # define GLM_CONFIG_PRECISION_BOOL GLM_LOWP
  788. #else
  789. # define GLM_CONFIG_PRECISION_BOOL GLM_HIGHP
  790. #endif
  791. #if defined(GLM_FORCE_PRECISION_HIGHP_INT) || defined(GLM_PRECISION_HIGHP_INT)
  792. # define GLM_CONFIG_PRECISION_INT GLM_HIGHP
  793. #elif defined(GLM_FORCE_PRECISION_MEDIUMP_INT) || defined(GLM_PRECISION_MEDIUMP_INT)
  794. # define GLM_CONFIG_PRECISION_INT GLM_MEDIUMP
  795. #elif defined(GLM_FORCE_PRECISION_LOWP_INT) || defined(GLM_PRECISION_LOWP_INT)
  796. # define GLM_CONFIG_PRECISION_INT GLM_LOWP
  797. #else
  798. # define GLM_CONFIG_PRECISION_INT GLM_HIGHP
  799. #endif
  800. #if defined(GLM_FORCE_PRECISION_HIGHP_UINT) || defined(GLM_PRECISION_HIGHP_UINT)
  801. # define GLM_CONFIG_PRECISION_UINT GLM_HIGHP
  802. #elif defined(GLM_FORCE_PRECISION_MEDIUMP_UINT) || defined(GLM_PRECISION_MEDIUMP_UINT)
  803. # define GLM_CONFIG_PRECISION_UINT GLM_MEDIUMP
  804. #elif defined(GLM_FORCE_PRECISION_LOWP_UINT) || defined(GLM_PRECISION_LOWP_UINT)
  805. # define GLM_CONFIG_PRECISION_UINT GLM_LOWP
  806. #else
  807. # define GLM_CONFIG_PRECISION_UINT GLM_HIGHP
  808. #endif
  809. #if defined(GLM_FORCE_PRECISION_HIGHP_FLOAT) || defined(GLM_PRECISION_HIGHP_FLOAT)
  810. # define GLM_CONFIG_PRECISION_FLOAT GLM_HIGHP
  811. #elif defined(GLM_FORCE_PRECISION_MEDIUMP_FLOAT) || defined(GLM_PRECISION_MEDIUMP_FLOAT)
  812. # define GLM_CONFIG_PRECISION_FLOAT GLM_MEDIUMP
  813. #elif defined(GLM_FORCE_PRECISION_LOWP_FLOAT) || defined(GLM_PRECISION_LOWP_FLOAT)
  814. # define GLM_CONFIG_PRECISION_FLOAT GLM_LOWP
  815. #else
  816. # define GLM_CONFIG_PRECISION_FLOAT GLM_HIGHP
  817. #endif
  818. #if defined(GLM_FORCE_PRECISION_HIGHP_DOUBLE) || defined(GLM_PRECISION_HIGHP_DOUBLE)
  819. # define GLM_CONFIG_PRECISION_DOUBLE GLM_HIGHP
  820. #elif defined(GLM_FORCE_PRECISION_MEDIUMP_DOUBLE) || defined(GLM_PRECISION_MEDIUMP_DOUBLE)
  821. # define GLM_CONFIG_PRECISION_DOUBLE GLM_MEDIUMP
  822. #elif defined(GLM_FORCE_PRECISION_LOWP_DOUBLE) || defined(GLM_PRECISION_LOWP_DOUBLE)
  823. # define GLM_CONFIG_PRECISION_DOUBLE GLM_LOWP
  824. #else
  825. # define GLM_CONFIG_PRECISION_DOUBLE GLM_HIGHP
  826. #endif
  827. ///////////////////////////////////////////////////////////////////////////////////
  828. // Check inclusions of different versions of GLM
  829. #elif ((GLM_SETUP_INCLUDED != GLM_VERSION) && !defined(GLM_FORCE_IGNORE_VERSION))
  830. # error "GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error."
  831. #elif GLM_SETUP_INCLUDED == GLM_VERSION
  832. ///////////////////////////////////////////////////////////////////////////////////
  833. // Messages
  834. #if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_MESSAGE_DISPLAYED)
  835. # define GLM_MESSAGE_DISPLAYED
  836. # define GLM_STR_HELPER(x) #x
  837. # define GLM_STR(x) GLM_STR_HELPER(x)
  838. // Report GLM version
  839. # pragma message (GLM_STR(GLM_VERSION_MESSAGE))
  840. // Report C++ language
  841. # if (GLM_LANG & GLM_LANG_CXX20_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  842. # pragma message("GLM: C++ 20 with extensions")
  843. # elif (GLM_LANG & GLM_LANG_CXX20_FLAG)
  844. # pragma message("GLM: C++ 2A")
  845. # elif (GLM_LANG & GLM_LANG_CXX17_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  846. # pragma message("GLM: C++ 17 with extensions")
  847. # elif (GLM_LANG & GLM_LANG_CXX17_FLAG)
  848. # pragma message("GLM: C++ 17")
  849. # elif (GLM_LANG & GLM_LANG_CXX14_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  850. # pragma message("GLM: C++ 14 with extensions")
  851. # elif (GLM_LANG & GLM_LANG_CXX14_FLAG)
  852. # pragma message("GLM: C++ 14")
  853. # elif (GLM_LANG & GLM_LANG_CXX11_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  854. # pragma message("GLM: C++ 11 with extensions")
  855. # elif (GLM_LANG & GLM_LANG_CXX11_FLAG)
  856. # pragma message("GLM: C++ 11")
  857. # elif (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  858. # pragma message("GLM: C++ 0x with extensions")
  859. # elif (GLM_LANG & GLM_LANG_CXX0X_FLAG)
  860. # pragma message("GLM: C++ 0x")
  861. # elif (GLM_LANG & GLM_LANG_CXX03_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  862. # pragma message("GLM: C++ 03 with extensions")
  863. # elif (GLM_LANG & GLM_LANG_CXX03_FLAG)
  864. # pragma message("GLM: C++ 03")
  865. # elif (GLM_LANG & GLM_LANG_CXX98_FLAG) && (GLM_LANG & GLM_LANG_EXT)
  866. # pragma message("GLM: C++ 98 with extensions")
  867. # elif (GLM_LANG & GLM_LANG_CXX98_FLAG)
  868. # pragma message("GLM: C++ 98")
  869. # else
  870. # pragma message("GLM: C++ language undetected")
  871. # endif//GLM_LANG
  872. // Report compiler detection
  873. # if GLM_COMPILER & GLM_COMPILER_CUDA
  874. # pragma message("GLM: CUDA compiler detected")
  875. # elif GLM_COMPILER & GLM_COMPILER_HIP
  876. # pragma message("GLM: HIP compiler detected")
  877. # elif GLM_COMPILER & GLM_COMPILER_VC
  878. # pragma message("GLM: Visual C++ compiler detected")
  879. # elif GLM_COMPILER & GLM_COMPILER_CLANG
  880. # pragma message("GLM: Clang compiler detected")
  881. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  882. # pragma message("GLM: Intel Compiler detected")
  883. # elif GLM_COMPILER & GLM_COMPILER_GCC
  884. # pragma message("GLM: GCC compiler detected")
  885. # else
  886. # pragma message("GLM: Compiler not detected")
  887. # endif
  888. // Report build target
  889. # if (GLM_ARCH & GLM_ARCH_AVX2_BIT) && (GLM_MODEL == GLM_MODEL_64)
  890. # pragma message("GLM: x86 64 bits with AVX2 instruction set build target")
  891. # elif (GLM_ARCH & GLM_ARCH_AVX2_BIT) && (GLM_MODEL == GLM_MODEL_32)
  892. # pragma message("GLM: x86 32 bits with AVX2 instruction set build target")
  893. # elif (GLM_ARCH & GLM_ARCH_AVX_BIT) && (GLM_MODEL == GLM_MODEL_64)
  894. # pragma message("GLM: x86 64 bits with AVX instruction set build target")
  895. # elif (GLM_ARCH & GLM_ARCH_AVX_BIT) && (GLM_MODEL == GLM_MODEL_32)
  896. # pragma message("GLM: x86 32 bits with AVX instruction set build target")
  897. # elif (GLM_ARCH & GLM_ARCH_SSE42_BIT) && (GLM_MODEL == GLM_MODEL_64)
  898. # pragma message("GLM: x86 64 bits with SSE4.2 instruction set build target")
  899. # elif (GLM_ARCH & GLM_ARCH_SSE42_BIT) && (GLM_MODEL == GLM_MODEL_32)
  900. # pragma message("GLM: x86 32 bits with SSE4.2 instruction set build target")
  901. # elif (GLM_ARCH & GLM_ARCH_SSE41_BIT) && (GLM_MODEL == GLM_MODEL_64)
  902. # pragma message("GLM: x86 64 bits with SSE4.1 instruction set build target")
  903. # elif (GLM_ARCH & GLM_ARCH_SSE41_BIT) && (GLM_MODEL == GLM_MODEL_32)
  904. # pragma message("GLM: x86 32 bits with SSE4.1 instruction set build target")
  905. # elif (GLM_ARCH & GLM_ARCH_SSSE3_BIT) && (GLM_MODEL == GLM_MODEL_64)
  906. # pragma message("GLM: x86 64 bits with SSSE3 instruction set build target")
  907. # elif (GLM_ARCH & GLM_ARCH_SSSE3_BIT) && (GLM_MODEL == GLM_MODEL_32)
  908. # pragma message("GLM: x86 32 bits with SSSE3 instruction set build target")
  909. # elif (GLM_ARCH & GLM_ARCH_SSE3_BIT) && (GLM_MODEL == GLM_MODEL_64)
  910. # pragma message("GLM: x86 64 bits with SSE3 instruction set build target")
  911. # elif (GLM_ARCH & GLM_ARCH_SSE3_BIT) && (GLM_MODEL == GLM_MODEL_32)
  912. # pragma message("GLM: x86 32 bits with SSE3 instruction set build target")
  913. # elif (GLM_ARCH & GLM_ARCH_SSE2_BIT) && (GLM_MODEL == GLM_MODEL_64)
  914. # pragma message("GLM: x86 64 bits with SSE2 instruction set build target")
  915. # elif (GLM_ARCH & GLM_ARCH_SSE2_BIT) && (GLM_MODEL == GLM_MODEL_32)
  916. # pragma message("GLM: x86 32 bits with SSE2 instruction set build target")
  917. # elif (GLM_ARCH & GLM_ARCH_X86_BIT) && (GLM_MODEL == GLM_MODEL_64)
  918. # pragma message("GLM: x86 64 bits build target")
  919. # elif (GLM_ARCH & GLM_ARCH_X86_BIT) && (GLM_MODEL == GLM_MODEL_32)
  920. # pragma message("GLM: x86 32 bits build target")
  921. # elif (GLM_ARCH & GLM_ARCH_NEON_BIT) && (GLM_MODEL == GLM_MODEL_64)
  922. # pragma message("GLM: ARM 64 bits with Neon instruction set build target")
  923. # elif (GLM_ARCH & GLM_ARCH_NEON_BIT) && (GLM_MODEL == GLM_MODEL_32)
  924. # pragma message("GLM: ARM 32 bits with Neon instruction set build target")
  925. # elif (GLM_ARCH & GLM_ARCH_ARM_BIT) && (GLM_MODEL == GLM_MODEL_64)
  926. # pragma message("GLM: ARM 64 bits build target")
  927. # elif (GLM_ARCH & GLM_ARCH_ARM_BIT) && (GLM_MODEL == GLM_MODEL_32)
  928. # pragma message("GLM: ARM 32 bits build target")
  929. # elif (GLM_ARCH & GLM_ARCH_MIPS_BIT) && (GLM_MODEL == GLM_MODEL_64)
  930. # pragma message("GLM: MIPS 64 bits build target")
  931. # elif (GLM_ARCH & GLM_ARCH_MIPS_BIT) && (GLM_MODEL == GLM_MODEL_32)
  932. # pragma message("GLM: MIPS 32 bits build target")
  933. # elif (GLM_ARCH & GLM_ARCH_PPC_BIT) && (GLM_MODEL == GLM_MODEL_64)
  934. # pragma message("GLM: PowerPC 64 bits build target")
  935. # elif (GLM_ARCH & GLM_ARCH_PPC_BIT) && (GLM_MODEL == GLM_MODEL_32)
  936. # pragma message("GLM: PowerPC 32 bits build target")
  937. # else
  938. # pragma message("GLM: Unknown build target")
  939. # endif//GLM_ARCH
  940. // Report platform name
  941. # if(GLM_PLATFORM & GLM_PLATFORM_QNXNTO)
  942. # pragma message("GLM: QNX platform detected")
  943. //# elif(GLM_PLATFORM & GLM_PLATFORM_IOS)
  944. //# pragma message("GLM: iOS platform detected")
  945. # elif(GLM_PLATFORM & GLM_PLATFORM_APPLE)
  946. # pragma message("GLM: Apple platform detected")
  947. # elif(GLM_PLATFORM & GLM_PLATFORM_WINCE)
  948. # pragma message("GLM: WinCE platform detected")
  949. # elif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS)
  950. # pragma message("GLM: Windows platform detected")
  951. # elif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL)
  952. # pragma message("GLM: Native Client detected")
  953. # elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
  954. # pragma message("GLM: Android platform detected")
  955. # elif(GLM_PLATFORM & GLM_PLATFORM_LINUX)
  956. # pragma message("GLM: Linux platform detected")
  957. # elif(GLM_PLATFORM & GLM_PLATFORM_UNIX)
  958. # pragma message("GLM: UNIX platform detected")
  959. # elif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN)
  960. # pragma message("GLM: platform unknown")
  961. # else
  962. # pragma message("GLM: platform not detected")
  963. # endif
  964. // Report whether only xyzw component are used
  965. # if defined GLM_FORCE_XYZW_ONLY
  966. # pragma message("GLM: GLM_FORCE_XYZW_ONLY is defined. Only x, y, z and w component are available in vector type. This define disables swizzle operators and SIMD instruction sets.")
  967. # endif
  968. // Report swizzle operator support
  969. # if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR
  970. # pragma message("GLM: GLM_FORCE_SWIZZLE is defined, swizzling operators enabled.")
  971. # elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION
  972. # pragma message("GLM: GLM_FORCE_SWIZZLE is defined, swizzling functions enabled. Enable compiler C++ language extensions to enable swizzle operators.")
  973. # else
  974. # pragma message("GLM: GLM_FORCE_SWIZZLE is undefined. swizzling functions or operators are disabled.")
  975. # endif
  976. // Report .length() type
  977. # if GLM_CONFIG_LENGTH_TYPE == GLM_LENGTH_SIZE_T
  978. # pragma message("GLM: GLM_FORCE_SIZE_T_LENGTH is defined. .length() returns a glm::length_t, a typedef of std::size_t.")
  979. # else
  980. # pragma message("GLM: GLM_FORCE_SIZE_T_LENGTH is undefined. .length() returns a glm::length_t, a typedef of int following GLSL.")
  981. # endif
  982. # if GLM_CONFIG_UNRESTRICTED_GENTYPE == GLM_ENABLE
  983. # pragma message("GLM: GLM_FORCE_UNRESTRICTED_GENTYPE is defined. Removes GLSL restrictions on valid function genTypes.")
  984. # else
  985. # pragma message("GLM: GLM_FORCE_UNRESTRICTED_GENTYPE is undefined. Follows strictly GLSL on valid function genTypes.")
  986. # endif
  987. # if GLM_SILENT_WARNINGS == GLM_ENABLE
  988. # pragma message("GLM: GLM_FORCE_SILENT_WARNINGS is defined. Ignores C++ warnings from using C++ language extensions.")
  989. # else
  990. # pragma message("GLM: GLM_FORCE_SILENT_WARNINGS is undefined. Shows C++ warnings from using C++ language extensions.")
  991. # endif
  992. # ifdef GLM_FORCE_SINGLE_ONLY
  993. # pragma message("GLM: GLM_FORCE_SINGLE_ONLY is defined. Using only single precision floating-point types.")
  994. # endif
  995. # if defined(GLM_FORCE_ALIGNED_GENTYPES) && (GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE)
  996. # undef GLM_FORCE_ALIGNED_GENTYPES
  997. # pragma message("GLM: GLM_FORCE_ALIGNED_GENTYPES is defined, allowing aligned types. This prevents the use of C++ constexpr.")
  998. # elif defined(GLM_FORCE_ALIGNED_GENTYPES) && (GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE)
  999. # undef GLM_FORCE_ALIGNED_GENTYPES
  1000. # pragma message("GLM: GLM_FORCE_ALIGNED_GENTYPES is defined but is disabled. It requires C++11 and language extensions.")
  1001. # endif
  1002. # if defined(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES)
  1003. # if GLM_CONFIG_ALIGNED_GENTYPES == GLM_DISABLE
  1004. # undef GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
  1005. # pragma message("GLM: GLM_FORCE_DEFAULT_ALIGNED_GENTYPES is defined but is disabled. It requires C++11 and language extensions.")
  1006. # elif GLM_CONFIG_ALIGNED_GENTYPES == GLM_ENABLE
  1007. # pragma message("GLM: GLM_FORCE_DEFAULT_ALIGNED_GENTYPES is defined. All gentypes (e.g. vec3) will be aligned and padded by default.")
  1008. # endif
  1009. # endif
  1010. # if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_ZO_BIT
  1011. # pragma message("GLM: GLM_FORCE_DEPTH_ZERO_TO_ONE is defined. Using zero to one depth clip space.")
  1012. # else
  1013. # pragma message("GLM: GLM_FORCE_DEPTH_ZERO_TO_ONE is undefined. Using negative one to one depth clip space.")
  1014. # endif
  1015. # if GLM_CONFIG_CLIP_CONTROL & GLM_CLIP_CONTROL_LH_BIT
  1016. # pragma message("GLM: GLM_FORCE_LEFT_HANDED is defined. Using left handed coordinate system.")
  1017. # else
  1018. # pragma message("GLM: GLM_FORCE_LEFT_HANDED is undefined. Using right handed coordinate system.")
  1019. # endif
  1020. #endif//GLM_MESSAGES
  1021. #endif//GLM_SETUP_INCLUDED