• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 gtx_simd_vec4
24 /// @file glm/gtx/simd_vec4.hpp
25 /// @date 2009-05-07 / 2011-06-07
26 /// @author Christophe Riccio
27 ///
28 /// @see core (dependence)
29 ///
30 /// @defgroup gtx_simd_mat4 GLM_GTX_simd_mat4
31 /// @ingroup gtx
32 ///
33 /// @brief SIMD implementation of mat4 type.
34 ///
35 /// <glm/gtx/simd_mat4.hpp> need to be included to use these functionalities.
36 ///////////////////////////////////////////////////////////////////////////////////
37 
38 #ifndef GLM_GTX_simd_mat4
39 #define GLM_GTX_simd_mat4
40 
41 // Dependencies
42 #include "../detail/setup.hpp"
43 
44 #if(GLM_ARCH != GLM_ARCH_PURE)
45 
46 #if(GLM_ARCH & GLM_ARCH_SSE2)
47 #	include "../detail/intrinsic_matrix.hpp"
48 #	include "../gtx/simd_vec4.hpp"
49 #else
50 #	error "GLM: GLM_GTX_simd_mat4 requires compiler support of SSE2 through intrinsics"
51 #endif
52 
53 #if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
54 #	pragma message("GLM: GLM_GTX_simd_mat4 extension included")
55 #endif
56 
57 namespace glm{
58 namespace detail
59 {
60 	/// 4x4 Matrix implemented using SIMD SEE intrinsics.
61 	/// \ingroup gtx_simd_mat4
62 	GLM_ALIGNED_STRUCT(16) fmat4x4SIMD
63 	{
64 		enum ctor{_null};
65 		typedef float value_type;
66 		typedef fvec4SIMD col_type;
67 		typedef fvec4SIMD row_type;
68 		typedef std::size_t size_type;
69 		typedef fmat4x4SIMD type;
70 		typedef fmat4x4SIMD transpose_type;
71 
72 		GLM_FUNC_DECL length_t length() const;
73 
74 		fvec4SIMD Data[4];
75 
76 		//////////////////////////////////////
77 		// Constructors
78 
79 		fmat4x4SIMD();
80 		explicit fmat4x4SIMD(float const & s);
81 		explicit fmat4x4SIMD(
82 			float const & x0, float const & y0, float const & z0, float const & w0,
83 			float const & x1, float const & y1, float const & z1, float const & w1,
84 			float const & x2, float const & y2, float const & z2, float const & w2,
85 			float const & x3, float const & y3, float const & z3, float const & w3);
86 		explicit fmat4x4SIMD(
87 			fvec4SIMD const & v0,
88 			fvec4SIMD const & v1,
89 			fvec4SIMD const & v2,
90 			fvec4SIMD const & v3);
91 		explicit fmat4x4SIMD(
92 			mat4x4 const & m);
93 		explicit fmat4x4SIMD(
94 			__m128 const in[4]);
95 
96 		// Conversions
97 		//template <typename U>
98 		//explicit tmat4x4(tmat4x4<U> const & m);
99 
100 		//explicit tmat4x4(tmat2x2<T> const & x);
101 		//explicit tmat4x4(tmat3x3<T> const & x);
102 		//explicit tmat4x4(tmat2x3<T> const & x);
103 		//explicit tmat4x4(tmat3x2<T> const & x);
104 		//explicit tmat4x4(tmat2x4<T> const & x);
105 		//explicit tmat4x4(tmat4x2<T> const & x);
106 		//explicit tmat4x4(tmat3x4<T> const & x);
107 		//explicit tmat4x4(tmat4x3<T> const & x);
108 
109 		// Accesses
110 		fvec4SIMD & operator[](length_t i);
111 		fvec4SIMD const & operator[](length_t i) const;
112 
113 		// Unary updatable operators
114 		fmat4x4SIMD & operator= (fmat4x4SIMD const & m);
115 		fmat4x4SIMD & operator+= (float const & s);
116 		fmat4x4SIMD & operator+= (fmat4x4SIMD const & m);
117 		fmat4x4SIMD & operator-= (float const & s);
118 		fmat4x4SIMD & operator-= (fmat4x4SIMD const & m);
119 		fmat4x4SIMD & operator*= (float const & s);
120 		fmat4x4SIMD & operator*= (fmat4x4SIMD const & m);
121 		fmat4x4SIMD & operator/= (float const & s);
122 		fmat4x4SIMD & operator/= (fmat4x4SIMD const & m);
123 		fmat4x4SIMD & operator++ ();
124 		fmat4x4SIMD & operator-- ();
125 	};
126 
127 	// Binary operators
128 	fmat4x4SIMD operator+ (fmat4x4SIMD const & m, float const & s);
129 	fmat4x4SIMD operator+ (float const & s, fmat4x4SIMD const & m);
130 	fmat4x4SIMD operator+ (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2);
131 
132 	fmat4x4SIMD operator- (fmat4x4SIMD const & m, float const & s);
133 	fmat4x4SIMD operator- (float const & s, fmat4x4SIMD const & m);
134 	fmat4x4SIMD operator- (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2);
135 
136 	fmat4x4SIMD operator* (fmat4x4SIMD const & m, float const & s);
137 	fmat4x4SIMD operator* (float const & s, fmat4x4SIMD const & m);
138 
139 	fvec4SIMD operator* (fmat4x4SIMD const & m, fvec4SIMD const & v);
140 	fvec4SIMD operator* (fvec4SIMD const & v, fmat4x4SIMD const & m);
141 
142 	fmat4x4SIMD operator* (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2);
143 
144 	fmat4x4SIMD operator/ (fmat4x4SIMD const & m, float const & s);
145 	fmat4x4SIMD operator/ (float const & s, fmat4x4SIMD const & m);
146 
147 	fvec4SIMD operator/ (fmat4x4SIMD const & m, fvec4SIMD const & v);
148 	fvec4SIMD operator/ (fvec4SIMD const & v, fmat4x4SIMD const & m);
149 
150 	fmat4x4SIMD operator/ (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2);
151 
152 	// Unary constant operators
153 	fmat4x4SIMD const operator-  (fmat4x4SIMD const & m);
154 	fmat4x4SIMD const operator-- (fmat4x4SIMD const & m, int);
155 	fmat4x4SIMD const operator++ (fmat4x4SIMD const & m, int);
156 }//namespace detail
157 
158 	typedef detail::fmat4x4SIMD simdMat4;
159 
160 	/// @addtogroup gtx_simd_mat4
161 	/// @{
162 
163 	//! Convert a simdMat4 to a mat4.
164 	//! (From GLM_GTX_simd_mat4 extension)
165 	mat4 mat4_cast(
166 		detail::fmat4x4SIMD const & x);
167 
168 	//! Multiply matrix x by matrix y component-wise, i.e.,
169 	//! result[i][j] is the scalar product of x[i][j] and y[i][j].
170 	//! (From GLM_GTX_simd_mat4 extension).
171 	detail::fmat4x4SIMD matrixCompMult(
172 		detail::fmat4x4SIMD const & x,
173 		detail::fmat4x4SIMD const & y);
174 
175 	//! Treats the first parameter c as a column vector
176 	//! and the second parameter r as a row vector
177 	//! and does a linear algebraic matrix multiply c * r.
178 	//! (From GLM_GTX_simd_mat4 extension).
179 	detail::fmat4x4SIMD outerProduct(
180 		detail::fvec4SIMD const & c,
181 		detail::fvec4SIMD const & r);
182 
183 	//! Returns the transposed matrix of x
184 	//! (From GLM_GTX_simd_mat4 extension).
185 	detail::fmat4x4SIMD transpose(
186 		detail::fmat4x4SIMD const & x);
187 
188 	//! Return the determinant of a mat4 matrix.
189 	//! (From GLM_GTX_simd_mat4 extension).
190 	float determinant(
191 		detail::fmat4x4SIMD const & m);
192 
193 	//! Return the inverse of a mat4 matrix.
194 	//! (From GLM_GTX_simd_mat4 extension).
195 	detail::fmat4x4SIMD inverse(
196 		detail::fmat4x4SIMD const & m);
197 
198 	/// @}
199 }// namespace glm
200 
201 #include "simd_mat4.inl"
202 
203 #endif//(GLM_ARCH != GLM_ARCH_PURE)
204 
205 #endif//GLM_GTX_simd_mat4
206