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_mat2x3.inl
25
/// @date 2006-08-05 / 2011-06-15
26
/// @author Christophe Riccio
27
///////////////////////////////////////////////////////////////////////////////////
33
GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::length() const
39
GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::col_size()
45
GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::row_size()
50
//////////////////////////////////////
54
GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type &
55
tmat2x3<T>::operator[]
60
assert(i < this->length());
61
return this->value[i];
65
GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type const &
66
tmat2x3<T>::operator[]
71
assert(i < this->length());
72
return this->value[i];
75
//////////////////////////////////////////////////////////////
79
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3()
81
this->value[0] = col_type(T(1), T(0), T(0));
82
this->value[1] = col_type(T(0), T(1), T(0));
86
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
91
this->value[0] = m.value[0];
92
this->value[1] = m.value[1];
96
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
102
template <typename T>
103
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
108
this->value[0] = col_type(s, T(0), T(0));
109
this->value[1] = col_type(T(0), s, T(0));
112
template <typename T>
113
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
115
value_type const & x0, value_type const & y0, value_type const & z0,
116
value_type const & x1, value_type const & y1, value_type const & z1
119
this->value[0] = col_type(x0, y0, z0);
120
this->value[1] = col_type(x1, y1, z1);
123
template <typename T>
124
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
134
//////////////////////////////////////
135
// Convertion constructors
136
template <typename T>
137
template <typename U>
138
GLM_FUNC_DECL tmat2x3<T>::tmat2x3
143
value_type const Zero(0);
144
this->value[0] = tvec3<T>(value_type(s), Zero, Zero);
145
this->value[1] = tvec3<T>(Zero, value_type(s), Zero);
148
template <typename T>
150
typename X1, typename Y1, typename Z1,
151
typename X2, typename Y2, typename Z2>
152
GLM_FUNC_DECL tmat2x3<T>::tmat2x3
154
X1 const & x1, Y1 const & y1, Z1 const & z1,
155
X2 const & x2, Y2 const & y2, Z2 const & z2
158
this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1));
159
this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2));
162
template <typename T>
163
template <typename V1, typename V2>
164
GLM_FUNC_DECL tmat2x3<T>::tmat2x3
166
tvec3<V1> const & v1,
170
this->value[0] = col_type(v1);
171
this->value[1] = col_type(v2);
174
//////////////////////////////////////
175
// Matrix conversions
177
template <typename T>
178
template <typename U>
179
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
184
this->value[0] = col_type(m[0]);
185
this->value[1] = col_type(m[1]);
188
template <typename T>
189
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
194
this->value[0] = col_type(m[0], T(0));
195
this->value[1] = col_type(m[1], T(0));
198
template <typename T>
199
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
204
this->value[0] = col_type(m[0]);
205
this->value[1] = col_type(m[1]);
208
template <typename T>
209
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
214
this->value[0] = col_type(m[0]);
215
this->value[1] = col_type(m[1]);
218
template <typename T>
219
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
224
this->value[0] = col_type(m[0]);
225
this->value[1] = col_type(m[1]);
228
template <typename T>
229
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
234
this->value[0] = col_type(m[0], T(0));
235
this->value[1] = col_type(m[1], T(0));
238
template <typename T>
239
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
244
this->value[0] = col_type(m[0]);
245
this->value[1] = col_type(m[1]);
248
template <typename T>
249
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
254
this->value[0] = col_type(m[0], T(0));
255
this->value[1] = col_type(m[1], T(0));
258
template <typename T>
259
GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3
264
this->value[0] = m[0];
265
this->value[1] = m[1];
268
//////////////////////////////////////////////////////////////
269
// Unary updatable operators
271
template <typename T>
272
GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator=
277
this->value[0] = m[0];
278
this->value[1] = m[1];
282
template <typename T>
283
template <typename U>
284
GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator=
289
this->value[0] = m[0];
290
this->value[1] = m[1];
294
template <typename T>
295
template <typename U>
296
GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator+=
306
template <typename T>
307
template <typename U>
308
GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator+=
313
this->value[0] += m[0];
314
this->value[1] += m[1];
318
template <typename T>
319
template <typename U>
320
GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator-=
330
template <typename T>
331
template <typename U>
332
GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator-=
337
this->value[0] -= m[0];
338
this->value[1] -= m[1];
342
template <typename T>
343
template <typename U>
344
GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator*=
354
template <typename T>
355
template <typename U>
356
GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator*=
361
return (*this = tmat2x3<U>(*this * m));
364
template <typename T>
365
template <typename U>
366
GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator/=
376
template <typename T>
377
GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator++ ()
384
template <typename T>
385
GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator-- ()
392
//////////////////////////////////////////////////////////////
395
template <typename T>
396
GLM_FUNC_QUALIFIER tmat2x3<T> operator+
398
tmat2x3<T> const & m,
399
typename tmat2x3<T>::value_type const & s
407
template <typename T>
408
GLM_FUNC_QUALIFIER tmat2x3<T> operator+
410
tmat2x3<T> const & m1,
411
tmat2x3<T> const & m2
419
template <typename T>
420
GLM_FUNC_QUALIFIER tmat2x3<T> operator-
422
tmat2x3<T> const & m,
423
typename tmat2x3<T>::value_type const & s
431
template <typename T>
432
GLM_FUNC_QUALIFIER tmat2x3<T> operator-
434
tmat2x3<T> const & m1,
435
tmat2x3<T> const & m2
443
template <typename T>
444
GLM_FUNC_QUALIFIER tmat2x3<T> operator*
446
tmat2x3<T> const & m,
447
typename tmat2x3<T>::value_type const & s
455
template <typename T>
456
GLM_FUNC_QUALIFIER tmat2x3<T> operator*
458
typename tmat2x3<T>::value_type const & s,
467
template <typename T>
468
GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type operator*
470
tmat2x3<T> const & m,
471
typename tmat2x3<T>::row_type const & v)
473
return typename tmat2x3<T>::col_type(
474
m[0][0] * v.x + m[1][0] * v.y,
475
m[0][1] * v.x + m[1][1] * v.y,
476
m[0][2] * v.x + m[1][2] * v.y);
479
template <typename T>
480
GLM_FUNC_QUALIFIER typename tmat2x3<T>::row_type operator*
482
typename tmat2x3<T>::col_type const & v,
483
tmat2x3<T> const & m)
485
return typename tmat2x3<T>::row_type(
486
v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2],
487
v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]);
490
template <typename T>
491
GLM_FUNC_QUALIFIER tmat2x3<T> operator*
493
tmat2x3<T> const & m1,
494
tmat2x2<T> const & m2
498
m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
499
m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
500
m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],
501
m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
502
m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
503
m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]);
506
template <typename T>
507
GLM_FUNC_QUALIFIER tmat3x3<T> operator*
509
tmat2x3<T> const & m1,
510
tmat3x2<T> const & m2
513
typename tmat2x3<T>::value_type SrcA00 = m1[0][0];
514
typename tmat2x3<T>::value_type SrcA01 = m1[0][1];
515
typename tmat2x3<T>::value_type SrcA02 = m1[0][2];
516
typename tmat2x3<T>::value_type SrcA10 = m1[1][0];
517
typename tmat2x3<T>::value_type SrcA11 = m1[1][1];
518
typename tmat2x3<T>::value_type SrcA12 = m1[1][2];
520
typename tmat2x3<T>::value_type SrcB00 = m2[0][0];
521
typename tmat2x3<T>::value_type SrcB01 = m2[0][1];
522
typename tmat2x3<T>::value_type SrcB10 = m2[1][0];
523
typename tmat2x3<T>::value_type SrcB11 = m2[1][1];
524
typename tmat2x3<T>::value_type SrcB20 = m2[2][0];
525
typename tmat2x3<T>::value_type SrcB21 = m2[2][1];
527
tmat3x3<T> Result(tmat3x3<T>::null);
528
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
529
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
530
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;
531
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;
532
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;
533
Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;
534
Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;
535
Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;
536
Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;
540
template <typename T>
541
GLM_FUNC_QUALIFIER tmat4x3<T> operator*
543
tmat2x3<T> const & m1,
544
tmat4x2<T> const & m2
548
m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
549
m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
550
m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],
551
m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
552
m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
553
m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
554
m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
555
m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
556
m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],
557
m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
558
m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1],
559
m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]);
562
template <typename T>
563
GLM_FUNC_QUALIFIER tmat2x3<T> operator/
565
tmat2x3<T> const & m,
566
typename tmat2x3<T>::value_type const & s
574
template <typename T>
575
GLM_FUNC_QUALIFIER tmat2x3<T> operator/
577
typename tmat2x3<T>::value_type const & s,
586
// Unary constant operators
587
template <typename T>
588
GLM_FUNC_QUALIFIER tmat2x3<T> const operator-
598
template <typename T>
599
GLM_FUNC_QUALIFIER tmat2x3<T> const operator++
601
tmat2x3<T> const & m,
606
m[0] + typename tmat2x3<T>::value_type(1),
607
m[1] + typename tmat2x3<T>::value_type(1));
610
template <typename T>
611
GLM_FUNC_QUALIFIER tmat2x3<T> const operator--
613
tmat2x3<T> const & m,
618
m[0] - typename tmat2x3<T>::value_type(1),
619
m[1] - typename tmat2x3<T>::value_type(1));
622
//////////////////////////////////////
625
template <typename T>
626
GLM_FUNC_QUALIFIER bool operator==
628
tmat2x3<T> const & m1,
629
tmat2x3<T> const & m2
632
return (m1[0] == m2[0]) && (m1[1] == m2[1]);
635
template <typename T>
636
GLM_FUNC_QUALIFIER bool operator!=
638
tmat2x3<T> const & m1,
639
tmat2x3<T> const & m2
642
return (m1[0] != m2[0]) || (m1[1] != m2[1]);