master
ブランチ master
VulkanExample / dep / include / glm / detail / type_mat2x2.inl
12.1 KB、424行 生 Blame 履歴
1#include "../matrix.hpp"
2
3namespace glm
4{
5 // -- Constructors --
6
7# if GLM_CONFIG_CTOR_INIT == GLM_ENABLE
8 template<typename T, qualifier Q>
9 GLM_DEFAULTED_DEFAULT_CTOR_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat()
10 : value{col_type(1, 0), col_type(0, 1)}
11 {}
12# endif
13
14 template<typename T, qualifier Q>
15 template<qualifier P>
16 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, T, P> const& m)
17 : value{col_type(m[0]), col_type(m[1])}
18 {}
19
20 template<typename T, qualifier Q>
21 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(T scalar)
22 : value{col_type(scalar, 0), col_type(0, scalar)}
23 {}
24
25 template<typename T, qualifier Q>
26 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat
27 (
28 T const& x0, T const& y0,
29 T const& x1, T const& y1
30 )
31 : value{col_type(x0, y0), col_type(x1, y1)}
32 {}
33
34 template<typename T, qualifier Q>
35 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(col_type const& v0, col_type const& v1)
36 : value{v0, v1}
37 {}
38
39 // -- Conversion constructors --
40
41 template<typename T, qualifier Q>
42 template<typename X1, typename Y1, typename X2, typename Y2>
43 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat
44 (
45 X1 const& x1, Y1 const& y1,
46 X2 const& x2, Y2 const& y2
47 )
48 : value{col_type(static_cast<T>(x1), value_type(y1)), col_type(static_cast<T>(x2), value_type(y2)) }
49 {}
50
51 template<typename T, qualifier Q>
52 template<typename V1, typename V2>
53 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(vec<2, V1, Q> const& v1, vec<2, V2, Q> const& v2)
54 : value{col_type(v1), col_type(v2)}
55 {}
56
57 // -- mat2x2 matrix conversions --
58
59 template<typename T, qualifier Q>
60 template<typename U, qualifier P>
61 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 2, U, P> const& m)
62 : value{col_type(m[0]), col_type(m[1])}
63 {}
64
65 template<typename T, qualifier Q>
66 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 3, T, Q> const& m)
67 : value{col_type(m[0]), col_type(m[1])}
68 {}
69
70 template<typename T, qualifier Q>
71 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 4, T, Q> const& m)
72 : value{col_type(m[0]), col_type(m[1])}
73 {}
74
75 template<typename T, qualifier Q>
76 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 3, T, Q> const& m)
77 : value{col_type(m[0]), col_type(m[1])}
78 {}
79
80 template<typename T, qualifier Q>
81 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 2, T, Q> const& m)
82 : value{col_type(m[0]), col_type(m[1])}
83 {}
84
85 template<typename T, qualifier Q>
86 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<2, 4, T, Q> const& m)
87 : value{col_type(m[0]), col_type(m[1])}
88 {}
89
90 template<typename T, qualifier Q>
91 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 2, T, Q> const& m)
92 : value{col_type(m[0]), col_type(m[1])}
93 {}
94
95 template<typename T, qualifier Q>
96 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<3, 4, T, Q> const& m)
97 : value{col_type(m[0]), col_type(m[1])}
98 {}
99
100 template<typename T, qualifier Q>
101 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>::mat(mat<4, 3, T, Q> const& m)
102 : value{col_type(m[0]), col_type(m[1])}
103 {}
104
105 // -- Accesses --
106
107 template<typename T, qualifier Q>
108 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) noexcept
109 {
110 GLM_ASSERT_LENGTH(i, this->length());
111 return this->value[i];
112 }
113
114 template<typename T, qualifier Q>
115 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type const& mat<2, 2, T, Q>::operator[](typename mat<2, 2, T, Q>::length_type i) const noexcept
116 {
117 GLM_ASSERT_LENGTH(i, this->length());
118 return this->value[i];
119 }
120
121 // -- Unary updatable operators --
122
123 template<typename T, qualifier Q>
124 template<typename U>
125 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator=(mat<2, 2, U, Q> const& m)
126 {
127 this->value[0] = m[0];
128 this->value[1] = m[1];
129 return *this;
130 }
131
132 template<typename T, qualifier Q>
133 template<typename U>
134 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(U scalar)
135 {
136 this->value[0] += scalar;
137 this->value[1] += scalar;
138 return *this;
139 }
140
141 template<typename T, qualifier Q>
142 template<typename U>
143 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator+=(mat<2, 2, U, Q> const& m)
144 {
145 this->value[0] += m[0];
146 this->value[1] += m[1];
147 return *this;
148 }
149
150 template<typename T, qualifier Q>
151 template<typename U>
152 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(U scalar)
153 {
154 this->value[0] -= scalar;
155 this->value[1] -= scalar;
156 return *this;
157 }
158
159 template<typename T, qualifier Q>
160 template<typename U>
161 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator-=(mat<2, 2, U, Q> const& m)
162 {
163 this->value[0] -= m[0];
164 this->value[1] -= m[1];
165 return *this;
166 }
167
168 template<typename T, qualifier Q>
169 template<typename U>
170 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(U scalar)
171 {
172 this->value[0] *= scalar;
173 this->value[1] *= scalar;
174 return *this;
175 }
176
177 template<typename T, qualifier Q>
178 template<typename U>
179 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator*=(mat<2, 2, U, Q> const& m)
180 {
181 return (*this = *this * m);
182 }
183
184 template<typename T, qualifier Q>
185 template<typename U>
186 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(U scalar)
187 {
188 this->value[0] /= scalar;
189 this->value[1] /= scalar;
190 return *this;
191 }
192
193 template<typename T, qualifier Q>
194 template<typename U>
195 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator/=(mat<2, 2, U, Q> const& m)
196 {
197 return *this *= inverse(m);
198 }
199
200 // -- Increment and decrement operators --
201
202 template<typename T, qualifier Q>
203 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator++()
204 {
205 ++this->value[0];
206 ++this->value[1];
207 return *this;
208 }
209
210 template<typename T, qualifier Q>
211 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q>& mat<2, 2, T, Q>::operator--()
212 {
213 --this->value[0];
214 --this->value[1];
215 return *this;
216 }
217
218 template<typename T, qualifier Q>
219 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> mat<2, 2, T, Q>::operator++(int)
220 {
221 mat<2, 2, T, Q> Result(*this);
222 ++*this;
223 return Result;
224 }
225
226 template<typename T, qualifier Q>
227 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> mat<2, 2, T, Q>::operator--(int)
228 {
229 mat<2, 2, T, Q> Result(*this);
230 --*this;
231 return Result;
232 }
233
234 // -- Unary arithmetic operators --
235
236 template<typename T, qualifier Q>
237 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m)
238 {
239 return m;
240 }
241
242 template<typename T, qualifier Q>
243 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m)
244 {
245 return mat<2, 2, T, Q>(
246 -m[0],
247 -m[1]);
248 }
249
250 // -- Binary arithmetic operators --
251
252 template<typename T, qualifier Q>
253 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m, T scalar)
254 {
255 return mat<2, 2, T, Q>(
256 m[0] + scalar,
257 m[1] + scalar);
258 }
259
260 template<typename T, qualifier Q>
261 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator+(T scalar, mat<2, 2, T, Q> const& m)
262 {
263 return mat<2, 2, T, Q>(
264 m[0] + scalar,
265 m[1] + scalar);
266 }
267
268 template<typename T, qualifier Q>
269 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator+(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
270 {
271 return mat<2, 2, T, Q>(
272 m1[0] + m2[0],
273 m1[1] + m2[1]);
274 }
275
276 template<typename T, qualifier Q>
277 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m, T scalar)
278 {
279 return mat<2, 2, T, Q>(
280 m[0] - scalar,
281 m[1] - scalar);
282 }
283
284 template<typename T, qualifier Q>
285 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator-(T scalar, mat<2, 2, T, Q> const& m)
286 {
287 return mat<2, 2, T, Q>(
288 scalar - m[0],
289 scalar - m[1]);
290 }
291
292 template<typename T, qualifier Q>
293 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator-(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
294 {
295 return mat<2, 2, T, Q>(
296 m1[0] - m2[0],
297 m1[1] - m2[1]);
298 }
299
300 template<typename T, qualifier Q>
301 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m, T scalar)
302 {
303 return mat<2, 2, T, Q>(
304 m[0] * scalar,
305 m[1] * scalar);
306 }
307
308 template<typename T, qualifier Q>
309 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator*(T scalar, mat<2, 2, T, Q> const& m)
310 {
311 return mat<2, 2, T, Q>(
312 m[0] * scalar,
313 m[1] * scalar);
314 }
315
316 template<typename T, qualifier Q>
317 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type operator*
318 (
319 mat<2, 2, T, Q> const& m,
320 typename mat<2, 2, T, Q>::row_type const& v
321 )
322 {
323 return vec<2, T, Q>(
324 m[0][0] * v.x + m[1][0] * v.y,
325 m[0][1] * v.x + m[1][1] * v.y);
326 }
327
328 template<typename T, qualifier Q>
329 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::row_type operator*
330 (
331 typename mat<2, 2, T, Q>::col_type const& v,
332 mat<2, 2, T, Q> const& m
333 )
334 {
335 return vec<2, T, Q>(
336 v.x * m[0][0] + v.y * m[0][1],
337 v.x * m[1][0] + v.y * m[1][1]);
338 }
339
340 template<typename T, qualifier Q>
341 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
342 {
343 return mat<2, 2, T, Q>(
344 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
345 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
346 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
347 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);
348 }
349
350 template<typename T, qualifier Q>
351 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<3, 2, T, Q> const& m2)
352 {
353 return mat<3, 2, T, Q>(
354 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
355 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
356 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
357 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
358 m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
359 m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]);
360 }
361
362 template<typename T, qualifier Q>
363 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 2, T, Q> operator*(mat<2, 2, T, Q> const& m1, mat<4, 2, T, Q> const& m2)
364 {
365 return mat<4, 2, T, Q>(
366 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
367 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
368 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
369 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
370 m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
371 m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
372 m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
373 m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]);
374 }
375
376 template<typename T, qualifier Q>
377 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m, T scalar)
378 {
379 return mat<2, 2, T, Q>(
380 m[0] / scalar,
381 m[1] / scalar);
382 }
383
384 template<typename T, qualifier Q>
385 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator/(T scalar, mat<2, 2, T, Q> const& m)
386 {
387 return mat<2, 2, T, Q>(
388 scalar / m[0],
389 scalar / m[1]);
390 }
391
392 template<typename T, qualifier Q>
393 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::col_type operator/(mat<2, 2, T, Q> const& m, typename mat<2, 2, T, Q>::row_type const& v)
394 {
395 return inverse(m) * v;
396 }
397
398 template<typename T, qualifier Q>
399 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<2, 2, T, Q>::row_type operator/(typename mat<2, 2, T, Q>::col_type const& v, mat<2, 2, T, Q> const& m)
400 {
401 return v * inverse(m);
402 }
403
404 template<typename T, qualifier Q>
405 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 2, T, Q> operator/(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
406 {
407 mat<2, 2, T, Q> m1_copy(m1);
408 return m1_copy /= m2;
409 }
410
411 // -- Boolean operators --
412
413 template<typename T, qualifier Q>
414 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
415 {
416 return (m1[0] == m2[0]) && (m1[1] == m2[1]);
417 }
418
419 template<typename T, qualifier Q>
420 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(mat<2, 2, T, Q> const& m1, mat<2, 2, T, Q> const& m2)
421 {
422 return (m1[0] != m2[0]) || (m1[1] != m2[1]);
423 }
424} //namespace glm