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