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