1 #pragma once 2 3 /////////////////////////////////////////////////////////////////////////////////// 4 // Platform 5 6 #define GLM_PLATFORM_UNKNOWN 0x00000000 7 #define GLM_PLATFORM_WINDOWS 0x00010000 8 #define GLM_PLATFORM_LINUX 0x00020000 9 #define GLM_PLATFORM_APPLE 0x00040000 10 //#define GLM_PLATFORM_IOS 0x00080000 11 #define GLM_PLATFORM_ANDROID 0x00100000 12 #define GLM_PLATFORM_CHROME_NACL 0x00200000 13 #define GLM_PLATFORM_UNIX 0x00400000 14 #define GLM_PLATFORM_QNXNTO 0x00800000 15 #define GLM_PLATFORM_WINCE 0x01000000 16 #define GLM_PLATFORM_CYGWIN 0x02000000 17 18 #ifdef GLM_FORCE_PLATFORM_UNKNOWN 19 # define GLM_PLATFORM GLM_PLATFORM_UNKNOWN 20 #elif defined(__CYGWIN__) 21 # define GLM_PLATFORM GLM_PLATFORM_CYGWIN 22 #elif defined(__QNXNTO__) 23 # define GLM_PLATFORM GLM_PLATFORM_QNXNTO 24 #elif defined(__APPLE__) 25 # define GLM_PLATFORM GLM_PLATFORM_APPLE 26 #elif defined(WINCE) 27 # define GLM_PLATFORM GLM_PLATFORM_WINCE 28 #elif defined(_WIN32) 29 # define GLM_PLATFORM GLM_PLATFORM_WINDOWS 30 #elif defined(__native_client__) 31 # define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL 32 #elif defined(__ANDROID__) 33 # define GLM_PLATFORM GLM_PLATFORM_ANDROID 34 #elif defined(__linux) 35 # define GLM_PLATFORM GLM_PLATFORM_LINUX 36 #elif defined(__unix) 37 # define GLM_PLATFORM GLM_PLATFORM_UNIX 38 #else 39 # define GLM_PLATFORM GLM_PLATFORM_UNKNOWN 40 #endif// 41 42 /////////////////////////////////////////////////////////////////////////////////// 43 // Compiler 44 45 #define GLM_COMPILER_UNKNOWN 0x00000000 46 47 // Intel 48 #define GLM_COMPILER_INTEL 0x00100000 49 #define GLM_COMPILER_INTEL14 0x00100040 50 #define GLM_COMPILER_INTEL15 0x00100050 51 #define GLM_COMPILER_INTEL16 0x00100060 52 #define GLM_COMPILER_INTEL17 0x00100070 53 54 // Visual C++ defines 55 #define GLM_COMPILER_VC 0x01000000 56 #define GLM_COMPILER_VC12 0x01000001 57 #define GLM_COMPILER_VC14 0x01000002 58 #define GLM_COMPILER_VC15 0x01000003 59 #define GLM_COMPILER_VC15_3 0x01000004 60 #define GLM_COMPILER_VC15_5 0x01000005 61 #define GLM_COMPILER_VC15_6 0x01000006 62 #define GLM_COMPILER_VC15_7 0x01000007 63 64 // GCC defines 65 #define GLM_COMPILER_GCC 0x02000000 66 #define GLM_COMPILER_GCC46 0x020000D0 67 #define GLM_COMPILER_GCC47 0x020000E0 68 #define GLM_COMPILER_GCC48 0x020000F0 69 #define GLM_COMPILER_GCC49 0x02000100 70 #define GLM_COMPILER_GCC5 0x02000200 71 #define GLM_COMPILER_GCC6 0x02000300 72 #define GLM_COMPILER_GCC7 0x02000400 73 #define GLM_COMPILER_GCC8 0x02000500 74 75 // CUDA 76 #define GLM_COMPILER_CUDA 0x10000000 77 #define GLM_COMPILER_CUDA70 0x100000A0 78 #define GLM_COMPILER_CUDA75 0x100000B0 79 #define GLM_COMPILER_CUDA80 0x100000C0 80 81 // Clang 82 #define GLM_COMPILER_CLANG 0x20000000 83 #define GLM_COMPILER_CLANG34 0x20000050 84 #define GLM_COMPILER_CLANG35 0x20000060 85 #define GLM_COMPILER_CLANG36 0x20000070 86 #define GLM_COMPILER_CLANG37 0x20000080 87 #define GLM_COMPILER_CLANG38 0x20000090 88 #define GLM_COMPILER_CLANG39 0x200000A0 89 #define GLM_COMPILER_CLANG40 0x200000B0 90 #define GLM_COMPILER_CLANG41 0x200000C0 91 #define GLM_COMPILER_CLANG42 0x200000D0 92 93 // Build model 94 #define GLM_MODEL_32 0x00000010 95 #define GLM_MODEL_64 0x00000020 96 97 // Force generic C++ compiler 98 #ifdef GLM_FORCE_COMPILER_UNKNOWN 99 # define GLM_COMPILER GLM_COMPILER_UNKNOWN 100 101 #elif defined(__INTEL_COMPILER) 102 # if (__INTEL_COMPILER < 1400) 103 # error "GLM requires ICC 2013 SP1 or newer" 104 # elif __INTEL_COMPILER == 1400 105 # define GLM_COMPILER GLM_COMPILER_INTEL14 106 # elif __INTEL_COMPILER == 1500 107 # define GLM_COMPILER GLM_COMPILER_INTEL15 108 # elif __INTEL_COMPILER == 1600 109 # define GLM_COMPILER GLM_COMPILER_INTEL16 110 # elif __INTEL_COMPILER >= 1700 111 # define GLM_COMPILER GLM_COMPILER_INTEL17 112 # endif 113 114 // CUDA 115 #elif defined(__CUDACC__) 116 # if !defined(CUDA_VERSION) && !defined(GLM_FORCE_CUDA) 117 # include <cuda.h> // make sure version is defined since nvcc does not define it itself! 118 # endif 119 # if CUDA_VERSION < 7000 120 # error "GLM requires CUDA 7.0 or higher" 121 # elif (CUDA_VERSION >= 7000 && CUDA_VERSION < 7500) 122 # define GLM_COMPILER GLM_COMPILER_CUDA70 123 # elif (CUDA_VERSION >= 7500 && CUDA_VERSION < 8000) 124 # define GLM_COMPILER GLM_COMPILER_CUDA75 125 # elif (CUDA_VERSION >= 8000) 126 # define GLM_COMPILER GLM_COMPILER_CUDA80 127 # endif 128 129 // Clang 130 #elif defined(__clang__) 131 # if defined(__apple_build_version__) 132 # if (__clang_major__ < 6) 133 # error "GLM requires Clang 3.4 / Apple Clang 6.0 or higher" 134 # elif __clang_major__ == 6 && __clang_minor__ == 0 135 # define GLM_COMPILER GLM_COMPILER_CLANG35 136 # elif __clang_major__ == 6 && __clang_minor__ >= 1 137 # define GLM_COMPILER GLM_COMPILER_CLANG36 138 # elif __clang_major__ >= 7 139 # define GLM_COMPILER GLM_COMPILER_CLANG37 140 # endif 141 # else 142 # if ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3) 143 # error "GLM requires Clang 3.4 or higher" 144 # elif __clang_major__ == 3 && __clang_minor__ == 4 145 # define GLM_COMPILER GLM_COMPILER_CLANG34 146 # elif __clang_major__ == 3 && __clang_minor__ == 5 147 # define GLM_COMPILER GLM_COMPILER_CLANG35 148 # elif __clang_major__ == 3 && __clang_minor__ == 6 149 # define GLM_COMPILER GLM_COMPILER_CLANG36 150 # elif __clang_major__ == 3 && __clang_minor__ == 7 151 # define GLM_COMPILER GLM_COMPILER_CLANG37 152 # elif __clang_major__ == 3 && __clang_minor__ == 8 153 # define GLM_COMPILER GLM_COMPILER_CLANG38 154 # elif __clang_major__ == 3 && __clang_minor__ >= 9 155 # define GLM_COMPILER GLM_COMPILER_CLANG39 156 # elif __clang_major__ == 4 && __clang_minor__ == 0 157 # define GLM_COMPILER GLM_COMPILER_CLANG40 158 # elif __clang_major__ == 4 && __clang_minor__ == 1 159 # define GLM_COMPILER GLM_COMPILER_CLANG41 160 # elif __clang_major__ == 4 && __clang_minor__ >= 2 161 # define GLM_COMPILER GLM_COMPILER_CLANG42 162 # elif __clang_major__ >= 4 163 # define GLM_COMPILER GLM_COMPILER_CLANG42 164 # endif 165 # endif 166 167 // Visual C++ 168 #elif defined(_MSC_VER) 169 # if _MSC_VER < 1800 170 # error "GLM requires Visual C++ 12 - 2013 or higher" 171 # elif _MSC_VER == 1800 172 # define GLM_COMPILER GLM_COMPILER_VC12 173 # elif _MSC_VER == 1900 174 # define GLM_COMPILER GLM_COMPILER_VC14 175 # elif _MSC_VER == 1910 176 # define GLM_COMPILER GLM_COMPILER_VC15 177 # elif _MSC_VER == 1911 178 # define GLM_COMPILER GLM_COMPILER_VC15_3 179 # elif _MSC_VER == 1912 180 # define GLM_COMPILER GLM_COMPILER_VC15_5 181 # elif _MSC_VER == 1913 182 # define GLM_COMPILER GLM_COMPILER_VC15_6 183 # elif _MSC_VER >= 1914 184 # define GLM_COMPILER GLM_COMPILER_VC15_7 185 # endif//_MSC_VER 186 187 // G++ 188 #elif defined(__GNUC__) || defined(__MINGW32__) 189 # if ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4) 190 # error "GLM requires GCC 4.7 or higher" 191 # elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6) 192 # define GLM_COMPILER (GLM_COMPILER_GCC46) 193 # elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7) 194 # define GLM_COMPILER (GLM_COMPILER_GCC47) 195 # elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) 196 # define GLM_COMPILER (GLM_COMPILER_GCC48) 197 # elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) 198 # define GLM_COMPILER (GLM_COMPILER_GCC49) 199 # elif (__GNUC__ == 5) 200 # define GLM_COMPILER (GLM_COMPILER_GCC5) 201 # elif (__GNUC__ == 6) 202 # define GLM_COMPILER (GLM_COMPILER_GCC6) 203 # elif (__GNUC__ == 7) 204 # define GLM_COMPILER (GLM_COMPILER_GCC7) 205 # elif (__GNUC__ >= 8) 206 # define GLM_COMPILER (GLM_COMPILER_GCC8) 207 # endif 208 209 #else 210 # define GLM_COMPILER GLM_COMPILER_UNKNOWN 211 #endif 212 213 #ifndef GLM_COMPILER 214 # error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message." 215 #endif//GLM_COMPILER 216 217 /////////////////////////////////////////////////////////////////////////////////// 218 // Instruction sets 219 220 // User defines: GLM_FORCE_PURE GLM_FORCE_INTRINSICS GLM_FORCE_SSE2 GLM_FORCE_SSE3 GLM_FORCE_AVX GLM_FORCE_AVX2 GLM_FORCE_AVX2 221 222 #define GLM_ARCH_MIPS_BIT (0x10000000) 223 #define GLM_ARCH_PPC_BIT (0x20000000) 224 #define GLM_ARCH_ARM_BIT (0x40000000) 225 #define GLM_ARCH_X86_BIT (0x80000000) 226 227 #define GLM_ARCH_SIMD_BIT (0x00001000) 228 229 #define GLM_ARCH_NEON_BIT (0x00000001) 230 #define GLM_ARCH_SSE_BIT (0x00000002) 231 #define GLM_ARCH_SSE2_BIT (0x00000004) 232 #define GLM_ARCH_SSE3_BIT (0x00000008) 233 #define GLM_ARCH_SSSE3_BIT (0x00000010) 234 #define GLM_ARCH_SSE41_BIT (0x00000020) 235 #define GLM_ARCH_SSE42_BIT (0x00000040) 236 #define GLM_ARCH_AVX_BIT (0x00000080) 237 #define GLM_ARCH_AVX2_BIT (0x00000100) 238 239 #define GLM_ARCH_UNKNOWN (0) 240 #define GLM_ARCH_X86 (GLM_ARCH_X86_BIT) 241 #define GLM_ARCH_SSE (GLM_ARCH_SSE_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_X86) 242 #define GLM_ARCH_SSE2 (GLM_ARCH_SSE2_BIT | GLM_ARCH_SSE) 243 #define GLM_ARCH_SSE3 (GLM_ARCH_SSE3_BIT | GLM_ARCH_SSE2) 244 #define GLM_ARCH_SSSE3 (GLM_ARCH_SSSE3_BIT | GLM_ARCH_SSE3) 245 #define GLM_ARCH_SSE41 (GLM_ARCH_SSE41_BIT | GLM_ARCH_SSSE3) 246 #define GLM_ARCH_SSE42 (GLM_ARCH_SSE42_BIT | GLM_ARCH_SSE41) 247 #define GLM_ARCH_AVX (GLM_ARCH_AVX_BIT | GLM_ARCH_SSE42) 248 #define GLM_ARCH_AVX2 (GLM_ARCH_AVX2_BIT | GLM_ARCH_AVX) 249 #define GLM_ARCH_ARM (GLM_ARCH_ARM_BIT) 250 #define GLM_ARCH_NEON (GLM_ARCH_NEON_BIT | GLM_ARCH_SIMD_BIT | GLM_ARCH_ARM) 251 #define GLM_ARCH_MIPS (GLM_ARCH_MIPS_BIT) 252 #define GLM_ARCH_PPC (GLM_ARCH_PPC_BIT) 253 254 #if defined(GLM_FORCE_ARCH_UNKNOWN) || defined(GLM_FORCE_PURE) 255 # define GLM_ARCH GLM_ARCH_UNKNOWN 256 #elif defined(GLM_FORCE_NEON) 257 # define GLM_ARCH (GLM_ARCH_NEON) 258 # define GLM_FORCE_INTRINSICS 259 #elif defined(GLM_FORCE_AVX2) 260 # define GLM_ARCH (GLM_ARCH_AVX2) 261 # define GLM_FORCE_INTRINSICS 262 #elif defined(GLM_FORCE_AVX) 263 # define GLM_ARCH (GLM_ARCH_AVX) 264 # define GLM_FORCE_INTRINSICS 265 #elif defined(GLM_FORCE_SSE42) 266 # define GLM_ARCH (GLM_ARCH_SSE42) 267 # define GLM_FORCE_INTRINSICS 268 #elif defined(GLM_FORCE_SSE41) 269 # define GLM_ARCH (GLM_ARCH_SSE41) 270 # define GLM_FORCE_INTRINSICS 271 #elif defined(GLM_FORCE_SSSE3) 272 # define GLM_ARCH (GLM_ARCH_SSSE3) 273 # define GLM_FORCE_INTRINSICS 274 #elif defined(GLM_FORCE_SSE3) 275 # define GLM_ARCH (GLM_ARCH_SSE3) 276 # define GLM_FORCE_INTRINSICS 277 #elif defined(GLM_FORCE_SSE2) 278 # define GLM_ARCH (GLM_ARCH_SSE2) 279 # define GLM_FORCE_INTRINSICS 280 #elif defined(GLM_FORCE_SSE) 281 # define GLM_ARCH (GLM_ARCH_SSE) 282 # define GLM_FORCE_INTRINSICS 283 #elif defined(GLM_FORCE_INTRINSICS) && !defined(GLM_FORCE_XYZW_ONLY) 284 # if defined(__AVX2__) 285 # define GLM_ARCH (GLM_ARCH_AVX2) 286 # elif defined(__AVX__) 287 # define GLM_ARCH (GLM_ARCH_AVX) 288 # elif defined(__SSE4_2__) 289 # define GLM_ARCH (GLM_ARCH_SSE42) 290 # elif defined(__SSE4_1__) 291 # define GLM_ARCH (GLM_ARCH_SSE41) 292 # elif defined(__SSSE3__) 293 # define GLM_ARCH (GLM_ARCH_SSSE3) 294 # elif defined(__SSE3__) 295 # define GLM_ARCH (GLM_ARCH_SSE3) 296 # elif defined(__SSE2__) || defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86_FP) 297 # define GLM_ARCH (GLM_ARCH_SSE2) 298 # elif defined(__i386__) 299 # define GLM_ARCH (GLM_ARCH_X86) 300 # elif defined(__ARM_NEON) 301 # define GLM_ARCH (GLM_ARCH_ARM | GLM_ARCH_NEON) 302 # elif defined(__arm__ ) || defined(_M_ARM) 303 # define GLM_ARCH (GLM_ARCH_ARM) 304 # elif defined(__mips__ ) 305 # define GLM_ARCH (GLM_ARCH_MIPS) 306 # elif defined(__powerpc__ ) || defined(_M_PPC) 307 # define GLM_ARCH (GLM_ARCH_PPC) 308 # else 309 # define GLM_ARCH (GLM_ARCH_UNKNOWN) 310 # endif 311 #else 312 # if defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86) || defined(__i386__) 313 # define GLM_ARCH (GLM_ARCH_X86) 314 # elif defined(__arm__) || defined(_M_ARM) 315 # define GLM_ARCH (GLM_ARCH_ARM) 316 # elif defined(__powerpc__) || defined(_M_PPC) 317 # define GLM_ARCH (GLM_ARCH_PPC) 318 # elif defined(__mips__) 319 # define GLM_ARCH (GLM_ARCH_MIPS) 320 # else 321 # define GLM_ARCH (GLM_ARCH_UNKNOWN) 322 # endif 323 #endif 324 325 #if GLM_ARCH & GLM_ARCH_AVX2_BIT 326 # include <immintrin.h> 327 #elif GLM_ARCH & GLM_ARCH_AVX_BIT 328 # include <immintrin.h> 329 #elif GLM_ARCH & GLM_ARCH_SSE42_BIT 330 # if GLM_COMPILER & GLM_COMPILER_CLANG 331 # include <popcntintrin.h> 332 # endif 333 # include <nmmintrin.h> 334 #elif GLM_ARCH & GLM_ARCH_SSE41_BIT 335 # include <smmintrin.h> 336 #elif GLM_ARCH & GLM_ARCH_SSSE3_BIT 337 # include <tmmintrin.h> 338 #elif GLM_ARCH & GLM_ARCH_SSE3_BIT 339 # include <pmmintrin.h> 340 #elif GLM_ARCH & GLM_ARCH_SSE2_BIT 341 # include <emmintrin.h> 342 #endif//GLM_ARCH 343 344 #if GLM_ARCH & GLM_ARCH_SSE2_BIT 345 typedef __m128 glm_f32vec4; 346 typedef __m128i glm_i32vec4; 347 typedef __m128i glm_u32vec4; 348 typedef __m128d glm_f64vec2; 349 typedef __m128i glm_i64vec2; 350 typedef __m128i glm_u64vec2; 351 352 typedef glm_f32vec4 glm_vec4; 353 typedef glm_i32vec4 glm_ivec4; 354 typedef glm_u32vec4 glm_uvec4; 355 typedef glm_f64vec2 glm_dvec2; 356 #endif 357 358 #if GLM_ARCH & GLM_ARCH_AVX_BIT 359 typedef __m256d glm_f64vec4; 360 typedef glm_f64vec4 glm_dvec4; 361 #endif 362 363 #if GLM_ARCH & GLM_ARCH_AVX2_BIT 364 typedef __m256i glm_i64vec4; 365 typedef __m256i glm_u64vec4; 366 #endif 367