1
///////////////////////////////////////////////////////////////////////////////////
2
/// OpenGL Mathematics (glm.g-truc.net)
4
/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)
5
/// Permission is hereby granted, free of charge, to any person obtaining a copy
6
/// of this software and associated documentation files (the "Software"), to deal
7
/// in the Software without restriction, including without limitation the rights
8
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
/// copies of the Software, and to permit persons to whom the Software is
10
/// furnished to do so, subject to the following conditions:
12
/// The above copyright notice and this permission notice shall be included in
13
/// all copies or substantial portions of the Software.
15
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
/// @file glm/core/type_mat4x2.inl
25
/// @date 2006-10-01 / 2011-06-15
26
/// @author Christophe Riccio
27
///////////////////////////////////////////////////////////////////////////////////
33
GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::length() const
39
GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::col_size()
45
GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::row_size()
50
//////////////////////////////////////
54
GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type &
55
tmat4x2<T>::operator[]
60
assert(i < this->length());
61
return this->value[i];
65
GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type const &
66
tmat4x2<T>::operator[]
71
assert(i < this->length());
72
return this->value[i];
75
//////////////////////////////////////////////////////////////
79
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2()
81
value_type const Zero(0);
82
value_type const One(1);
83
this->value[0] = col_type(One, Zero);
84
this->value[1] = col_type(Zero, One);
85
this->value[2] = col_type(Zero, Zero);
86
this->value[3] = col_type(Zero, Zero);
90
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
95
this->value[0] = m.value[0];
96
this->value[1] = m.value[1];
97
this->value[2] = m.value[2];
98
this->value[3] = m.value[3];
101
template <typename T>
102
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
108
template <typename T>
109
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
114
value_type const Zero(0);
115
this->value[0] = col_type(s, Zero);
116
this->value[1] = col_type(Zero, s);
117
this->value[2] = col_type(Zero, Zero);
118
this->value[3] = col_type(Zero, Zero);
121
template <typename T>
122
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
124
value_type const & x0, value_type const & y0,
125
value_type const & x1, value_type const & y1,
126
value_type const & x2, value_type const & y2,
127
value_type const & x3, value_type const & y3
130
this->value[0] = col_type(x0, y0);
131
this->value[1] = col_type(x1, y1);
132
this->value[2] = col_type(x2, y2);
133
this->value[3] = col_type(x3, y3);
136
template <typename T>
137
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
151
//////////////////////////////////////
152
// Convertion constructors
153
template <typename T>
154
template <typename U>
155
GLM_FUNC_DECL tmat4x2<T>::tmat4x2
160
value_type const Zero(0);
161
this->value[0] = tvec2<T>(value_type(s), Zero);
162
this->value[1] = tvec2<T>(Zero, value_type(s));
163
this->value[2] = tvec2<T>(Zero, Zero);
164
this->value[3] = tvec2<T>(Zero, Zero);
167
template <typename T>
169
typename X1, typename Y1,
170
typename X2, typename Y2,
171
typename X3, typename Y3,
172
typename X4, typename Y4>
173
GLM_FUNC_DECL tmat4x2<T>::tmat4x2
175
X1 const & x1, Y1 const & y1,
176
X2 const & x2, Y2 const & y2,
177
X3 const & x3, Y3 const & y3,
178
X4 const & x4, Y4 const & y4
181
this->value[0] = col_type(value_type(x1), value_type(y1));
182
this->value[1] = col_type(value_type(x2), value_type(y2));
183
this->value[2] = col_type(value_type(x3), value_type(y3));
184
this->value[3] = col_type(value_type(x4), value_type(y4));
187
template <typename T>
188
template <typename V1, typename V2, typename V3, typename V4>
189
GLM_FUNC_DECL tmat4x2<T>::tmat4x2
191
tvec2<V1> const & v1,
192
tvec2<V2> const & v2,
193
tvec2<V3> const & v3,
197
this->value[0] = col_type(v1);
198
this->value[1] = col_type(v2);
199
this->value[2] = col_type(v3);
200
this->value[3] = col_type(v4);
204
template <typename T>
205
template <typename U>
206
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
211
this->value[0] = col_type(m[0]);
212
this->value[1] = col_type(m[1]);
213
this->value[2] = col_type(m[2]);
214
this->value[3] = col_type(m[3]);
217
template <typename T>
218
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
223
this->value[0] = col_type(m[0]);
224
this->value[1] = col_type(m[1]);
225
this->value[2] = col_type(value_type(0));
226
this->value[3] = col_type(value_type(0));
229
template <typename T>
230
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
235
this->value[0] = col_type(m[0]);
236
this->value[1] = col_type(m[1]);
237
this->value[2] = col_type(m[2]);
238
this->value[3] = col_type(value_type(0));
241
template <typename T>
242
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
247
this->value[0] = col_type(m[0]);
248
this->value[1] = col_type(m[1]);
249
this->value[2] = col_type(m[2]);
250
this->value[3] = col_type(m[3]);
253
template <typename T>
254
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
259
this->value[0] = col_type(m[0]);
260
this->value[1] = col_type(m[1]);
261
this->value[2] = col_type(value_type(0));
262
this->value[3] = col_type(value_type(0));
265
template <typename T>
266
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
271
this->value[0] = col_type(m[0]);
272
this->value[1] = col_type(m[1]);
273
this->value[2] = col_type(m[2]);
274
this->value[3] = col_type(value_type(0));
277
template <typename T>
278
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
283
this->value[0] = col_type(m[0]);
284
this->value[1] = col_type(m[1]);
285
this->value[2] = col_type(value_type(0));
286
this->value[3] = col_type(value_type(0));
289
template <typename T>
290
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
295
this->value[0] = col_type(m[0]);
296
this->value[1] = col_type(m[1]);
297
this->value[2] = col_type(m[2]);
298
this->value[3] = col_type(m[3]);
301
template <typename T>
302
GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2
307
this->value[0] = col_type(m[0]);
308
this->value[1] = col_type(m[1]);
309
this->value[2] = col_type(m[2]);
310
this->value[3] = col_type(value_type(0));
313
//////////////////////////////////////////////////////////////
314
// Unary updatable operators
316
template <typename T>
317
GLM_FUNC_QUALIFIER tmat4x2<T>& tmat4x2<T>::operator=
322
this->value[0] = m[0];
323
this->value[1] = m[1];
324
this->value[2] = m[2];
325
this->value[3] = m[3];
329
template <typename T>
330
template <typename U>
331
GLM_FUNC_QUALIFIER tmat4x2<T>& tmat4x2<T>::operator=
336
this->value[0] = m[0];
337
this->value[1] = m[1];
338
this->value[2] = m[2];
339
this->value[3] = m[3];
343
template <typename T>
344
template <typename U>
345
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator+=
357
template <typename T>
358
template <typename U>
359
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator+=
364
this->value[0] += m[0];
365
this->value[1] += m[1];
366
this->value[2] += m[2];
367
this->value[3] += m[3];
371
template <typename T>
372
template <typename U>
373
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-=
385
template <typename T>
386
template <typename U>
387
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-=
392
this->value[0] -= m[0];
393
this->value[1] -= m[1];
394
this->value[2] -= m[2];
395
this->value[3] -= m[3];
399
template <typename T>
400
template <typename U>
401
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator*=
413
template <typename T>
414
template <typename U>
415
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator*=
420
return (*this = tmat4x2<T>(*this * m));
423
template <typename T>
424
template <typename U>
425
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator/=
437
template <typename T>
438
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator++ ()
447
template <typename T>
448
GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-- ()
457
//////////////////////////////////////////////////////////////
460
template <typename T>
461
GLM_FUNC_QUALIFIER tmat4x2<T> operator+
463
tmat4x2<T> const & m,
464
typename tmat4x2<T>::value_type const & s
474
template <typename T>
475
GLM_FUNC_QUALIFIER tmat4x2<T> operator+
477
tmat4x2<T> const & m1,
478
tmat4x2<T> const & m2
488
template <typename T>
489
GLM_FUNC_QUALIFIER tmat4x2<T> operator-
491
tmat4x2<T> const & m,
492
typename tmat4x2<T>::value_type const & s
502
template <typename T>
503
GLM_FUNC_QUALIFIER tmat4x2<T> operator-
505
tmat4x2<T> const & m1,
506
tmat4x2<T> const & m2
516
template <typename T>
517
GLM_FUNC_QUALIFIER tmat4x2<T> operator*
519
tmat4x2<T> const & m,
520
typename tmat4x2<T>::value_type const & s
530
template <typename T>
531
GLM_FUNC_QUALIFIER tmat4x2<T> operator*
533
typename tmat4x2<T>::value_type const & s,
544
template <typename T>
545
GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type operator*
547
tmat4x2<T> const & m,
548
typename tmat4x2<T>::row_type const & v)
550
return typename tmat4x2<T>::col_type(
551
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
552
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);
555
template <typename T>
556
GLM_FUNC_QUALIFIER typename tmat4x2<T>::row_type operator*
558
typename tmat4x2<T>::col_type const & v,
559
tmat4x2<T> const & m)
561
return typename tmat4x2<T>::row_type(
562
v.x * m[0][0] + v.y * m[0][1],
563
v.x * m[1][0] + v.y * m[1][1],
564
v.x * m[2][0] + v.y * m[2][1],
565
v.x * m[3][0] + v.y * m[3][1]);
568
template <typename T>
569
GLM_FUNC_QUALIFIER tmat2x2<T> operator*
571
tmat4x2<T> const & m1,
572
tmat2x4<T> const & m2
575
T const SrcA00 = m1[0][0];
576
T const SrcA01 = m1[0][1];
577
T const SrcA10 = m1[1][0];
578
T const SrcA11 = m1[1][1];
579
T const SrcA20 = m1[2][0];
580
T const SrcA21 = m1[2][1];
581
T const SrcA30 = m1[3][0];
582
T const SrcA31 = m1[3][1];
584
T const SrcB00 = m2[0][0];
585
T const SrcB01 = m2[0][1];
586
T const SrcB02 = m2[0][2];
587
T const SrcB03 = m2[0][3];
588
T const SrcB10 = m2[1][0];
589
T const SrcB11 = m2[1][1];
590
T const SrcB12 = m2[1][2];
591
T const SrcB13 = m2[1][3];
593
tmat2x2<T> Result(tmat2x2<T>::null);
594
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;
595
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;
596
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;
597
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;
601
template <typename T>
602
GLM_FUNC_QUALIFIER tmat3x2<T> operator*
604
tmat4x2<T> const & m1,
605
tmat3x4<T> const & m2
609
m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
610
m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
611
m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
612
m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
613
m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
614
m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]);
617
template <typename T>
618
GLM_FUNC_QUALIFIER tmat4x2<T> operator*
620
tmat4x2<T> const & m1,
621
tmat4x4<T> const & m2
625
m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
626
m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
627
m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
628
m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
629
m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
630
m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
631
m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],
632
m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]);
635
template <typename T>
636
GLM_FUNC_QUALIFIER tmat4x2<T> operator/
638
tmat4x2<T> const & m,
639
typename tmat4x2<T>::value_type const & s
649
template <typename T>
650
GLM_FUNC_QUALIFIER tmat4x2<T> operator/
652
typename tmat4x2<T>::value_type const & s,
663
// Unary constant operators
664
template <typename T>
665
GLM_FUNC_QUALIFIER tmat4x2<T> const operator-
677
template <typename T>
678
GLM_FUNC_QUALIFIER tmat4x2<T> const operator++
680
tmat4x2<T> const & m,
685
m[0] + typename tmat4x2<T>::value_type(1),
686
m[1] + typename tmat4x2<T>::value_type(1),
687
m[2] + typename tmat4x2<T>::value_type(1),
688
m[3] + typename tmat4x2<T>::value_type(1));
691
template <typename T>
692
GLM_FUNC_QUALIFIER tmat4x2<T> const operator--
694
tmat4x2<T> const & m,
699
m[0] - typename tmat4x2<T>::value_type(1),
700
m[1] - typename tmat4x2<T>::value_type(1),
701
m[2] - typename tmat4x2<T>::value_type(1),
702
m[3] - typename tmat4x2<T>::value_type(1));
705
//////////////////////////////////////
708
template <typename T>
709
GLM_FUNC_QUALIFIER bool operator==
711
tmat4x2<T> const & m1,
712
tmat4x2<T> const & m2
715
return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]);
718
template <typename T>
719
GLM_FUNC_QUALIFIER bool operator!=
721
tmat4x2<T> const & m1,
722
tmat4x2<T> const & m2
725
return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]);