master
ブランチ master
VulkanExample / dep / include / glm / detail / type_mat3x3.inl
15.9 KB、503行 生 Blame 履歴
1#include "../matrix.hpp"
2#include "../common.hpp"
3
4namespace glm
5{
6 // -- Constructors --
7
8# if GLM_CONFIG_CTOR_INIT == GLM_ENABLE
9 template<typename T, qualifier Q>
10 GLM_DEFAULTED_DEFAULT_CTOR_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat()
11 : value{col_type(1, 0, 0), col_type(0, 1, 0), col_type(0, 0, 1)}
12 {}
13# endif
14
15 template<typename T, qualifier Q>
16 template<qualifier P>
17 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 3, T, P> const& m)
18 : value{col_type(m[0]), col_type(m[1]), col_type(m[2])}
19 {}
20
21 template<typename T, qualifier Q>
22 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(T s)
23 : value{col_type(s, 0, 0), col_type(0, s, 0), col_type(0, 0, s)}
24 {}
25
26 template<typename T, qualifier Q>
27 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat
28 (
29 T x0, T y0, T z0,
30 T x1, T y1, T z1,
31 T x2, T y2, T z2
32 )
33 : value{col_type(x0, y0, z0), col_type(x1, y1, z1), col_type(x2, y2, z2)}
34 {}
35
36 template<typename T, qualifier Q>
37 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, 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 X1, typename Y1, typename Z1,
46 typename X2, typename Y2, typename Z2,
47 typename X3, typename Y3, typename Z3>
48 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat
49 (
50 X1 x1, Y1 y1, Z1 z1,
51 X2 x2, Y2 y2, Z2 z2,
52 X3 x3, Y3 y3, Z3 z3
53 )
54 : value{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>
59 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(vec<3, V1, Q> const& v1, vec<3, V2, Q> const& v2, vec<3, V3, Q> const& v3)
60 : value{col_type(v1), col_type(v2), col_type(v3)}
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<3, 3, T, Q>::mat(mat<3, 3, U, P> const& m)
68 : value{col_type(m[0]), col_type(m[1]), col_type(m[2])}
69 {}
70
71 template<typename T, qualifier Q>
72 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 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)}
74 {}
75
76 template<typename T, qualifier Q>
77 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 4, T, Q> const& m)
78 : value{col_type(m[0]), col_type(m[1]), col_type(m[2])}
79 {}
80
81 template<typename T, qualifier Q>
82 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 3, T, Q> const& m)
83 : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1)}
84 {}
85
86 template<typename T, qualifier Q>
87 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 2, T, Q> const& m)
88 : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1)}
89 {}
90
91 template<typename T, qualifier Q>
92 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<2, 4, T, Q> const& m)
93 : value{col_type(m[0]), col_type(m[1]), col_type(0, 0, 1)}
94 {}
95
96 template<typename T, qualifier Q>
97 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 2, T, Q> const& m)
98 : value{col_type(m[0], 0), col_type(m[1], 0), col_type(m[2], 1)}
99 {}
100
101 template<typename T, qualifier Q>
102 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<3, 4, T, Q> const& m)
103 : value{col_type(m[0]), col_type(m[1]), col_type(m[2])}
104 {}
105
106 template<typename T, qualifier Q>
107 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q>::mat(mat<4, 3, T, Q> const& m)
108 : value{col_type(m[0]), col_type(m[1]), col_type(m[2])}
109 {}
110
111 // -- Accesses --
112
113 template<typename T, qualifier Q>
114 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::col_type & mat<3, 3, T, Q>::operator[](typename mat<3, 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<3, 3, T, Q>::col_type const& mat<3, 3, T, Q>::operator[](typename mat<3, 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<3, 3, T, Q> & mat<3, 3, T, Q>::operator=(mat<3, 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 return *this;
137 }
138
139 template<typename T, qualifier Q>
140 template<typename U>
141 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(U s)
142 {
143 this->value[0] += s;
144 this->value[1] += s;
145 this->value[2] += s;
146 return *this;
147 }
148
149 template<typename T, qualifier Q>
150 template<typename U>
151 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator+=(mat<3, 3, U, Q> const& m)
152 {
153 this->value[0] += m[0];
154 this->value[1] += m[1];
155 this->value[2] += m[2];
156 return *this;
157 }
158
159 template<typename T, qualifier Q>
160 template<typename U>
161 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(U s)
162 {
163 this->value[0] -= s;
164 this->value[1] -= s;
165 this->value[2] -= s;
166 return *this;
167 }
168
169 template<typename T, qualifier Q>
170 template<typename U>
171 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator-=(mat<3, 3, U, Q> const& m)
172 {
173 this->value[0] -= m[0];
174 this->value[1] -= m[1];
175 this->value[2] -= m[2];
176 return *this;
177 }
178
179 template<typename T, qualifier Q>
180 template<typename U>
181 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(U s)
182 {
183 col_type sv(s);
184 this->value[0] *= sv;
185 this->value[1] *= sv;
186 this->value[2] *= sv;
187 return *this;
188 }
189
190 template<typename T, qualifier Q>
191 template<typename U>
192 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator*=(mat<3, 3, U, Q> const& m)
193 {
194 return (*this = *this * m);
195 }
196
197 template<typename T, qualifier Q>
198 template<typename U>
199 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(U s)
200 {
201 this->value[0] /= s;
202 this->value[1] /= s;
203 this->value[2] /= s;
204 return *this;
205 }
206
207 template<typename T, qualifier Q>
208 template<typename U>
209 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator/=(mat<3, 3, U, Q> const& m)
210 {
211 return *this *= inverse(m);
212 }
213
214 // -- Increment and decrement operators --
215
216 template<typename T, qualifier Q>
217 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator++()
218 {
219 ++this->value[0];
220 ++this->value[1];
221 ++this->value[2];
222 return *this;
223 }
224
225 template<typename T, qualifier Q>
226 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> & mat<3, 3, T, Q>::operator--()
227 {
228 --this->value[0];
229 --this->value[1];
230 --this->value[2];
231 return *this;
232 }
233
234 template<typename T, qualifier Q>
235 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> mat<3, 3, T, Q>::operator++(int)
236 {
237 mat<3, 3, T, Q> Result(*this);
238 ++*this;
239 return Result;
240 }
241
242 template<typename T, qualifier Q>
243 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> mat<3, 3, T, Q>::operator--(int)
244 {
245 mat<3, 3, T, Q> Result(*this);
246 --*this;
247 return Result;
248 }
249
250 // -- Unary arithmetic operators --
251
252 template<typename T, qualifier Q>
253 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m)
254 {
255 return m;
256 }
257
258 template<typename T, qualifier Q>
259 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m)
260 {
261 return mat<3, 3, T, Q>(
262 -m[0],
263 -m[1],
264 -m[2]);
265 }
266
267 // -- Binary arithmetic operators --
268
269 template<typename T, qualifier Q>
270 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m, T scalar)
271 {
272 return mat<3, 3, T, Q>(
273 m[0] + scalar,
274 m[1] + scalar,
275 m[2] + scalar);
276 }
277
278 template<typename T, qualifier Q>
279 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator+(T scalar, mat<3, 3, T, Q> const& m)
280 {
281 return mat<3, 3, T, Q>(
282 m[0] + scalar,
283 m[1] + scalar,
284 m[2] + scalar);
285 }
286
287 template<typename T, qualifier Q>
288 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator+(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
289 {
290 return mat<3, 3, T, Q>(
291 m1[0] + m2[0],
292 m1[1] + m2[1],
293 m1[2] + m2[2]);
294 }
295
296 template<typename T, qualifier Q>
297 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m, T scalar)
298 {
299 return mat<3, 3, T, Q>(
300 m[0] - scalar,
301 m[1] - scalar,
302 m[2] - scalar);
303 }
304
305 template<typename T, qualifier Q>
306 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator-(T scalar, mat<3, 3, T, Q> const& m)
307 {
308 return mat<3, 3, T, Q>(
309 scalar - m[0],
310 scalar - m[1],
311 scalar - m[2]);
312 }
313
314 template<typename T, qualifier Q>
315 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator-(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
316 {
317 return mat<3, 3, T, Q>(
318 m1[0] - m2[0],
319 m1[1] - m2[1],
320 m1[2] - m2[2]);
321 }
322
323 template<typename T, qualifier Q>
324 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m, T scalar)
325 {
326 return mat<3, 3, T, Q>(
327 m[0] * scalar,
328 m[1] * scalar,
329 m[2] * scalar);
330 }
331
332 template<typename T, qualifier Q>
333 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator*(T scalar, mat<3, 3, T, Q> const& m)
334 {
335 return mat<3, 3, T, Q>(
336 m[0] * scalar,
337 m[1] * scalar,
338 m[2] * scalar);
339 }
340
341 template<typename T, qualifier Q>
342 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::col_type operator*(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v)
343 {
344 return typename mat<3, 3, T, Q>::col_type(
345 m[0] * splatX(v) + m[1] * splatY(v) + m[2] * splatZ(v));
346 }
347
348 template<typename T, qualifier Q>
349 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::row_type operator*(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m)
350 {
351 return typename mat<3, 3, T, Q>::row_type(
352 dot(m[0], v),
353 dot(m[1], v),
354 dot(m[2], v));
355 }
356
357 namespace detail
358 {
359 template<typename T, qualifier Q, bool is_aligned>
360 struct mul3x3 {};
361
362#if GLM_CONFIG_SIMD == GLM_ENABLE
363 template<typename T, qualifier Q>
364 struct mul3x3<T, Q, true>
365 {
366 GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
367 {
368 typename mat<4, 4, T, Q>::col_type const SrcA0 = xyzz(m1[0]);
369 typename mat<4, 4, T, Q>::col_type const SrcA1 = xyzz(m1[1]);
370 typename mat<4, 4, T, Q>::col_type const SrcA2 = xyzz(m1[2]);
371
372 typename mat<4, 4, T, Q>::col_type const SrcB0 = xyzz(m2[0]);
373 typename mat<4, 4, T, Q>::col_type const SrcB1 = xyzz(m2[1]);
374 typename mat<4, 4, T, Q>::col_type const SrcB2 = xyzz(m2[2]);
375
376 typename mat<3, 3, T, Q>::col_type const tmp0 = xyz(glm::fma(SrcA2, splatZ(SrcB0), glm::fma(SrcA1, splatY(SrcB0), SrcA0 * splatX(SrcB0))));
377 typename mat<3, 3, T, Q>::col_type const tmp1 = xyz(glm::fma(SrcA2, splatZ(SrcB1), glm::fma(SrcA1, splatY(SrcB1), SrcA0 * splatX(SrcB1))));
378 typename mat<3, 3, T, Q>::col_type const tmp2 = xyz(glm::fma(SrcA2, splatZ(SrcB2), glm::fma(SrcA1, splatY(SrcB2), SrcA0 * splatX(SrcB2))));
379
380 return mat<3, 3, T, Q>(tmp0, tmp1, tmp2);
381 }
382 };
383#endif
384 template<typename T, qualifier Q>
385 struct mul3x3<T, Q, false>
386 {
387 GLM_FUNC_QUALIFIER static mat<3, 3, T, Q> call(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
388 {
389 typename mat<3, 3, T, Q>::col_type const& SrcA0 = m1[0];
390 typename mat<3, 3, T, Q>::col_type const& SrcA1 = m1[1];
391 typename mat<3, 3, T, Q>::col_type const& SrcA2 = m1[2];
392
393 typename mat<3, 3, T, Q>::col_type const& SrcB0 = m2[0];
394 typename mat<3, 3, T, Q>::col_type const& SrcB1 = m2[1];
395 typename mat<3, 3, T, Q>::col_type const& SrcB2 = m2[2];
396
397 // note: the following lines are decomposed to have consistent results between simd and non simd code (prevent rounding error because of operation order)
398 //Result[0] = SrcA2 * SrcB0.z + SrcA1 * SrcB0.y + SrcA0 * SrcB0.x;
399 //Result[1] = SrcA2 * SrcB1.z + SrcA1 * SrcB1.y + SrcA0 * SrcB1.x;
400 //Result[2] = SrcA2 * SrcB2.z + SrcA1 * SrcB2.y + SrcA0 * SrcB2.x;
401
402 typename mat<3, 3, T, Q>::col_type tmp0 = SrcA0 * SrcB0.x;
403 tmp0 += SrcA1 * SrcB0.y;
404 tmp0 += SrcA2 * SrcB0.z;
405 typename mat<3, 3, T, Q>::col_type tmp1 = SrcA0 * SrcB1.x;
406 tmp1 += SrcA1 * SrcB1.y;
407 tmp1 += SrcA2 * SrcB1.z;
408 typename mat<3, 3, T, Q>::col_type tmp2 = SrcA0 * SrcB2.x;
409 tmp2 += SrcA1 * SrcB2.y;
410 tmp2 += SrcA2 * SrcB2.z;
411
412 return mat<3, 3, T, Q>(tmp0, tmp1, tmp2);
413 }
414 };
415 }
416
417 template<typename T, qualifier Q>
418 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
419 {
420 return detail::mul3x3<T, Q, detail::is_aligned<Q>::value>::call(m1, m2);
421 }
422
423 template<typename T, qualifier Q>
424 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<2, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<2, 3, T, Q> const& m2)
425 {
426 return mat<2, 3, T, Q>(
427 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
428 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
429 m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],
430 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
431 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
432 m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]);
433 }
434
435 template<typename T, qualifier Q>
436 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 3, T, Q> operator*(mat<3, 3, T, Q> const& m1, mat<4, 3, T, Q> const& m2)
437 {
438 return mat<4, 3, T, Q>(
439 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
440 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
441 m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],
442 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
443 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
444 m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
445 m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
446 m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
447 m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],
448 m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],
449 m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2],
450 m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]);
451 }
452
453 template<typename T, qualifier Q>
454 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m, T scalar)
455 {
456 return mat<3, 3, T, Q>(
457 m[0] / scalar,
458 m[1] / scalar,
459 m[2] / scalar);
460 }
461
462 template<typename T, qualifier Q>
463 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator/(T scalar, mat<3, 3, T, Q> const& m)
464 {
465 return mat<3, 3, T, Q>(
466 scalar / m[0],
467 scalar / m[1],
468 scalar / m[2]);
469 }
470
471 template<typename T, qualifier Q>
472 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::col_type operator/(mat<3, 3, T, Q> const& m, typename mat<3, 3, T, Q>::row_type const& v)
473 {
474 return inverse(m) * v;
475 }
476
477 template<typename T, qualifier Q>
478 GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename mat<3, 3, T, Q>::row_type operator/(typename mat<3, 3, T, Q>::col_type const& v, mat<3, 3, T, Q> const& m)
479 {
480 return v * inverse(m);
481 }
482
483 template<typename T, qualifier Q>
484 GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<3, 3, T, Q> operator/(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
485 {
486 mat<3, 3, T, Q> m1_copy(m1);
487 return m1_copy /= m2;
488 }
489
490 // -- Boolean operators --
491
492 template<typename T, qualifier Q>
493 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
494 {
495 return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]);
496 }
497
498 template<typename T, qualifier Q>
499 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(mat<3, 3, T, Q> const& m1, mat<3, 3, T, Q> const& m2)
500 {
501 return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]);
502 }
503} //namespace glm