7# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
8 template<
typename T, qualifier Q>
9 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat()
10# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST
11 : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)}
14# if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION
15 this->value[0] = col_type(1, 0, 0, 0);
16 this->value[1] = col_type(0, 1, 0, 0);
17 this->value[2] = col_type(0, 0, 1, 0);
18 this->value[3] = col_type(0, 0, 0, 1);
23 template<
typename T, qualifier Q>
25 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 4, T, P>
const& m)
26# if GLM_HAS_INITIALIZER_LISTS
27 : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])}
30# if !GLM_HAS_INITIALIZER_LISTS
31 this->value[0] = m[0];
32 this->value[1] = m[1];
33 this->value[2] = m[2];
34 this->value[3] = m[3];
38 template<
typename T, qualifier Q>
39 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(T
const& s)
40# if GLM_HAS_INITIALIZER_LISTS
41 : value{col_type(s, 0, 0, 0), col_type(0, s, 0, 0), col_type(0, 0, s, 0), col_type(0, 0, 0, s)}
44# if !GLM_HAS_INITIALIZER_LISTS
45 this->value[0] = col_type(s, 0, 0, 0);
46 this->value[1] = col_type(0, s, 0, 0);
47 this->value[2] = col_type(0, 0, s, 0);
48 this->value[3] = col_type(0, 0, 0, s);
52 template<
typename T, qualifier Q>
53 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat
55 T
const& x0, T
const& y0, T
const& z0, T
const& w0,
56 T
const& x1, T
const& y1, T
const& z1, T
const& w1,
57 T
const& x2, T
const& y2, T
const& z2, T
const& w2,
58 T
const& x3, T
const& y3, T
const& z3, T
const& w3
60# if GLM_HAS_INITIALIZER_LISTS
62 col_type(x0, y0, z0, w0),
63 col_type(x1, y1, z1, w1),
64 col_type(x2, y2, z2, w2),
65 col_type(x3, y3, z3, w3)}
68# if !GLM_HAS_INITIALIZER_LISTS
69 this->value[0] = col_type(x0, y0, z0, w0);
70 this->value[1] = col_type(x1, y1, z1, w1);
71 this->value[2] = col_type(x2, y2, z2, w2);
72 this->value[3] = col_type(x3, y3, z3, w3);
76 template<
typename T, qualifier Q>
77 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(col_type
const& v0, col_type
const& v1, col_type
const& v2, col_type
const& v3)
78# if GLM_HAS_INITIALIZER_LISTS
79 : value{col_type(v0), col_type(v1), col_type(v2), col_type(v3)}
82# if !GLM_HAS_INITIALIZER_LISTS
90 template<
typename T, qualifier Q>
91 template<
typename U, qualifier P>
92 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 4, U, P>
const& m)
93# if GLM_HAS_INITIALIZER_LISTS
94 : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(m[3])}
97# if !GLM_HAS_INITIALIZER_LISTS
98 this->value[0] = col_type(m[0]);
99 this->value[1] = col_type(m[1]);
100 this->value[2] = col_type(m[2]);
101 this->value[3] = col_type(m[3]);
107 template<
typename T, qualifier Q>
109 typename X1,
typename Y1,
typename Z1,
typename W1,
110 typename X2,
typename Y2,
typename Z2,
typename W2,
111 typename X3,
typename Y3,
typename Z3,
typename W3,
112 typename X4,
typename Y4,
typename Z4,
typename W4>
113 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat
115 X1
const& x1, Y1
const& y1, Z1
const& z1, W1
const& w1,
116 X2
const& x2, Y2
const& y2, Z2
const& z2, W2
const& w2,
117 X3
const& x3, Y3
const& y3, Z3
const& z3, W3
const& w3,
118 X4
const& x4, Y4
const& y4, Z4
const& z4, W4
const& w4
120# if GLM_HAS_INITIALIZER_LISTS
121 : value{col_type(x1, y1, z1, w1), col_type(x2, y2, z2, w2), col_type(x3, y3, z3, w3), col_type(x4, y4, z4, w4)}
124 GLM_STATIC_ASSERT(std::numeric_limits<X1>::is_iec559 || std::numeric_limits<X1>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 1st parameter type invalid.");
125 GLM_STATIC_ASSERT(std::numeric_limits<Y1>::is_iec559 || std::numeric_limits<Y1>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid.");
126 GLM_STATIC_ASSERT(std::numeric_limits<Z1>::is_iec559 || std::numeric_limits<Z1>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid.");
127 GLM_STATIC_ASSERT(std::numeric_limits<W1>::is_iec559 || std::numeric_limits<W1>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 4th parameter type invalid.");
129 GLM_STATIC_ASSERT(std::numeric_limits<X2>::is_iec559 || std::numeric_limits<X2>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 5th parameter type invalid.");
130 GLM_STATIC_ASSERT(std::numeric_limits<Y2>::is_iec559 || std::numeric_limits<Y2>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 6th parameter type invalid.");
131 GLM_STATIC_ASSERT(std::numeric_limits<Z2>::is_iec559 || std::numeric_limits<Z2>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 7th parameter type invalid.");
132 GLM_STATIC_ASSERT(std::numeric_limits<W2>::is_iec559 || std::numeric_limits<W2>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 8th parameter type invalid.");
134 GLM_STATIC_ASSERT(std::numeric_limits<X3>::is_iec559 || std::numeric_limits<X3>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 9th parameter type invalid.");
135 GLM_STATIC_ASSERT(std::numeric_limits<Y3>::is_iec559 || std::numeric_limits<Y3>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 10th parameter type invalid.");
136 GLM_STATIC_ASSERT(std::numeric_limits<Z3>::is_iec559 || std::numeric_limits<Z3>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 11th parameter type invalid.");
137 GLM_STATIC_ASSERT(std::numeric_limits<W3>::is_iec559 || std::numeric_limits<W3>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 12th parameter type invalid.");
139 GLM_STATIC_ASSERT(std::numeric_limits<X4>::is_iec559 || std::numeric_limits<X4>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 13th parameter type invalid.");
140 GLM_STATIC_ASSERT(std::numeric_limits<Y4>::is_iec559 || std::numeric_limits<Y4>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 14th parameter type invalid.");
141 GLM_STATIC_ASSERT(std::numeric_limits<Z4>::is_iec559 || std::numeric_limits<Z4>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 15th parameter type invalid.");
142 GLM_STATIC_ASSERT(std::numeric_limits<W4>::is_iec559 || std::numeric_limits<W4>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 16th parameter type invalid.");
144# if !GLM_HAS_INITIALIZER_LISTS
145 this->value[0] = col_type(x1, y1, z1, w1);
146 this->value[1] = col_type(x2, y2, z2, w2);
147 this->value[2] = col_type(x3, y3, z3, w3);
148 this->value[3] = col_type(x4, y4, z4, w4);
152 template<
typename T, qualifier Q>
153 template<
typename V1,
typename V2,
typename V3,
typename V4>
154 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(vec<4, V1, Q>
const& v1, vec<4, V2, Q>
const& v2, vec<4, V3, Q>
const& v3, vec<4, V4, Q>
const& v4)
155# if GLM_HAS_INITIALIZER_LISTS
156 : value{col_type(v1), col_type(v2), col_type(v3), col_type(v4)}
159 GLM_STATIC_ASSERT(std::numeric_limits<V1>::is_iec559 || std::numeric_limits<V1>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 1st parameter type invalid.");
160 GLM_STATIC_ASSERT(std::numeric_limits<V2>::is_iec559 || std::numeric_limits<V2>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid.");
161 GLM_STATIC_ASSERT(std::numeric_limits<V3>::is_iec559 || std::numeric_limits<V3>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid.");
162 GLM_STATIC_ASSERT(std::numeric_limits<V4>::is_iec559 || std::numeric_limits<V4>::is_integer || GLM_CONFIG_UNRESTRICTED_GENTYPE,
"*mat4x4 constructor only takes float and integer types, 4th parameter type invalid.");
164# if !GLM_HAS_INITIALIZER_LISTS
165 this->value[0] = col_type(v1);
166 this->value[1] = col_type(v2);
167 this->value[2] = col_type(v3);
168 this->value[3] = col_type(v4);
174 template<
typename T, qualifier Q>
175 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 2, T, Q>
const& m)
176# if GLM_HAS_INITIALIZER_LISTS
177 : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)}
180# if !GLM_HAS_INITIALIZER_LISTS
181 this->value[0] = col_type(m[0], 0, 0);
182 this->value[1] = col_type(m[1], 0, 0);
183 this->value[2] = col_type(0, 0, 1, 0);
184 this->value[3] = col_type(0, 0, 0, 1);
188 template<
typename T, qualifier Q>
189 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 3, T, Q>
const& m)
190# if GLM_HAS_INITIALIZER_LISTS
191 : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0), col_type(0, 0, 0, 1)}
194# if !GLM_HAS_INITIALIZER_LISTS
195 this->value[0] = col_type(m[0], 0);
196 this->value[1] = col_type(m[1], 0);
197 this->value[2] = col_type(m[2], 0);
198 this->value[3] = col_type(0, 0, 0, 1);
202 template<
typename T, qualifier Q>
203 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 3, T, Q>
const& m)
204# if GLM_HAS_INITIALIZER_LISTS
205 : value{col_type(m[0], 0), col_type(m[1], 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)}
208# if !GLM_HAS_INITIALIZER_LISTS
209 this->value[0] = col_type(m[0], 0);
210 this->value[1] = col_type(m[1], 0);
211 this->value[2] = col_type(0, 0, 1, 0);
212 this->value[3] = col_type(0, 0, 0, 1);
216 template<
typename T, qualifier Q>
217 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 2, T, Q>
const& m)
218# if GLM_HAS_INITIALIZER_LISTS
219 : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(m[2], 1, 0), col_type(0, 0, 0, 1)}
222# if !GLM_HAS_INITIALIZER_LISTS
223 this->value[0] = col_type(m[0], 0, 0);
224 this->value[1] = col_type(m[1], 0, 0);
225 this->value[2] = col_type(m[2], 1, 0);
226 this->value[3] = col_type(0, 0, 0, 1);
230 template<
typename T, qualifier Q>
231 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<2, 4, T, Q>
const& m)
232# if GLM_HAS_INITIALIZER_LISTS
233 : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)}
236# if !GLM_HAS_INITIALIZER_LISTS
237 this->value[0] = m[0];
238 this->value[1] = m[1];
239 this->value[2] = col_type(0, 0, 1, 0);
240 this->value[3] = col_type(0, 0, 0, 1);
244 template<
typename T, qualifier Q>
245 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 2, T, Q>
const& m)
246# if GLM_HAS_INITIALIZER_LISTS
247 : value{col_type(m[0], 0, 0), col_type(m[1], 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)}
250# if !GLM_HAS_INITIALIZER_LISTS
251 this->value[0] = col_type(m[0], 0, 0);
252 this->value[1] = col_type(m[1], 0, 0);
253 this->value[2] = col_type(0, 0, 1, 0);
254 this->value[3] = col_type(0, 0, 0, 1);
258 template<
typename T, qualifier Q>
259 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<3, 4, T, Q>
const& m)
260# if GLM_HAS_INITIALIZER_LISTS
261 : value{col_type(m[0]), col_type(m[1]), col_type(m[2]), col_type(0, 0, 0, 1)}
264# if !GLM_HAS_INITIALIZER_LISTS
265 this->value[0] = m[0];
266 this->value[1] = m[1];
267 this->value[2] = m[2];
268 this->value[3] = col_type(0, 0, 0, 1);
272 template<
typename T, qualifier Q>
273 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat(mat<4, 3, T, Q>
const& m)
274# if GLM_HAS_INITIALIZER_LISTS
275 : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 0), col_type(m[3], 1)}
278# if !GLM_HAS_INITIALIZER_LISTS
279 this->value[0] = col_type(m[0], 0);
280 this->value[1] = col_type(m[1], 0);
281 this->value[2] = col_type(m[2], 0);
282 this->value[3] = col_type(m[3], 1);
288 template<
typename T, qualifier Q>
289 GLM_FUNC_QUALIFIER
typename mat<4, 4, T, Q>::col_type & mat<4, 4, T, Q>::operator[](
typename mat<4, 4, T, Q>::length_type i)
291 assert(i < this->length());
292 return this->value[i];
295 template<
typename T, qualifier Q>
296 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
typename mat<4, 4, T, Q>::col_type
const& mat<4, 4, T, Q>::operator[](
typename mat<4, 4, T, Q>::length_type i)
const
298 assert(i < this->length());
299 return this->value[i];
304 template<
typename T, qualifier Q>
306 GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator=(mat<4, 4, U, Q>
const& m)
310 this->value[0] = m[0];
311 this->value[1] = m[1];
312 this->value[2] = m[2];
313 this->value[3] = m[3];
317 template<
typename T, qualifier Q>
319 GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(U s)
328 template<
typename T, qualifier Q>
330 GLM_FUNC_QUALIFIER mat<4, 4, T, Q>& mat<4, 4, T, Q>::operator+=(mat<4, 4, U, Q>
const& m)
332 this->value[0] += m[0];
333 this->value[1] += m[1];
334 this->value[2] += m[2];
335 this->value[3] += m[3];
339 template<
typename T, qualifier Q>
341 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(U s)
350 template<
typename T, qualifier Q>
352 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator-=(mat<4, 4, U, Q>
const& m)
354 this->value[0] -= m[0];
355 this->value[1] -= m[1];
356 this->value[2] -= m[2];
357 this->value[3] -= m[3];
361 template<
typename T, qualifier Q>
363 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(U s)
372 template<
typename T, qualifier Q>
374 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator*=(mat<4, 4, U, Q>
const& m)
376 return (*
this = *
this * m);
379 template<
typename T, qualifier Q>
381 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(U s)
390 template<
typename T, qualifier Q>
392 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator/=(mat<4, 4, U, Q>
const& m)
399 template<
typename T, qualifier Q>
400 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator++()
409 template<
typename T, qualifier Q>
410 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> & mat<4, 4, T, Q>::operator--()
419 template<
typename T, qualifier Q>
420 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator++(
int)
422 mat<4, 4, T, Q> Result(*
this);
427 template<
typename T, qualifier Q>
428 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> mat<4, 4, T, Q>::operator--(
int)
430 mat<4, 4, T, Q> Result(*
this);
437 template<
typename T, qualifier Q>
438 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q>
const& m)
443 template<
typename T, qualifier Q>
444 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q>
const& m)
446 return mat<4, 4, T, Q>(
455 template<
typename T, qualifier Q>
456 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q>
const& m, T
const& s)
458 return mat<4, 4, T, Q>(
465 template<
typename T, qualifier Q>
466 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(T
const& s, mat<4, 4, T, Q>
const& m)
468 return mat<4, 4, T, Q>(
475 template<
typename T, qualifier Q>
476 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator+(mat<4, 4, T, Q>
const& m1, mat<4, 4, T, Q>
const& m2)
478 return mat<4, 4, T, Q>(
485 template<
typename T, qualifier Q>
486 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q>
const& m, T
const& s)
488 return mat<4, 4, T, Q>(
495 template<
typename T, qualifier Q>
496 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(T
const& s, mat<4, 4, T, Q>
const& m)
498 return mat<4, 4, T, Q>(
505 template<
typename T, qualifier Q>
506 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator-(mat<4, 4, T, Q>
const& m1, mat<4, 4, T, Q>
const& m2)
508 return mat<4, 4, T, Q>(
515 template<
typename T, qualifier Q>
516 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q>
const& m, T
const & s)
518 return mat<4, 4, T, Q>(
525 template<
typename T, qualifier Q>
526 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(T
const& s, mat<4, 4, T, Q>
const& m)
528 return mat<4, 4, T, Q>(
535 template<
typename T, qualifier Q>
536 GLM_FUNC_QUALIFIER
typename mat<4, 4, T, Q>::col_type
operator*
538 mat<4, 4, T, Q>
const& m,
539 typename mat<4, 4, T, Q>::row_type
const& v
561 typename mat<4, 4, T, Q>::col_type
const Mov0(v[0]);
562 typename mat<4, 4, T, Q>::col_type
const Mov1(v[1]);
563 typename mat<4, 4, T, Q>::col_type
const Mul0 = m[0] * Mov0;
564 typename mat<4, 4, T, Q>::col_type
const Mul1 = m[1] * Mov1;
565 typename mat<4, 4, T, Q>::col_type
const Add0 = Mul0 + Mul1;
566 typename mat<4, 4, T, Q>::col_type
const Mov2(v[2]);
567 typename mat<4, 4, T, Q>::col_type
const Mov3(v[3]);
568 typename mat<4, 4, T, Q>::col_type
const Mul2 = m[2] * Mov2;
569 typename mat<4, 4, T, Q>::col_type
const Mul3 = m[3] * Mov3;
570 typename mat<4, 4, T, Q>::col_type
const Add1 = Mul2 + Mul3;
571 typename mat<4, 4, T, Q>::col_type
const Add2 = Add0 + Add1;
583 template<
typename T, qualifier Q>
584 GLM_FUNC_QUALIFIER
typename mat<4, 4, T, Q>::row_type
operator*
586 typename mat<4, 4, T, Q>::col_type
const& v,
587 mat<4, 4, T, Q>
const& m
590 return typename mat<4, 4, T, Q>::row_type(
591 m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2] + m[0][3] * v[3],
592 m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2] + m[1][3] * v[3],
593 m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2] + m[2][3] * v[3],
594 m[3][0] * v[0] + m[3][1] * v[1] + m[3][2] * v[2] + m[3][3] * v[3]);
597 template<
typename T, qualifier Q>
598 GLM_FUNC_QUALIFIER mat<2, 4, T, Q> operator*(mat<4, 4, T, Q>
const& m1, mat<2, 4, T, Q>
const& m2)
600 return mat<2, 4, T, Q>(
601 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
602 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
603 m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],
604 m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],
605 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
606 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
607 m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
608 m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]);
611 template<
typename T, qualifier Q>
612 GLM_FUNC_QUALIFIER mat<3, 4, T, Q> operator*(mat<4, 4, T, Q>
const& m1, mat<3, 4, T, Q>
const& m2)
614 return mat<3, 4, T, Q>(
615 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
616 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
617 m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],
618 m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],
619 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
620 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
621 m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
622 m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3],
623 m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
624 m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
625 m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],
626 m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]);
629 template<
typename T, qualifier Q>
630 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator*(mat<4, 4, T, Q>
const& m1, mat<4, 4, T, Q>
const& m2)
632 typename mat<4, 4, T, Q>::col_type
const SrcA0 = m1[0];
633 typename mat<4, 4, T, Q>::col_type
const SrcA1 = m1[1];
634 typename mat<4, 4, T, Q>::col_type
const SrcA2 = m1[2];
635 typename mat<4, 4, T, Q>::col_type
const SrcA3 = m1[3];
637 typename mat<4, 4, T, Q>::col_type
const SrcB0 = m2[0];
638 typename mat<4, 4, T, Q>::col_type
const SrcB1 = m2[1];
639 typename mat<4, 4, T, Q>::col_type
const SrcB2 = m2[2];
640 typename mat<4, 4, T, Q>::col_type
const SrcB3 = m2[3];
642 mat<4, 4, T, Q> Result;
643 Result[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3];
644 Result[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3];
645 Result[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3];
646 Result[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3];
650 template<
typename T, qualifier Q>
651 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q>
const& m, T
const& s)
653 return mat<4, 4, T, Q>(
660 template<
typename T, qualifier Q>
661 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(T
const& s, mat<4, 4, T, Q>
const& m)
663 return mat<4, 4, T, Q>(
670 template<
typename T, qualifier Q>
671 GLM_FUNC_QUALIFIER
typename mat<4, 4, T, Q>::col_type operator/(mat<4, 4, T, Q>
const& m,
typename mat<4, 4, T, Q>::row_type
const& v)
676 template<
typename T, qualifier Q>
677 GLM_FUNC_QUALIFIER
typename mat<4, 4, T, Q>::row_type operator/(
typename mat<4, 4, T, Q>::col_type
const& v, mat<4, 4, T, Q>
const& m)
682 template<
typename T, qualifier Q>
683 GLM_FUNC_QUALIFIER mat<4, 4, T, Q> operator/(mat<4, 4, T, Q>
const& m1, mat<4, 4, T, Q>
const& m2)
685 mat<4, 4, T, Q> m1_copy(m1);
686 return m1_copy /= m2;
691 template<
typename T, qualifier Q>
692 GLM_FUNC_QUALIFIER
bool operator==(mat<4, 4, T, Q>
const& m1, mat<4, 4, T, Q>
const& m2)
694 return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);
697 template<
typename T, qualifier Q>
698 GLM_FUNC_QUALIFIER
bool operator!=(mat<4, 4, T, Q>
const& m1, mat<4, 4, T, Q>
const& m2)
700 return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);
704#if GLM_CONFIG_SIMD == GLM_ENABLE
705# include "type_mat4x4_simd.inl"
GLM_FUNC_QUALIFIER mat< C, R, T, Q > inverse(mat< C, R, T, Q > const &m)
Definition func_matrix.inl:388
Core features
Definition common.hpp:21