1///////////////////////////////////////////////////////////////////////////////////
2/// OpenGL Mathematics (glm.g-truc.net)
3///
4/// Copyright (c) 2005 - 2014 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:
11///
12/// The above copyright notice and this permission notice shall be included in
13/// all copies or substantial portions of the Software.
14///
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
21/// THE SOFTWARE.
22///
23/// @ref core
24/// @file glm/core/type_mat4x4.hpp
25/// @date 2005-01-27 / 2011-06-15
26/// @author Christophe Riccio
27///////////////////////////////////////////////////////////////////////////////////
28
29#ifndef glm_core_type_mat4x4
30#define glm_core_type_mat4x4
31
32#include "../fwd.hpp"
33#include "type_vec4.hpp"
34#include "type_mat.hpp"
35#include <limits>
36#include <cstddef>
37
38namespace glm{
39namespace detail
40{
41	template <typename T, precision P>
42	struct tmat4x4
43	{
44		enum ctor{_null};
45		typedef T value_type;
46		typedef std::size_t size_type;
47		typedef tvec4<T, P> col_type;
48		typedef tvec4<T, P> row_type;
49		typedef tmat4x4<T, P> type;
50		typedef tmat4x4<T, P> transpose_type;
51
52		GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;
53
54		template <typename U, precision Q>
55		friend tvec4<U, Q> operator/(tmat4x4<U, Q> const & m, tvec4<U, Q> const & v);
56		template <typename U, precision Q>
57		friend tvec4<U, Q> operator/(tvec4<U, Q> const & v, tmat4x4<U, Q> const & m);
58
59	private:
60		/// @cond DETAIL
61		col_type value[4];
62
63	public:
64		// Constructors
65		GLM_FUNC_DECL tmat4x4();
66		GLM_FUNC_DECL tmat4x4(tmat4x4<T, P> const & m);
67		template <precision Q>
68		GLM_FUNC_DECL tmat4x4(tmat4x4<T, Q> const & m);
69
70		GLM_FUNC_DECL explicit tmat4x4(
71			ctor Null);
72		GLM_FUNC_DECL explicit tmat4x4(
73			T const & x);
74		GLM_FUNC_DECL tmat4x4(
75			T const & x0, T const & y0, T const & z0, T const & w0,
76			T const & x1, T const & y1, T const & z1, T const & w1,
77			T const & x2, T const & y2, T const & z2, T const & w2,
78			T const & x3, T const & y3, T const & z3, T const & w3);
79		GLM_FUNC_DECL tmat4x4(
80			col_type const & v0,
81			col_type const & v1,
82			col_type const & v2,
83			col_type const & v3);
84
85		//////////////////////////////////////
86		// Conversions
87
88		template <
89			typename X1, typename Y1, typename Z1, typename W1,
90			typename X2, typename Y2, typename Z2, typename W2,
91			typename X3, typename Y3, typename Z3, typename W3,
92			typename X4, typename Y4, typename Z4, typename W4>
93		GLM_FUNC_DECL tmat4x4(
94			X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1,
95			X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2,
96			X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3,
97			X4 const & x4, Y4 const & y4, Z4 const & z4, W4 const & w4);
98
99		template <typename V1, typename V2, typename V3, typename V4>
100		GLM_FUNC_DECL tmat4x4(
101			tvec4<V1, P> const & v1,
102			tvec4<V2, P> const & v2,
103			tvec4<V3, P> const & v3,
104			tvec4<V4, P> const & v4);
105
106		// Matrix conversions
107		template <typename U, precision Q>
108		GLM_FUNC_DECL explicit tmat4x4(tmat4x4<U, Q> const & m);
109
110		GLM_FUNC_DECL explicit tmat4x4(tmat2x2<T, P> const & x);
111		GLM_FUNC_DECL explicit tmat4x4(tmat3x3<T, P> const & x);
112		GLM_FUNC_DECL explicit tmat4x4(tmat2x3<T, P> const & x);
113		GLM_FUNC_DECL explicit tmat4x4(tmat3x2<T, P> const & x);
114		GLM_FUNC_DECL explicit tmat4x4(tmat2x4<T, P> const & x);
115		GLM_FUNC_DECL explicit tmat4x4(tmat4x2<T, P> const & x);
116		GLM_FUNC_DECL explicit tmat4x4(tmat3x4<T, P> const & x);
117		GLM_FUNC_DECL explicit tmat4x4(tmat4x3<T, P> const & x);
118
119		// Accesses
120		GLM_FUNC_DECL col_type & operator[](length_t i);
121		GLM_FUNC_DECL col_type const & operator[](length_t i) const;
122
123		// Unary updatable operators
124		GLM_FUNC_DECL tmat4x4<T, P> & operator=  (tmat4x4<T, P> const & m);
125		template <typename U>
126		GLM_FUNC_DECL tmat4x4<T, P> & operator=  (tmat4x4<U, P> const & m);
127		template <typename U>
128		GLM_FUNC_DECL tmat4x4<T, P> & operator+= (U s);
129		template <typename U>
130		GLM_FUNC_DECL tmat4x4<T, P> & operator+= (tmat4x4<U, P> const & m);
131		template <typename U>
132		GLM_FUNC_DECL tmat4x4<T, P> & operator-= (U s);
133		template <typename U>
134		GLM_FUNC_DECL tmat4x4<T, P> & operator-= (tmat4x4<U, P> const & m);
135		template <typename U>
136		GLM_FUNC_DECL tmat4x4<T, P> & operator*= (U s);
137		template <typename U>
138		GLM_FUNC_DECL tmat4x4<T, P> & operator*= (tmat4x4<U, P> const & m);
139		template <typename U>
140		GLM_FUNC_DECL tmat4x4<T, P> & operator/= (U s);
141		template <typename U>
142		GLM_FUNC_DECL tmat4x4<T, P> & operator/= (tmat4x4<U, P> const & m);
143
144		//////////////////////////////////////
145		// Increment and decrement operators
146
147		GLM_FUNC_DECL tmat4x4<T, P> & operator++ ();
148		GLM_FUNC_DECL tmat4x4<T, P> & operator-- ();
149		GLM_FUNC_DECL tmat4x4<T, P> operator++(int);
150		GLM_FUNC_DECL tmat4x4<T, P> operator--(int);
151	};
152
153	template <typename T, precision P>
154	GLM_FUNC_DECL tmat4x4<T, P> compute_inverse_mat4(tmat4x4<T, P> const & m);
155
156	// Binary operators
157	template <typename T, precision P>
158	GLM_FUNC_DECL tmat4x4<T, P> operator+ (
159		tmat4x4<T, P> const & m,
160		T const & s);
161
162	template <typename T, precision P>
163	GLM_FUNC_DECL tmat4x4<T, P> operator+ (
164		T const & s,
165		tmat4x4<T, P> const & m);
166
167	template <typename T, precision P>
168	GLM_FUNC_DECL tmat4x4<T, P> operator+ (
169		tmat4x4<T, P> const & m1,
170		tmat4x4<T, P> const & m2);
171
172	template <typename T, precision P>
173	GLM_FUNC_DECL tmat4x4<T, P> operator- (
174		tmat4x4<T, P> const & m,
175		T const & s);
176
177	template <typename T, precision P>
178	GLM_FUNC_DECL tmat4x4<T, P> operator- (
179		T const & s,
180		tmat4x4<T, P> const & m);
181
182	template <typename T, precision P>
183	GLM_FUNC_DECL tmat4x4<T, P> operator- (
184		tmat4x4<T, P> const & m1,
185		tmat4x4<T, P> const & m2);
186
187	template <typename T, precision P>
188	GLM_FUNC_DECL tmat4x4<T, P> operator* (
189		tmat4x4<T, P> const & m,
190		T const & s);
191
192	template <typename T, precision P>
193	GLM_FUNC_DECL tmat4x4<T, P> operator* (
194		T const & s,
195		tmat4x4<T, P> const & m);
196
197	template <typename T, precision P>
198	GLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator* (
199		tmat4x4<T, P> const & m,
200		typename tmat4x4<T, P>::row_type const & v);
201
202	template <typename T, precision P>
203	GLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator* (
204		typename tmat4x4<T, P>::col_type const & v,
205		tmat4x4<T, P> const & m);
206
207	template <typename T, precision P>
208	GLM_FUNC_DECL tmat2x4<T, P> operator* (
209		tmat4x4<T, P> const & m1,
210		tmat2x4<T, P> const & m2);
211
212	template <typename T, precision P>
213	GLM_FUNC_DECL tmat3x4<T, P> operator* (
214		tmat4x4<T, P> const & m1,
215		tmat3x4<T, P> const & m2);
216
217	template <typename T, precision P>
218	GLM_FUNC_DECL tmat4x4<T, P> operator* (
219		tmat4x4<T, P> const & m1,
220		tmat4x4<T, P> const & m2);
221
222	template <typename T, precision P>
223	GLM_FUNC_DECL tmat4x4<T, P> operator/ (
224		tmat4x4<T, P> const & m,
225		T const & s);
226
227	template <typename T, precision P>
228	GLM_FUNC_DECL tmat4x4<T, P> operator/ (
229		T const & s,
230		tmat4x4<T, P> const & m);
231
232	template <typename T, precision P>
233	GLM_FUNC_DECL typename tmat4x4<T, P>::col_type operator/ (
234		tmat4x4<T, P> const & m,
235		typename tmat4x4<T, P>::row_type const & v);
236
237	template <typename T, precision P>
238	GLM_FUNC_DECL typename tmat4x4<T, P>::row_type operator/ (
239		typename tmat4x4<T, P>::col_type & v,
240		tmat4x4<T, P> const & m);
241
242	template <typename T, precision P>
243	GLM_FUNC_DECL tmat4x4<T, P> operator/ (
244		tmat4x4<T, P> const & m1,
245		tmat4x4<T, P> const & m2);
246
247	// Unary constant operators
248	template <typename T, precision P>
249	GLM_FUNC_DECL tmat4x4<T, P> const operator-  (
250		tmat4x4<T, P> const & m);
251
252}//namespace detail
253}//namespace glm
254
255#ifndef GLM_EXTERNAL_TEMPLATE
256#include "type_mat4x4.inl"
257#endif//GLM_EXTERNAL_TEMPLATE
258
259#endif//glm_core_type_mat4x4
260