Home | History | Annotate | Download | only in gtx
      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