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