setup.hpp 40 KB

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