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 38 namespace glm{ 39 namespace 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