1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 
7 #ifndef DIRECTXMATH_H
8 #define DIRECTXMATH_H
9 
10 #ifndef __cplusplus
11 #error DirectX Math requires C++
12 #endif
13 
14 #include <stdint.h>
15 
16 #define DIRECTX_MATH_VERSION 314
17 
18 #define XM_CONST const
19 #if __cplusplus >= 201103L
20 #define XM_CONSTEXPR constexpr
21 #else
22 #define XM_CONSTEXPR
23 #endif
24 
25 namespace DirectX {
26 
27 struct XMFLOAT2 {
28   float x, y;
29   XMFLOAT2() = default;
30   XMFLOAT2(const XMFLOAT2&) = default;
31   XMFLOAT2& operator=(const XMFLOAT2&) = default;
32   XMFLOAT2(XMFLOAT2&&) = default;
33   XMFLOAT2& operator=(XMFLOAT2&&) = default;
XMFLOAT2XMFLOAT234   XM_CONSTEXPR XMFLOAT2(float _x, float _y) : x(_x), y(_y) {}
XMFLOAT2XMFLOAT235   explicit XMFLOAT2(const float *pArray) : x(pArray[0]), y(pArray[1]) {}
36 };
37 
38 struct __attribute__ ((__aligned__ (16))) XMFLOAT2A : public XMFLOAT2 {
39   XMFLOAT2A() = default;
40   XMFLOAT2A(const XMFLOAT2A&) = default;
41   XMFLOAT2A& operator=(const XMFLOAT2A&) = default;
42   XMFLOAT2A(XMFLOAT2A&&) = default;
43   XMFLOAT2A& operator=(XMFLOAT2A&&) = default;
XMFLOAT2AXMFLOAT2A44   XM_CONSTEXPR XMFLOAT2A(float _x, float _y) : XMFLOAT2(_x, _y) {}
XMFLOAT2AXMFLOAT2A45   explicit XMFLOAT2A(const float *pArray) : XMFLOAT2(pArray) {}
46 };
47 
48 struct XMINT2 {
49   int32_t x, y;
50   XMINT2() = default;
51   XMINT2(const XMINT2&) = default;
52   XMINT2& operator=(const XMINT2&) = default;
53   XMINT2(XMINT2&&) = default;
54   XMINT2& operator=(XMINT2&&) = default;
XMINT2XMINT255   XM_CONSTEXPR XMINT2(int32_t _x, int32_t _y) : x(_x), y(_y) {}
XMINT2XMINT256   explicit XMINT2(const int32_t *pArray) : x(pArray[0]), y(pArray[1]) {}
57 };
58 
59 struct XMUINT2 {
60   uint32_t x, y;
61   XMUINT2() = default;
62   XMUINT2(const XMUINT2&) = default;
63   XMUINT2& operator=(const XMUINT2&) = default;
64   XMUINT2(XMUINT2&&) = default;
65   XMUINT2& operator=(XMUINT2&&) = default;
XMUINT2XMUINT266   XM_CONSTEXPR XMUINT2(uint32_t _x, uint32_t _y) : x(_x), y(_y) {}
XMUINT2XMUINT267   explicit XMUINT2(const uint32_t *pArray) : x(pArray[0]), y(pArray[1]) {}
68 };
69 
70 struct XMFLOAT3 {
71   float x, y, z;
72   XMFLOAT3() = default;
73   XMFLOAT3(const XMFLOAT3&) = default;
74   XMFLOAT3& operator=(const XMFLOAT3&) = default;
75   XMFLOAT3(XMFLOAT3&&) = default;
76   XMFLOAT3& operator=(XMFLOAT3&&) = default;
XMFLOAT3XMFLOAT377   XM_CONSTEXPR XMFLOAT3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {}
XMFLOAT3XMFLOAT378   explicit XMFLOAT3(const float *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]) {}
79 };
80 
81 struct __attribute__ ((__aligned__ (16))) XMFLOAT3A : public XMFLOAT3 {
82   XMFLOAT3A() = default;
83   XMFLOAT3A(const XMFLOAT3A&) = default;
84   XMFLOAT3A& operator=(const XMFLOAT3A&) = default;
85   XMFLOAT3A(XMFLOAT3A&&) = default;
86   XMFLOAT3A& operator=(XMFLOAT3A&&) = default;
XMFLOAT3AXMFLOAT3A87   XM_CONSTEXPR XMFLOAT3A(float _x, float _y, float _z) : XMFLOAT3(_x, _y, _z) {}
XMFLOAT3AXMFLOAT3A88   explicit XMFLOAT3A(const float *pArray) : XMFLOAT3(pArray) {}
89 };
90 
91 struct XMINT3 {
92   int32_t x, y, z;
93   XMINT3() = default;
94   XMINT3(const XMINT3&) = default;
95   XMINT3& operator=(const XMINT3&) = default;
96   XMINT3(XMINT3&&) = default;
97   XMINT3& operator=(XMINT3&&) = default;
XMINT3XMINT398   XM_CONSTEXPR XMINT3(int32_t _x, int32_t _y, int32_t _z) : x(_x), y(_y), z(_z) {}
XMINT3XMINT399   explicit XMINT3(const int32_t *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]) {}
100 };
101 
102 struct XMUINT3 {
103   uint32_t x, y, z;
104   XMUINT3() = default;
105   XMUINT3(const XMUINT3&) = default;
106   XMUINT3& operator=(const XMUINT3&) = default;
107   XMUINT3(XMUINT3&&) = default;
108   XMUINT3& operator=(XMUINT3&&) = default;
XMUINT3XMUINT3109   XM_CONSTEXPR XMUINT3(uint32_t _x, uint32_t _y, uint32_t _z) : x(_x), y(_y), z(_z) {}
XMUINT3XMUINT3110   explicit XMUINT3(const uint32_t *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]) {}
111 };
112 
113 struct XMFLOAT4 {
114   float x, y, z, w;
115   XMFLOAT4() = default;
116   XMFLOAT4(const XMFLOAT4&) = default;
117   XMFLOAT4& operator=(const XMFLOAT4&) = default;
118   XMFLOAT4(XMFLOAT4&&) = default;
119   XMFLOAT4& operator=(XMFLOAT4&&) = default;
XMFLOAT4XMFLOAT4120   XM_CONSTEXPR XMFLOAT4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) {}
XMFLOAT4XMFLOAT4121   explicit XMFLOAT4(const float *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
122 };
123 
124 struct __attribute__ ((__aligned__ (16))) XMFLOAT4A : public XMFLOAT4 {
125   XMFLOAT4A() = default;
126   XMFLOAT4A(const XMFLOAT4A&) = default;
127   XMFLOAT4A& operator=(const XMFLOAT4A&) = default;
128   XMFLOAT4A(XMFLOAT4A&&) = default;
129   XMFLOAT4A& operator=(XMFLOAT4A&&) = default;
XMFLOAT4AXMFLOAT4A130   XM_CONSTEXPR XMFLOAT4A(float _x, float _y, float _z, float _w) : XMFLOAT4(_x, _y, _z, _w) {}
XMFLOAT4AXMFLOAT4A131   explicit XMFLOAT4A(const float *pArray) : XMFLOAT4(pArray) {}
132 };
133 
134 struct XMINT4 {
135   int32_t x, y, z, w;
136   XMINT4() = default;
137   XMINT4(const XMINT4&) = default;
138   XMINT4& operator=(const XMINT4&) = default;
139   XMINT4(XMINT4&&) = default;
140   XMINT4& operator=(XMINT4&&) = default;
XMINT4XMINT4141   XM_CONSTEXPR XMINT4(int32_t _x, int32_t _y, int32_t _z, int32_t _w) : x(_x), y(_y), z(_z), w(_w) {}
XMINT4XMINT4142   explicit XMINT4(const int32_t *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
143 };
144 
145 struct XMUINT4 {
146   uint32_t x, y, z, w;
147   XMUINT4() = default;
148   XMUINT4(const XMUINT4&) = default;
149   XMUINT4& operator=(const XMUINT4&) = default;
150   XMUINT4(XMUINT4&&) = default;
151   XMUINT4& operator=(XMUINT4&&) = default;
XMUINT4XMUINT4152   XM_CONSTEXPR XMUINT4(uint32_t _x, uint32_t _y, uint32_t _z, uint32_t _w) : x(_x), y(_y), z(_z), w(_w) {}
XMUINT4XMUINT4153   explicit XMUINT4(const uint32_t *pArray) : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {}
154 };
155 
156 struct XMFLOAT3X3 {
157   union
158   {
159     struct
160     {
161       float _11, _12, _13;
162       float _21, _22, _23;
163       float _31, _32, _33;
164     };
165     float m[3][3];
166   };
167 
168   XMFLOAT3X3() = default;
169   XMFLOAT3X3(const XMFLOAT3X3&) = default;
170   XMFLOAT3X3& operator=(const XMFLOAT3X3&) = default;
171   XMFLOAT3X3(XMFLOAT3X3&&) = default;
172   XMFLOAT3X3& operator=(XMFLOAT3X3&&) = default;
XMFLOAT3X3XMFLOAT3X3173   XM_CONSTEXPR XMFLOAT3X3(
174     float m00, float m01, float m02,
175     float m10, float m11, float m12,
176     float m20, float m21, float m22)
177     : _11(m00), _12(m01), _13(m02),
178       _21(m10), _22(m11), _23(m12),
179       _31(m20), _32(m21), _33(m22) {}
180   explicit XMFLOAT3X3(const float *pArray);
operatorXMFLOAT3X3181   float operator() (size_t Row, size_t Column) const { return m[Row][Column]; }
operatorXMFLOAT3X3182   float& operator() (size_t Row, size_t Column) { return m[Row][Column]; }
183   };
184 
185 struct XMFLOAT4X3 {
186   union
187   {
188     struct
189     {
190       float _11, _12, _13;
191       float _21, _22, _23;
192       float _31, _32, _33;
193       float _41, _42, _43;
194     };
195     float m[4][3];
196     float f[12];
197   };
198 
199   XMFLOAT4X3() = default;
200   XMFLOAT4X3(const XMFLOAT4X3&) = default;
201   XMFLOAT4X3& operator=(const XMFLOAT4X3&) = default;
202   XMFLOAT4X3(XMFLOAT4X3&&) = default;
203   XMFLOAT4X3& operator=(XMFLOAT4X3&&) = default;
XMFLOAT4X3XMFLOAT4X3204   XM_CONSTEXPR XMFLOAT4X3(
205     float m00, float m01, float m02,
206     float m10, float m11, float m12,
207     float m20, float m21, float m22,
208     float m30, float m31, float m32)
209     : _11(m00), _12(m01), _13(m02),
210       _21(m10), _22(m11), _23(m12),
211       _31(m20), _32(m21), _33(m22),
212       _41(m30), _42(m31), _43(m32) {}
213   explicit XMFLOAT4X3(const float *pArray);
operatorXMFLOAT4X3214   float operator() (size_t Row, size_t Column) const { return m[Row][Column]; }
operatorXMFLOAT4X3215   float& operator() (size_t Row, size_t Column) { return m[Row][Column]; }
216 };
217 
218 struct __attribute__ ((__aligned__ (16))) XMFLOAT4X3A : public XMFLOAT4X3 {
219   XMFLOAT4X3A() = default;
220   XMFLOAT4X3A(const XMFLOAT4X3A&) = default;
221   XMFLOAT4X3A& operator=(const XMFLOAT4X3A&) = default;
222   XMFLOAT4X3A(XMFLOAT4X3A&&) = default;
223   XMFLOAT4X3A& operator=(XMFLOAT4X3A&&) = default;
XMFLOAT4X3AXMFLOAT4X3A224   XM_CONSTEXPR XMFLOAT4X3A(
225     float m00, float m01, float m02,
226     float m10, float m11, float m12,
227     float m20, float m21, float m22,
228     float m30, float m31, float m32) :
229     XMFLOAT4X3(m00,m01,m02,m10,m11,m12,m20,m21,m22,m30,m31,m32) {}
XMFLOAT4X3AXMFLOAT4X3A230   explicit XMFLOAT4X3A(const float *pArray) : XMFLOAT4X3(pArray) {}
231 };
232 
233 struct XMFLOAT3X4 {
234   union
235   {
236     struct
237     {
238       float _11, _12, _13, _14;
239       float _21, _22, _23, _24;
240       float _31, _32, _33, _34;
241     };
242     float m[3][4];
243     float f[12];
244   };
245 
246   XMFLOAT3X4() = default;
247   XMFLOAT3X4(const XMFLOAT3X4&) = default;
248   XMFLOAT3X4& operator=(const XMFLOAT3X4&) = default;
249   XMFLOAT3X4(XMFLOAT3X4&&) = default;
250   XMFLOAT3X4& operator=(XMFLOAT3X4&&) = default;
XMFLOAT3X4XMFLOAT3X4251   XM_CONSTEXPR XMFLOAT3X4(
252     float m00, float m01, float m02, float m03,
253     float m10, float m11, float m12, float m13,
254     float m20, float m21, float m22, float m23)
255     : _11(m00), _12(m01), _13(m02), _14(m03),
256       _21(m10), _22(m11), _23(m12), _24(m13),
257       _31(m20), _32(m21), _33(m22), _34(m23) {}
258   explicit XMFLOAT3X4(const float *pArray);
operatorXMFLOAT3X4259   float operator() (size_t Row, size_t Column) const { return m[Row][Column]; }
operatorXMFLOAT3X4260   float& operator() (size_t Row, size_t Column) { return m[Row][Column]; }
261 };
262 
263 struct __attribute__ ((__aligned__ (16))) XMFLOAT3X4A : public XMFLOAT3X4 {
264   XMFLOAT3X4A() = default;
265   XMFLOAT3X4A(const XMFLOAT3X4A&) = default;
266   XMFLOAT3X4A& operator=(const XMFLOAT3X4A&) = default;
267   XMFLOAT3X4A(XMFLOAT3X4A&&) = default;
268   XMFLOAT3X4A& operator=(XMFLOAT3X4A&&) = default;
XMFLOAT3X4AXMFLOAT3X4A269   XM_CONSTEXPR XMFLOAT3X4A(
270     float m00, float m01, float m02, float m03,
271     float m10, float m11, float m12, float m13,
272     float m20, float m21, float m22, float m23) :
273     XMFLOAT3X4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23) {}
XMFLOAT3X4AXMFLOAT3X4A274   explicit XMFLOAT3X4A(const float *pArray) : XMFLOAT3X4(pArray) {}
275 };
276 
277 struct XMFLOAT4X4 {
278   union
279   {
280     struct
281     {
282       float _11, _12, _13, _14;
283       float _21, _22, _23, _24;
284       float _31, _32, _33, _34;
285       float _41, _42, _43, _44;
286     };
287     float m[4][4];
288   };
289 
290   XMFLOAT4X4() = default;
291   XMFLOAT4X4(const XMFLOAT4X4&) = default;
292   XMFLOAT4X4& operator=(const XMFLOAT4X4&) = default;
293   XMFLOAT4X4(XMFLOAT4X4&&) = default;
294   XMFLOAT4X4& operator=(XMFLOAT4X4&&) = default;
XMFLOAT4X4XMFLOAT4X4295   XM_CONSTEXPR XMFLOAT4X4(
296     float m00, float m01, float m02, float m03,
297     float m10, float m11, float m12, float m13,
298     float m20, float m21, float m22, float m23,
299     float m30, float m31, float m32, float m33)
300     : _11(m00), _12(m01), _13(m02), _14(m03),
301       _21(m10), _22(m11), _23(m12), _24(m13),
302       _31(m20), _32(m21), _33(m22), _34(m23),
303       _41(m30), _42(m31), _43(m32), _44(m33) {}
304   explicit XMFLOAT4X4(const float *pArray);
operatorXMFLOAT4X4305   float operator() (size_t Row, size_t Column) const { return m[Row][Column]; }
operatorXMFLOAT4X4306   float& operator() (size_t Row, size_t Column) { return m[Row][Column]; }
307 };
308 
309 struct __attribute__ ((__aligned__ (16))) XMFLOAT4X4A : public XMFLOAT4X4 {
310   XMFLOAT4X4A() = default;
311   XMFLOAT4X4A(const XMFLOAT4X4A&) = default;
312   XMFLOAT4X4A& operator=(const XMFLOAT4X4A&) = default;
313   XMFLOAT4X4A(XMFLOAT4X4A&&) = default;
314   XMFLOAT4X4A& operator=(XMFLOAT4X4A&&) = default;
XMFLOAT4X4AXMFLOAT4X4A315   XM_CONSTEXPR XMFLOAT4X4A(
316     float m00, float m01, float m02, float m03,
317     float m10, float m11, float m12, float m13,
318     float m20, float m21, float m22, float m23,
319     float m30, float m31, float m32, float m33)
320     : XMFLOAT4X4(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33) {}
XMFLOAT4X4AXMFLOAT4X4A321   explicit XMFLOAT4X4A(const float *pArray) : XMFLOAT4X4(pArray) {}
322 };
323 
324 } /* namespace DirectX */
325 
326 #endif /* DIRECTXMATH_H */
327