1 /* Copyright 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 MathFwd.h
16         @author Jukka Jyl�nki
17         @brief */
18 #pragma once
19
20 #include "MathBuildConfig.h"
21 #include "Math/MathNamespace.h"
22
23 #include <stddef.h>
24
25 // Very annoying to have to do this, but <iosfwd> doesn't have a fwddecl for std::vector,
26 // and forward-declaring it manually is not allowed, see http://stackoverflow.com/questions/307343/forward-declare-an-stl-container
27 #include <vector>
28
29 // The CONST_WIN32 is a #define which resolves to 'const' on Windows, and null on other
30 // platforms. This #define is used on Windows to detect accidental programming errors
31 // occurring from an expression "const float3 vec; vec[1] = 5;". Trying to return
32 // const float from operator[] on GCC gives a warning "type qualifiers ignored on function return type",
33 // so hence this is only enabled on Visual Studio.
34 #ifdef _MSC_VER
35 #define CONST_WIN32 const
36 #else
37 #define CONST_WIN32
38 #endif
39
40 #ifdef _MSC_VER
41 #define NAMELESS_UNION_BEGIN \
42         __pragma(warning(push)) \
43         __pragma(warning(disable:4201))
44
45 #define NAMELESS_UNION_END \
46         __pragma(warning(pop))
47
48 #else
49
50 #define NAMELESS_UNION_BEGIN union {
51 #define NAMELESS_UNION_END };
52
53 #endif
54
55 #if !defined(MATH_ENABLE_STL_SUPPORT) && !defined(assert)
56 #include <stdio.h>
57 #define assert(x) do { if (!(x)) { printf("Error: assert(%s) failed!\n", #x); } } while(0)
58 #endif
59
60 MATH_BEGIN_NAMESPACE
61
62 class float2;
63 class float3;
64 class float4;
65 class float2x2;
66 class float2x3;
67 class float3x3;
68 class float3x4;
69 class float4x4;
70 class Quat;
71
72 class TranslateOp;
73 class ScaleOp;
74
75 template<int N>
76 class PBVolume;
77
78 class AABB;
79 class Capsule;
80 class Circle;
81 class Cone;
82 class Cylinder;
83 class Ellipsoid;
84 class Frustum;
85 struct HitInfo;
86 class Line;
87 class LineSegment;
88 class OBB;
89 class Plane;
90 class Polygon;
91 class Polyhedron;
92 class Polynomial;
93 class Quat;
94 class Ray;
95 class Sphere;
96 class TranslateOp;
97 class Torus;
98 class ScaleOp;
99 class Triangle;
100 class LCG;
101
102 struct float4_storage;
103
104 #define IS16ALIGNED(x) ((((uintptr_t)(x)) & 0xF) == 0)
105 #define IS32ALIGNED(x) ((((uintptr_t)(x)) & 0x1F) == 0)
106 #define IS64ALIGNED(x) ((((uintptr_t)(x)) & 0x3F) == 0)
107
108 #ifdef MATH_SIMD
109
110 #ifdef MATH_AVX
111 #define ALIGN_MAT ALIGN32
112 #define MAT_ALIGNMENT 32
113 #define IS_MAT_ALIGNED(x) IS32ALIGNED(x)
114 #else
115 #define ALIGN_MAT ALIGN16
116 #define MAT_ALIGNMENT 16
117 #define IS_MAT_ALIGNED(x) IS16ALIGNED(x)
118 #endif
119
120 #ifdef _MSC_VER
121 #define ALIGN16 __declspec(align(16))
122 #define ALIGN32 __declspec(align(32))
123 #define ALIGN64 __declspec(align(64))
124 #else
125 #define ALIGN16 __attribute__((aligned(16)))
126 #define ALIGN32 __attribute__((aligned(32)))
127 #define ALIGN64 __attribute__((aligned(64)))
128 #endif
129
130 #else
131
132 #define ALIGN16
133 #define ALIGN32
134 #define ALIGN64
135 #define ALIGN_MAT
136 #define IS_MAT_ALIGNED(x) true
137
138 #endif
139
140 #ifdef MATH_AUTOMATIC_SSE
141
142 #ifndef MATH_VEC_IS_FLOAT4
143 #define MATH_VEC_IS_FLOAT4
144 #endif
145
146 typedef ALIGN16 float4 vec;
147 typedef float4_storage vec_storage;
148
149 #else
150
151 typedef float3 vec;
152 typedef float3 vec_storage;
153
154 #endif
155
156 template<class T, size_t Alignment>
157 struct AlignedAllocator;
158
159 struct Triangle_storage;
160 struct LineSegment_storage;
161
162 // VS2010+VS2012/old C++ standard issue with aligning data inside a std::vector, work around it.
163 #if defined(_MSC_VER) && _MSC_VER < 1800 /*VS2013*/
164 typedef std::vector<Triangle_storage, AlignedAllocator<Triangle_storage, 16> > TriangleArray;
165 typedef std::vector<LineSegment_storage, AlignedAllocator<LineSegment_storage, 16> > LineSegmentArray;
166 typedef std::vector<float4_storage, AlignedAllocator<float4_storage, 16> > Float4Array;
167 #ifdef MATH_AUTOMATIC_SSE
168 typedef std::vector<float4_storage, AlignedAllocator<float4_storage, 16> > VecArray;
169 #endif
170 #else
171 typedef std::vector<Triangle> TriangleArray;
172 typedef std::vector<LineSegment> LineSegmentArray;
173 typedef std::vector<float4> Float4Array;
174 #ifdef MATH_AUTOMATIC_SSE
175 typedef std::vector<float4> VecArray;
176 #endif
177 #endif
178
179 #if !defined(MATH_AUTOMATIC_SSE)
180 typedef std::vector<float3> VecArray;
181 #endif
182
183 MATH_END_NAMESPACE
184
185 #ifdef MATH_GRAPHICSENGINE_INTEROP
186 class VertexBuffer;
187 #endif
188
189 #ifdef MATH_ENABLE_STL_SUPPORT
190 #include <iosfwd>
191 #endif

Go back to previous page