1 /* Copyright 2011 Jukka Jyl�nki
2
3    Licensed under the Apache License, Version 2.0 (the "License");
4    you may not use this file except in compliance with the License.
5    You may obtain a copy of the License at
6
7        http://www.apache.org/licenses/LICENSE-2.0
8
9    Unless required by applicable law or agreed to in writing, software
10    distributed under the License is distributed on an "AS IS" BASIS,
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12    See the License for the specific language governing permissions and
13    limitations under the License. */
14
15 /** @file MathBuildConfig.h
16         @author Jukka Jyl�nki
17         @brief Specifies all build flags for the library. */
18 #pragma once
19
20 // If MATH_ENABLE_NAMESPACE is defined, all math symbols are put inside a namespace.
21 #define MATH_ENABLE_NAMESPACE
22
23 // Adjust this #define to choose the name of the namespace math is given to.
24 // This flag does not have any effect if MATH_ENABLE_NAMESPACE is not defined.
25 #define MATH_NAMESPACE_NAME math
26
27 // If MATH_AUTO_USE_NAMESPACE is defined, a 'using namespace math;' directive is issued in all header files, causing
28 // the math namespace to exist only for internal symbol hiding purposes, and not for external code.
29 // This flag does not have any effect if MATH_ENABLE_NAMESPACE is not defined.
30 #define MATH_AUTO_USE_NAMESPACE
31
32 // Detect if we're building on Windows 8 and mark it in define WIN8 if so.
33 #if defined(WINVER) && !defined(WIN8)
34 #if WINVER >= 0x0602
35 #define WIN8
36 #endif
37 #endif
38
39 // If MATH_ENABLE_WINXP_SUPPORT is defined, we avoid using Windows symbols that require Vista or newer (e.g. GetTickCount64)
40 #if !defined(WIN8) /* Win8 cannot build with XP support - GetTickCount() doesn't exist. */
41 #define MATH_ENABLE_WINXP_SUPPORT
42 #endif
43
44 // If MATH_ASSERT_ON_ASSUME is defined, assume() resolves directly to assert().
45 // When not defined, assume() prints out an error if the condition fails, but continues
46 // execution.
47 //#define MATH_ASSERT_ON_ASSUME
48
49 #ifndef _DEBUG
50 // If MATH_SILENT_ASSUME is defined, all assume() tests are stripped from the build. This
51 // overrides MATH_ASSERT_ON_ASSUME.
52 #ifndef MATH_SILENT_ASSUME
53 #define MATH_SILENT_ASSUME
54 #endif
55
56 // If MATH_ENABLE_INSECURE_OPTIMIZATIONS, several security checks (unsafe index out of bounds accesses etc.) are disabled.
57 // Use this for absolutely fastest performance on MathGeoLib, but only if you know your code is 100% well-formed and uses
58 // MathGeoLib bug-free.
59 // #define MATH_ENABLE_INSECURE_OPTIMIZATIONS
60
61 #endif
62
63 #ifdef _DEBUG
64 // If MATH_ASSERT_CORRECTNESS is defined, special (and possibly rather costly) mathassert()
65 // tests are enabled, which test the internal correctness of the library.
66 #define MATH_ASSERT_CORRECTNESS
67 #endif
68
69 // If FAIL_USING_EXCEPTIONS is defined, all mathassert(), assert() and assume() macros turn into
70 // throwing std::runtime_error exceptions. This macro is used by default when running tests, to get
71 // a runtime error report on which tests pass and which fail.
72 #ifndef FAIL_USING_EXCEPTIONS
73 // #define FAIL_USING_EXCEPTIONS
74 #endif
75
76 // If MATH_ENABLE_STL_SUPPORT is defined, MathGeoLib utilizes STL data structures. Otherwise,
77 // features requiring STL are disabled (but the library can still be built).
78 #ifndef MATH_ENABLE_STL_SUPPORT
79 #define MATH_ENABLE_STL_SUPPORT
80 #endif
81
82 // If MATH_TINYXML_INTEROP is defined, MathGeoLib integrates with TinyXML to provide
83 // serialization and deserialization to XML for the data structures.
84 #ifndef MATH_TINYXML_INTEROP
85 //#define MATH_TINYXML_INTEROP
86 #endif
87
88 // If MATH_CONTAINERLIB_SUPPORT is defined, MathGeoLib integrates with a certain
89 // STL replacement container library. Do not enable, only for internal use.
90 #ifndef MATH_CONTAINERLIB_SUPPORT
91 //#define MATH_CONTAINERLIB_SUPPORT
92 #endif
93
94 // If MATH_GRAPHICSENGINE_INTEROP is defined, MathGeoLib integrates with a certain
95 // graphics engine. Do not enable, only for internal use.
96 #ifndef MATH_GRAPHICSENGINE_INTEROP
97 //#define MATH_GRAPHICSENGINE_INTEROP
98 #endif
99
100 // If KNET_LOGGING_SUPPORT_ENABLED is defined, MathGeoLib utilizes logging functions
101 // from the kNet library.
102 #ifndef KNET_LOGGING_SUPPORT_ENABLED
103 //#define KNET_LOGGING_SUPPORT_ENABLED
104 #endif
105
106 // If MATH_USE_DIRECT3D is defined, the Frustum class defaults to creating Frustums with projectiveSpace = FrustumSpaceD3D.
107 #ifndef MATH_USE_DIRECT3D
108 //#define MATH_USE_DIRECT3D
109 #endif
110 // If MATH_USE_OPENGL is defined, the Frustum class defaults to creating Frustums with projectiveSpace = FrustumSpaceGL.
111 #ifndef MATH_USE_OPENGL
112 //#define MATH_USE_OPENGL
113 #endif
114
115 // If MATH_LEFTHANDED_CAMERA is defined, the Frustum class defaults to creating Frustums with handedness = FrustumLeftHanded.
116 #ifndef MATH_LEFTHANDED_CAMERA
117 //#define MATH_LEFTHANDED_CAMERA
118 #endif
119 // If MATH_RIGHTHANDED_CAMERA is defined, the Frustum class defaults to creating Frustums with handedness = FrustumRightHanded.
120 #ifndef MATH_RIGHTHANDED_CAMERA
121 //#define MATH_RIGHTHANDED_CAMERA
122 #endif
123
124 #if defined(MATH_USE_DIRECT3D) && defined(MATH_USE_OPENGL)
125 #error Defines MATH_USE_DIRECT3D and MATH_USE_OPENGL are mutually exclusive!
126 #endif
127
128 #if defined(MATH_LEFTHANDED_CAMERA) && defined(MATH_RIGHTHANDED_CAMERA)
129 #error Defines MATH_LEFTHANDED_CAMERA and MATH_RIGHTHANDED_CAMERA are mutually exclusive!
130 #endif
131
132 // Uncomment to specify the SIMD instruction set level in use.
133 //#define MATH_AVX
134 //#define MATH_SSE41
135 //#define MATH_SSE3
136 //#define MATH_SSE2
137 //#define MATH_SSE // SSE1.
138
139 ///\todo Test iOS support.
140 ///\todo Enable NEON only on ARMv7, not older.
141 //#if (defined(ANDROID) && defined(__ARM_ARCH_7A__)) || (defined(WIN8RT) && defined(_M_ARM))
142 //#define MATH_NEON
143 #ifdef MATH_NEON
144 #include <arm_neon.h>
145 #endif
146
147 // MATH_AVX implies MATH_SSE41, which implies MATH_SSE3, which implies MATH_SSE2, which implies MATH_SSE.
148 #ifdef MATH_AVX
149 #if defined(__GNUC__) || defined(__clang__)
150 #include <immintrin.h>
151 #endif
152 #ifndef MATH_SSE41
153 #define MATH_SSE41
154 #endif
155 #ifndef MATH_SSE3
156 #define MATH_SSE3
157 #endif
158 #ifndef MATH_SSE2
159 #define MATH_SSE2
160 #endif
161 #ifndef MATH_SSE
162 #define MATH_SSE
163 #endif
164 #endif
165
166 #ifdef MATH_SSE41
167 #ifndef MATH_SSE3
168 #define MATH_SSE3
169 #endif
170 #ifndef MATH_SSE2
171 #define MATH_SSE2
172 #endif
173 #ifndef MATH_SSE
174 #define MATH_SSE
175 #endif
176 #endif
177
178 #ifdef MATH_SSE3
179 #ifdef _MSC_VER
180 #include <intrin.h>
181 #else
182 #include <pmmintrin.h>
183 #endif
184 #ifndef MATH_SSE2
185 #define MATH_SSE2
186 #endif
187 #ifndef MATH_SSE
188 #define MATH_SSE
189 #endif
190 #endif
191
192 #ifdef MATH_SSE2
193 #ifndef MATH_SSE
194 #define MATH_SSE
195 #endif
196 #include <emmintrin.h>
197 #endif
198
199 #ifdef MATH_SSE
200 #include <xmmintrin.h>
201 #endif
202
203 #if defined(MATH_SSE) || defined(MATH_NEON)
204 #define MATH_SIMD // A common #define to signal the simd4f type is available.
205
206 #ifdef MATH_NEON
207 typedef float32x4_t simd4f;
208 #elif defined(MATH_SSE)
209 typedef __m128 simd4f;
210 #endif
211
212 #endif
213
214 #if defined(MATH_SIMD) && !defined(MATH_AUTOMATIC_SSE)
215 // Automatically use the SSE-optimized operations for all code.
216 // This should only be disabled for benchmarking purposes.
217 #define MATH_AUTOMATIC_SSE
218 #endif
219
220 #include "Math/MathTypes.h"

Go back to previous page