/glm/core/setup.hpp
C++ Header | 675 lines | 503 code | 68 blank | 104 comment | 172 complexity | b826dcd1dc8c0c45f03176708a648d21 MD5 | raw file
1///////////////////////////////////////////////////////////////////////////////////
2/// OpenGL Mathematics (glm.g-truc.net)
3///
4/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)
5/// Permission is hereby granted, free of charge, to any person obtaining a copy
6/// of this software and associated documentation files (the "Software"), to deal
7/// in the Software without restriction, including without limitation the rights
8/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9/// copies of the Software, and to permit persons to whom the Software is
10/// furnished to do so, subject to the following conditions:
11///
12/// The above copyright notice and this permission notice shall be included in
13/// all copies or substantial portions of the Software.
14///
15/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21/// THE SOFTWARE.
22///
23/// @ref core
24/// @file glm/core/setup.hpp
25/// @date 2006-11-13 / 2011-06-15
26/// @author Christophe Riccio
27///////////////////////////////////////////////////////////////////////////////////
28
29#ifndef glm_setup
30#define glm_setup
31
32///////////////////////////////////////////////////////////////////////////////////////////////////
33// Version
34
35#define GLM_VERSION 93
36#define GLM_VERSION_MAJOR 0
37#define GLM_VERSION_MINOR 9
38#define GLM_VERSION_PATCH 3
39#define GLM_VERSION_REVISION 4
40
41///////////////////////////////////////////////////////////////////////////////////////////////////
42// Platform
43
44#define GLM_PLATFORM_UNKNOWN 0x00000000
45#define GLM_PLATFORM_WINDOWS 0x00010000
46#define GLM_PLATFORM_LINUX 0x00020000
47#define GLM_PLATFORM_APPLE 0x00040000
48//#define GLM_PLATFORM_IOS 0x00080000
49#define GLM_PLATFORM_ANDROID 0x00100000
50#define GLM_PLATFORM_CHROME_NACL 0x00200000
51#define GLM_PLATFORM_UNIX 0x00400000
52#define GLM_PLATFORM_QNXNTO 0x00800000
53
54#ifdef GLM_FORCE_PLATFORM_UNKNOWN
55# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN
56#elif defined(__QNXNTO__)
57# define GLM_PLATFORM GLM_PLATFORM_QNXNTO
58#elif defined(__APPLE__)
59# define GLM_PLATFORM GLM_PLATFORM_APPLE
60#elif defined(_WIN32)
61# define GLM_PLATFORM GLM_PLATFORM_WINDOWS
62#elif defined(__native_client__)
63# define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL
64#elif defined(__ANDROID__)
65# define GLM_PLATFORM GLM_PLATFORM_ANDROID
66#elif defined(__linux)
67# define GLM_PLATFORM GLM_PLATFORM_LINUX
68#elif defined(__unix)
69# define GLM_PLATFORM GLM_PLATFORM_UNIX
70#else
71# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN
72#endif//
73
74// Report platform detection
75#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_PLATFORM_DISPLAYED))
76# define GLM_MESSAGE_PLATFORM_DISPLAYED
77# if(GLM_PLATFORM & GLM_PLATFORM_WINDOWS)
78# pragma message("GLM: Windows platform detected")
79//# elif(GLM_PLATFORM & GLM_PLATFORM_IOS)
80//# pragma message("GLM: iOS platform detected")
81# elif(GLM_PLATFORM & GLM_PLATFORM_APPLE)
82# pragma message("GLM: Apple platform detected")
83# elif(GLM_PLATFORM & GLM_PLATFORM_LINUX)
84# pragma message("GLM: Linux platform detected")
85# elif(GLM_PLATFORM & GLM_PLATFORM_UNIX)
86# pragma message("GLM: UNIX platform detected")
87# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
88# pragma message("GLM: Android platform detected")
89# elif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL)
90# pragma message("GLM: Chrone Native Client detected")
91# elif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN)
92# pragma message("GLM: platform unknown")
93# else
94# pragma message("GLM: platform not detected")
95# endif
96#endif//GLM_MESSAGE
97
98///////////////////////////////////////////////////////////////////////////////////////////////////
99// Compiler
100
101// User defines: GLM_FORCE_COMPILER_UNKNOWN
102// TODO ? __llvm__
103
104#define GLM_COMPILER_UNKNOWN 0x00000000
105
106// Visual C++ defines
107#define GLM_COMPILER_VC 0x01000000
108#define GLM_COMPILER_VC2 0x01000010
109#define GLM_COMPILER_VC4 0x01000020
110#define GLM_COMPILER_VC5 0x01000030
111#define GLM_COMPILER_VC6 0x01000040
112#define GLM_COMPILER_VC2002 0x01000050
113#define GLM_COMPILER_VC2003 0x01000060
114#define GLM_COMPILER_VC2005 0x01000070
115#define GLM_COMPILER_VC2008 0x01000080
116#define GLM_COMPILER_VC2010 0x01000090
117#define GLM_COMPILER_VC2011 0x010000A0
118
119// GCC defines
120#define GLM_COMPILER_GCC 0x02000000
121#define GLM_COMPILER_GCC_LLVM 0x02000001
122#define GLM_COMPILER_GCC_CLANG 0x02000002
123#define GLM_COMPILER_GCC30 0x02000010
124#define GLM_COMPILER_GCC31 0x02000020
125#define GLM_COMPILER_GCC32 0x02000030
126#define GLM_COMPILER_GCC33 0x02000040
127#define GLM_COMPILER_GCC34 0x02000050
128#define GLM_COMPILER_GCC35 0x02000060
129#define GLM_COMPILER_GCC40 0x02000070
130#define GLM_COMPILER_GCC41 0x02000080
131#define GLM_COMPILER_GCC42 0x02000090
132#define GLM_COMPILER_GCC43 0x020000A0
133#define GLM_COMPILER_GCC44 0x020000B0
134#define GLM_COMPILER_GCC45 0x020000C0
135#define GLM_COMPILER_GCC46 0x020000D0
136#define GLM_COMPILER_GCC47 0x020000E0
137#define GLM_COMPILER_GCC48 0x020000F0
138#define GLM_COMPILER_GCC49 0x02000100
139#define GLM_COMPILER_GCC50 0x02000200
140
141// G++ command line to display defined
142// echo "" | g++ -E -dM -x c++ - | sort
143
144// Borland C++ defines. How to identify BC?
145#define GLM_COMPILER_BC 0x04000000
146#define GLM_COMPILER_BCB4 0x04000100
147#define GLM_COMPILER_BCB5 0x04000200
148#define GLM_COMPILER_BCB6 0x04000300
149//#define GLM_COMPILER_BCBX 0x04000400 // What's the version value?
150#define GLM_COMPILER_BCB2009 0x04000500
151
152// CodeWarrior
153#define GLM_COMPILER_CODEWARRIOR 0x08000000
154
155// CUDA
156#define GLM_COMPILER_CUDA 0x10000000
157#define GLM_COMPILER_CUDA30 0x10000010
158#define GLM_COMPILER_CUDA31 0x10000020
159#define GLM_COMPILER_CUDA32 0x10000030
160#define GLM_COMPILER_CUDA40 0x10000040
161#define GLM_COMPILER_CUDA41 0x10000050
162#define GLM_COMPILER_CUDA42 0x10000060
163
164// Clang
165#define GLM_COMPILER_CLANG 0x20000000
166#define GLM_COMPILER_CLANG26 0x20000010
167#define GLM_COMPILER_CLANG27 0x20000020
168#define GLM_COMPILER_CLANG28 0x20000030
169#define GLM_COMPILER_CLANG29 0x20000040
170#define GLM_COMPILER_CLANG30 0x20000050
171#define GLM_COMPILER_CLANG31 0x20000060
172#define GLM_COMPILER_CLANG32 0x20000070
173#define GLM_COMPILER_CLANG33 0x20000080
174
175// LLVM GCC
176#define GLM_COMPILER_LLVM_GCC 0x40000000
177
178// Intel
179#define GLM_COMPILER_INTEL 0x80000000
180#define GLM_COMPILER_INTEL9 0x80000010
181#define GLM_COMPILER_INTEL10_0 0x80000020
182#define GLM_COMPILER_INTEL10_1 0x80000030
183#define GLM_COMPILER_INTEL11_0 0x80000040
184#define GLM_COMPILER_INTEL11_1 0x80000050
185#define GLM_COMPILER_INTEL12_0 0x80000060
186#define GLM_COMPILER_INTEL12_1 0x80000070
187#define GLM_COMPILER_INTEL13_0 0x80000080
188
189// Build model
190#define GLM_MODEL_32 0x00000010
191#define GLM_MODEL_64 0x00000020
192
193// Force generic C++ compiler
194#ifdef GLM_FORCE_COMPILER_UNKNOWN
195# define GLM_COMPILER GLM_COMPILER_UNKNOWN
196
197#elif defined(__INTEL_COMPILER)
198# if __INTEL_COMPILER == 900
199# define GLM_COMPILER GLM_COMPILER_INTEL9
200# elif __INTEL_COMPILER == 1000
201# define GLM_COMPILER GLM_COMPILER_INTEL10_0
202# elif __INTEL_COMPILER == 1010
203# define GLM_COMPILER GLM_COMPILER_INTEL10_1
204# elif __INTEL_COMPILER == 1100
205# define GLM_COMPILER GLM_COMPILER_INTEL11_0
206# elif __INTEL_COMPILER == 1110
207# define GLM_COMPILER GLM_COMPILER_INTEL11_1
208# elif __INTEL_COMPILER == 1200
209# define GLM_COMPILER GLM_COMPILER_INTEL12_0
210# elif __INTEL_COMPILER == 1210
211# define GLM_COMPILER GLM_COMPILER_INTEL12_1
212# elif __INTEL_COMPILER == 1300
213# define GLM_COMPILER GLM_COMPILER_INTEL13_0
214# else
215# define GLM_COMPILER GLM_COMPILER_INTEL
216# endif
217
218// CUDA
219#elif defined(__CUDACC__)
220# define GLM_COMPILER GLM_COMPILER_CUDA
221/*
222# if CUDA_VERSION < 3000
223# error "GLM requires CUDA 3.0 or higher"
224# elif CUDA_VERSION == 3000
225# define GLM_COMPILER GLM_COMPILER_CUDA30
226# elif CUDA_VERSION == 3010
227# define GLM_COMPILER GLM_COMPILER_CUDA31
228# elif CUDA_VERSION == 3020
229# define GLM_COMPILER GLM_COMPILER_CUDA32
230# elif CUDA_VERSION == 4000
231# define GLM_COMPILER GLM_COMPILER_CUDA40
232# elif CUDA_VERSION == 4010
233# define GLM_COMPILER GLM_COMPILER_CUDA41
234# elif CUDA_VERSION == 4020
235# define GLM_COMPILER GLM_COMPILER_CUDA42
236# else
237# define GLM_COMPILER GLM_COMPILER_CUDA
238# endif
239*/
240
241// Visual C++
242#elif defined(_MSC_VER)
243# if _MSC_VER == 900
244# define GLM_COMPILER GLM_COMPILER_VC2
245# elif _MSC_VER == 1000
246# define GLM_COMPILER GLM_COMPILER_VC4
247# elif _MSC_VER == 1100
248# define GLM_COMPILER GLM_COMPILER_VC5
249# elif _MSC_VER == 1200
250# define GLM_COMPILER GLM_COMPILER_VC6
251# elif _MSC_VER == 1300
252# define GLM_COMPILER GLM_COMPILER_VC2002
253# elif _MSC_VER == 1310
254# define GLM_COMPILER GLM_COMPILER_VC2003
255# elif _MSC_VER == 1400
256# define GLM_COMPILER GLM_COMPILER_VC2005
257# elif _MSC_VER == 1500
258# define GLM_COMPILER GLM_COMPILER_VC2008
259# elif _MSC_VER == 1600
260# define GLM_COMPILER GLM_COMPILER_VC2010
261# elif _MSC_VER == 1700
262# define GLM_COMPILER GLM_COMPILER_VC2011
263# else//_MSC_VER
264# define GLM_COMPILER GLM_COMPILER_VC
265# endif//_MSC_VER
266
267// Clang
268#elif defined(__clang__)
269# if(__clang_major__ == 2) && (__clang_minor__ == 6)
270# define GLM_COMPILER GLM_COMPILER_CLANG26
271# elif(__clang_major__ == 2) && (__clang_minor__ == 7)
272# define GLM_COMPILER GLM_COMPILER_CLANG27
273# elif(__clang_major__ == 2) && (__clang_minor__ == 8)
274# define GLM_COMPILER GLM_COMPILER_CLANG28
275# elif(__clang_major__ == 2) && (__clang_minor__ == 9)
276# define GLM_COMPILER GLM_COMPILER_CLANG29
277# elif(__clang_major__ == 3) && (__clang_minor__ == 0)
278# define GLM_COMPILER GLM_COMPILER_CLANG30
279# elif(__clang_major__ == 3) && (__clang_minor__ == 1)
280# define GLM_COMPILER GLM_COMPILER_CLANG31
281# elif(__clang_major__ == 3) && (__clang_minor__ == 2)
282# define GLM_COMPILER GLM_COMPILER_CLANG32
283# elif(__clang_major__ == 3) && (__clang_minor__ == 3)
284# define GLM_COMPILER GLM_COMPILER_CLANG33
285# else
286# define GLM_COMPILER GLM_COMPILER_CLANG
287# endif
288
289// G++
290#elif(defined(__GNUC__) || defined(__MINGW32__))// || defined(__llvm__) || defined(__clang__)
291# if defined (__llvm__)
292# define GLM_COMPILER_GCC_EXTRA GLM_COMPILER_GCC_LLVM
293# elif defined (__clang__)
294# define GLM_COMPILER_GCC_EXTRA GLM_COMPILER_GCC_CLANG
295# else
296# define GLM_COMPILER_GCC_EXTRA 0
297# endif
298#
299# if (__GNUC__ == 3) && (__GNUC_MINOR__ == 2)
300# define GLM_COMPILER GLM_COMPILER_GCC32
301# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 3)
302# define GLM_COMPILER GLM_COMPILER_GCC33
303# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 4)
304# define GLM_COMPILER GLM_COMPILER_GCC34
305# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 5)
306# define GLM_COMPILER GLM_COMPILER_GCC35
307# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 0)
308# define GLM_COMPILER (GLM_COMPILER_GCC40 | GLM_COMPILER_GCC_EXTRA)
309# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 1)
310# define GLM_COMPILER (GLM_COMPILER_GCC41 | GLM_COMPILER_GCC_EXTRA)
311# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 2)
312# define GLM_COMPILER (GLM_COMPILER_GCC42 | GLM_COMPILER_GCC_EXTRA)
313# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 3)
314# define GLM_COMPILER (GLM_COMPILER_GCC43 | GLM_COMPILER_GCC_EXTRA)
315# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 4)
316# define GLM_COMPILER (GLM_COMPILER_GCC44 | GLM_COMPILER_GCC_EXTRA)
317# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 5)
318# define GLM_COMPILER (GLM_COMPILER_GCC45 | GLM_COMPILER_GCC_EXTRA)
319# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6)
320# define GLM_COMPILER (GLM_COMPILER_GCC46 | GLM_COMPILER_GCC_EXTRA)
321# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7)
322# define GLM_COMPILER (GLM_COMPILER_GCC47 | GLM_COMPILER_GCC_EXTRA)
323# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 8)
324# define GLM_COMPILER (GLM_COMPILER_GCC48 | GLM_COMPILER_GCC_EXTRA)
325# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 9)
326# define GLM_COMPILER (GLM_COMPILER_GCC49 | GLM_COMPILER_GCC_EXTRA)
327# elif (__GNUC__ == 5) && (__GNUC_MINOR__ == 0)
328# define GLM_COMPILER (GLM_COMPILER_GCC50 | GLM_COMPILER_GCC_EXTRA)
329# else
330# define GLM_COMPILER (GLM_COMPILER_GCC | GLM_COMPILER_GCC_EXTRA)
331# endif
332
333// Borland C++
334#elif defined(_BORLANDC_)
335# if defined(VER125)
336# define GLM_COMPILER GLM_COMPILER_BCB4
337# elif defined(VER130)
338# define GLM_COMPILER GLM_COMPILER_BCB5
339# elif defined(VER140)
340# define GLM_COMPILER GLM_COMPILER_BCB6
341# elif defined(VER200)
342# define GLM_COMPILER GLM_COMPILER_BCB2009
343# else
344# define GLM_COMPILER GLM_COMPILER_BC
345# endif
346
347// Codewarrior
348#elif defined(__MWERKS__)
349# define GLM_COMPILER GLM_COMPILER_CODEWARRIOR
350
351#else
352# define GLM_COMPILER GLM_COMPILER_UNKNOWN
353#endif
354
355#ifndef GLM_COMPILER
356#error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message."
357#endif//GLM_COMPILER
358
359// Report compiler detection
360#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPILER_DISPLAYED))
361# define GLM_MESSAGE_COMPILER_DISPLAYED
362# if(GLM_COMPILER & GLM_COMPILER_CUDA)
363# pragma message("GLM: CUDA compiler detected")
364# elif(GLM_COMPILER & GLM_COMPILER_VC)
365# pragma message("GLM: Visual C++ compiler detected")
366# elif(GLM_COMPILER & GLM_COMPILER_CLANG)
367# pragma message("GLM: Clang compiler detected")
368# elif(GLM_COMPILER & GLM_COMPILER_LLVM_GCC)
369# pragma message("GLM: LLVM GCC compiler detected")
370# elif(GLM_COMPILER & GLM_COMPILER_GCC)
371# if(GLM_COMPILER == GLM_COMPILER_GCC_LLVM)
372# pragma message("GLM: LLVM GCC compiler detected")
373# elif(GLM_COMPILER == GLM_COMPILER_GCC_CLANG)
374# pragma message("GLM: CLANG compiler detected")
375# else
376# pragma message("GLM: GCC compiler detected")
377# endif
378# elif(GLM_COMPILER & GLM_COMPILER_BC)
379# pragma message("GLM: Borland compiler detected but not supported")
380# elif(GLM_COMPILER & GLM_COMPILER_CODEWARRIOR)
381# pragma message("GLM: Codewarrior compiler detected but not supported")
382# else
383# pragma message("GLM: Compiler not detected")
384# endif
385#endif//GLM_MESSAGE
386
387/////////////////
388// Build model //
389
390#if((defined(__WORDSIZE) && (__WORDSIZE == 64)) || defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__))
391# define GLM_MODEL GLM_MODEL_64
392#elif(defined(__i386__) || defined(__ppc__))
393# define GLM_MODEL GLM_MODEL_32
394#else
395# define GLM_MODEL GLM_MODEL_32
396#endif//
397
398#if(!defined(GLM_MODEL) && GLM_COMPILER != 0)
399#error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message."
400#endif//GLM_MODEL
401
402#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_MODEL_DISPLAYED))
403# define GLM_MESSAGE_MODEL_DISPLAYED
404# if(GLM_MODEL == GLM_MODEL_64)
405# pragma message("GLM: 64 bits model")
406# elif(GLM_MODEL == GLM_MODEL_32)
407# pragma message("GLM: 32 bits model")
408# endif//GLM_MODEL
409#endif//GLM_MESSAGE
410
411/////////////////
412// C++ Version //
413
414// User defines: GLM_FORCE_CXX98
415
416#define GLM_LANG_CXX (0 << 0)
417#define GLM_LANG_CXX98 ((1 << 1) | GLM_LANG_CXX)
418#define GLM_LANG_CXX03 ((1 << 2) | GLM_LANG_CXX98)
419#define GLM_LANG_CXX0X ((1 << 3) | GLM_LANG_CXX03)
420#define GLM_LANG_CXX11 ((1 << 4) | GLM_LANG_CXX0X)
421#define GLM_LANG_CXXMS (1 << 5)
422#define GLM_LANG_CXXGNU (1 << 6)
423
424#if(defined(GLM_FORCE_CXX11))
425# define GLM_LANG GLM_LANG_CXX11
426#elif(defined(GLM_FORCE_CXX03))
427# define GLM_LANG GLM_LANG_CXX03
428#elif(defined(GLM_FORCE_CXX98))
429# define GLM_LANG GLM_LANG_CXX98
430#else
431// -std=c++0x or -std=gnu++0x
432# if(((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC) && defined(__GXX_EXPERIMENTAL_CXX0X__))
433# define GLM_LANG GLM_LANG_CXX0X
434# elif(((GLM_COMPILER & GLM_COMPILER_VC) == GLM_COMPILER_VC) && defined(_MSC_EXTENSIONS))
435# define GLM_LANG GLM_LANG_CXXMS
436# elif(((GLM_COMPILER & GLM_COMPILER_VC) == GLM_COMPILER_VC) && !defined(_MSC_EXTENSIONS))
437# if(GLM_COMPILER >= GLM_COMPILER_VC2010)
438# define GLM_LANG GLM_LANG_CXX0X
439# else
440# define GLM_LANG GLM_LANG_CXX98
441# endif//(GLM_COMPILER == GLM_COMPILER_VC2010)
442# elif((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC) //&& defined(__STRICT_ANSI__))
443# define GLM_LANG GLM_LANG_CXX98
444# elif((GLM_COMPILER & GLM_COMPILER_CLANG) == GLM_COMPILER_CLANG)
445# define GLM_LANG GLM_LANG_CXX98
446# else
447# define GLM_LANG GLM_LANG_CXX
448# endif
449#endif
450
451#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_LANG_DISPLAYED))
452# define GLM_MESSAGE_LANG_DISPLAYED
453# if(GLM_LANG == GLM_LANG_CXX98)
454# pragma message("GLM: C++98")
455# elif(GLM_LANG == GLM_LANG_CXX03)
456# pragma message("GLM: C++03")
457# elif(GLM_LANG == GLM_LANG_CXX0X)
458# pragma message("GLM: C++0x")
459# elif(GLM_LANG == GLM_LANG_CXX11)
460# pragma message("GLM: C++11")
461# elif(GLM_LANG == GLM_LANG_CXXGNU)
462# pragma message("GLM: C++ with GNU language extensions")
463# elif(GLM_LANG == GLM_LANG_CXXMS)
464# pragma message("GLM: C++ with VC language extensions")
465# else
466# pragma message("GLM: C++ language undetected")
467# endif//GLM_MODEL
468#endif//GLM_MESSAGE
469
470/////////////////
471// Platform
472
473// User defines: GLM_FORCE_PURE GLM_FORCE_SSE2 GLM_FORCE_AVX
474
475#define GLM_ARCH_PURE 0x0000
476#define GLM_ARCH_SSE2 0x0001
477#define GLM_ARCH_SSE3 0x0002// | GLM_ARCH_SSE2
478#define GLM_ARCH_SSE4 0x0004// | GLM_ARCH_SSE3 | GLM_ARCH_SSE2
479#define GLM_ARCH_AVX 0x0008// | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2
480#define GLM_ARCH_AVX2 0x0010// | GLM_ARCH_AVX | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2
481
482#if(defined(GLM_FORCE_PURE))
483# define GLM_ARCH GLM_ARCH_PURE
484#elif(defined(GLM_FORCE_AVX2))
485# define GLM_ARCH GLM_ARCH_AVX2
486#elif(defined(GLM_FORCE_AVX))
487# define GLM_ARCH GLM_ARCH_AVX
488#elif(defined(GLM_FORCE_SSE4))
489# define GLM_ARCH GLM_ARCH_SSE4
490#elif(defined(GLM_FORCE_SSE3))
491# define GLM_ARCH GLM_ARCH_SSE3
492#elif(defined(GLM_FORCE_SSE2))
493# define GLM_ARCH GLM_ARCH_SSE2
494#elif((GLM_COMPILER & GLM_COMPILER_VC) && (defined(_M_IX86) || defined(_M_X64)))
495# if(defined(_M_CEE_PURE))
496# define GLM_ARCH GLM_ARCH_PURE
497# elif(GLM_COMPILER >= GLM_COMPILER_VC2010)
498# if(_MSC_FULL_VER >= 160031118) //160031118: VC2010 SP1 beta full version
499# define GLM_ARCH GLM_ARCH_AVX //GLM_ARCH_AVX (Require SP1)
500# else
501# define GLM_ARCH GLM_ARCH_SSE3
502# endif
503# elif(GLM_COMPILER >= GLM_COMPILER_VC2008)
504# define GLM_ARCH GLM_ARCH_SSE3
505# elif(GLM_COMPILER >= GLM_COMPILER_VC2005)
506# define GLM_ARCH GLM_ARCH_SSE2
507# else
508# define GLM_ARCH GLM_ARCH_PURE
509# endif
510#elif((GLM_PLATFORM & GLM_PLATFORM_APPLE) && (GLM_COMPILER & GLM_COMPILER_GCC))
511# define GLM_ARCH GLM_ARCH_PURE
512#elif(((GLM_COMPILER & GLM_COMPILER_GCC) && (defined(__i386__) || defined(__x86_64__))) || (GLM_COMPILER & GLM_COMPILER_LLVM_GCC))
513# if(defined(__AVX2__))
514# define GLM_ARCH GLM_ARCH_AVX2
515# elif(defined(__AVX__))
516# define GLM_ARCH GLM_ARCH_AVX
517# elif(defined(__SSE4__))
518# define GLM_ARCH GLM_ARCH_SSE4
519# elif(defined(__SSE3__))
520# define GLM_ARCH GLM_ARCH_SSE3
521# elif(defined(__SSE2__))
522# define GLM_ARCH GLM_ARCH_SSE2
523# else
524# define GLM_ARCH GLM_ARCH_PURE
525# endif
526#else
527# define GLM_ARCH GLM_ARCH_PURE
528#endif
529
530//#if(GLM_ARCH != GLM_ARCH_PURE)
531#if(GLM_ARCH & GLM_ARCH_AVX2)
532# include <immintrin.h>
533#endif//GLM_ARCH
534#if(GLM_ARCH & GLM_ARCH_AVX)
535# include <immintrin.h>
536#endif//GLM_ARCH
537#if(GLM_ARCH & GLM_ARCH_SSE4)
538# include <smmintrin.h>
539#endif//GLM_ARCH
540#if(GLM_ARCH & GLM_ARCH_SSE3)
541# include <pmmintrin.h>
542#endif//GLM_ARCH
543#if(GLM_ARCH & GLM_ARCH_SSE2)
544# include <emmintrin.h>
545#endif//GLM_ARCH
546//#endif//(GLM_ARCH != GLM_ARCH_PURE)
547
548#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_ARCH_DISPLAYED))
549# define GLM_MESSAGE_ARCH_DISPLAYED
550# if(GLM_ARCH == GLM_ARCH_PURE)
551# pragma message("GLM: Platform independent")
552# elif(GLM_ARCH == GLM_ARCH_SSE2)
553# pragma message("GLM: SSE2 instruction set")
554# elif(GLM_ARCH == GLM_ARCH_SSE3)
555# pragma message("GLM: SSE3 instruction set")
556# elif(GLM_ARCH == GLM_ARCH_SSE4)
557# pragma message("GLM: SSE4 instruction set")
558# elif(GLM_ARCH == GLM_ARCH_AVX)
559# pragma message("GLM: AVX instruction set")
560# elif(GLM_ARCH == GLM_ARCH_AVX2)
561# pragma message("GLM: AVX2 instruction set")
562# endif//GLM_ARCH
563#endif//GLM_MESSAGE
564
565///////////////////////////////////////////////////////////////////////////////////////////////////
566// Support check macros
567
568#define GLM_SUPPORT_ANONYMOUS_UNION() \
569 ((GLM_LANG & GLM_LANG_CXX98) == GLM_LANG_CXX98)
570
571//#define GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() \
572// (((GLM_LANG & GLM_LANG_CXX11) == GLM_LANG_CXX11) || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_LANG & GLM_LANG_CXXMS) == GLM_LANG_CXXMS) || ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_LANG == GLM_LANG_CXX0X)))
573
574#define GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() \
575 (((GLM_LANG & GLM_LANG_CXX11) == GLM_LANG_CXX11) || ((GLM_COMPILER & GLM_COMPILER_VC) && ((GLM_LANG & GLM_LANG_CXXMS) == GLM_LANG_CXXMS)) || ((GLM_LANG == GLM_LANG_CXX0X) == GLM_LANG_CXX0X))
576
577#define GLM_SUPPORT_SWIZZLE_OPERATOR() \
578 (/*defined(GLM_SWIZZLE) && */GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE())
579
580#define GLM_SUPPORT_SWIZZLE_FUNCTION() defined(GLM_SWIZZLE)
581
582///////////////////////////////////////////////////////////////////////////////////////////////////
583// Components
584
585//#define GLM_FORCE_ONLY_XYZW
586#define GLM_COMPONENT_ONLY_XYZW 0 // To disable multiple vector component names access.
587#define GLM_COMPONENT_CXX98 1 //
588#define GLM_COMPONENT_CXX11 2 // To use anonymous union to provide multiple component names access for class valType. Visual C++ only.
589
590#if(GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() && !defined(GLM_FORCE_ONLY_XYZW))
591# define GLM_COMPONENT GLM_COMPONENT_CXX11
592#elif(GLM_SUPPORT_ANONYMOUS_UNION() && !defined(GLM_FORCE_ONLY_XYZW))
593# define GLM_COMPONENT GLM_COMPONENT_CXX98
594#else
595# define GLM_COMPONENT GLM_COMPONENT_ONLY_XYZW
596#endif
597
598#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPONENT_DISPLAYED))
599# define GLM_MESSAGE_COMPONENT_DISPLAYED
600# if(GLM_COMPONENT == GLM_COMPONENT_CXX98)
601# pragma message("GLM: x,y,z,w; r,g,b,a; s,t,p,q component names except of half based vector types")
602# elif(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
603# pragma message("GLM: x,y,z,w component names for all vector types")
604# elif(GLM_COMPONENT == GLM_COMPONENT_CXX11)
605# pragma message("GLM: x,y,z,w; r,g,b,a; s,t,p,q component names for all vector types")
606# else
607# error "GLM: GLM_COMPONENT value unknown"
608# endif//GLM_MESSAGE_COMPONENT_DISPLAYED
609#endif//GLM_MESSAGE
610
611///////////////////////////////////////////////////////////////////////////////////////////////////
612// Static assert
613
614#if(GLM_LANG == GLM_LANG_CXX0X)
615# define GLM_STATIC_ASSERT(x, message) static_assert(x, message)
616#elif(defined(BOOST_STATIC_ASSERT))
617# define GLM_STATIC_ASSERT(x, message) BOOST_STATIC_ASSERT(x)
618#elif(GLM_COMPILER & GLM_COMPILER_VC)
619# define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1]
620#else
621# define GLM_STATIC_ASSERT(x, message)
622# define GLM_STATIC_ASSERT_NULL
623#endif//GLM_LANG
624
625///////////////////////////////////////////////////////////////////////////////////////////////////
626// Qualifiers
627
628// User defines: GLM_FORCE_INLINE GLM_FORCE_CUDA
629
630#if(defined(GLM_FORCE_CUDA) || (GLM_COMPILER & GLM_COMPILER_CUDA))
631# define GLM_CUDA_FUNC_DEF __device__ __host__
632# define GLM_CUDA_FUNC_DECL __device__ __host__
633#else
634# define GLM_CUDA_FUNC_DEF
635# define GLM_CUDA_FUNC_DECL
636#endif
637
638#if GLM_COMPILER & GLM_COMPILER_GCC
639#define GLM_VAR_USED __attribute__ ((unused))
640#else
641#define GLM_VAR_USED
642#endif
643
644#if(defined(GLM_FORCE_INLINE))
645# if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005))
646# define GLM_INLINE __forceinline
647# elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC34))
648# define GLM_INLINE __attribute__((always_inline))
649# else
650# define GLM_INLINE inline
651# endif//GLM_COMPILER
652#else
653# define GLM_INLINE inline
654#endif//defined(GLM_FORCE_INLINE)
655
656#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL
657#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE
658
659///////////////////////////////////////////////////////////////////////////////////////////////////
660// Swizzle operators
661
662// User defines: GLM_SWIZZLE
663
664#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED))
665# define GLM_MESSAGE_SWIZZLE_DISPLAYED
666# if(GLM_SUPPORT_SWIZZLE_OPERATOR())
667# pragma message("GLM: Swizzling operators enabled")
668# elif(GLM_SUPPORT_SWIZZLE_FUNCTION())
669# pragma message("GLM: Swizzling operators supported through swizzling functions")
670# else
671# pragma message("GLM: Swizzling operators disabled")
672# endif
673#endif//GLM_MESSAGE
674
675#endif//glm_setup