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