PageRenderTime 71ms CodeModel.GetById 20ms app.highlight 22ms RepoModel.GetById 0ms app.codeStats 1ms

/glm/core/setup.hpp

https://bitbucket.org/ggerganov/test_opengl
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