Browse Source

Merge branch '0.9.2' into 0.9.3

Christophe Riccio 14 năm trước cách đây
mục cha
commit
499e5291e4

+ 34 - 0
glm/core/type_mat2x2.inl

@@ -556,6 +556,40 @@ namespace detail
 			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);
 			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);
 	}
 	}
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat3x2<T> operator* 
+	(
+		tmat2x2<T> const & m1, 
+		tmat3x2<T> const & m2
+	)
+	{
+		return tmat3x2<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat4x2<T> operator* 
+	(
+		tmat2x2<T> const & m1, 
+		tmat4x2<T> const & m2
+	)
+	{
+		return tmat4x2<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
+			m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
+			m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat2x2<T> operator/ 
     GLM_FUNC_QUALIFIER tmat2x2<T> operator/ 
 	(
 	(

+ 38 - 0
glm/core/type_mat2x3.inl

@@ -487,6 +487,22 @@ namespace detail
             v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]);
             v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]);
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat2x3<T> operator* 
+	(
+		tmat2x3<T> const & m1, 
+		tmat2x2<T> const & m2
+	)
+	{
+		return tmat2x3<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat3x3<T> operator* 
     GLM_FUNC_QUALIFIER tmat3x3<T> operator* 
 	(
 	(
@@ -521,6 +537,28 @@ namespace detail
 		return Result;
 		return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat4x3<T> operator* 
+	(
+		tmat2x3<T> const & m1, 
+		tmat4x2<T> const & m2
+	)
+	{
+		return tmat4x3<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
+			m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],
+			m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1],
+			m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1],
+			m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat2x3<T> operator/ 
     GLM_FUNC_QUALIFIER tmat2x3<T> operator/ 
 	(
 	(

+ 40 - 0
glm/core/type_mat2x4.inl

@@ -549,6 +549,46 @@ namespace detail
 		return Result;
 		return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat2x4<T> operator* 
+	(
+		tmat2x4<T> const & m1, 
+		tmat2x2<T> const & m2
+	)
+	{
+		return tmat2x4<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],
+			m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
+			m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat3x4<T> operator* 
+	(
+		tmat2x4<T> const & m1, 
+		tmat3x2<T> const & m2
+	)
+	{
+		return tmat3x4<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1],
+			m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1],
+			m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1],
+			m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1],
+			m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat2x4<T> operator/ 
     GLM_FUNC_QUALIFIER tmat2x4<T> operator/ 
 	(
 	(

+ 34 - 0
glm/core/type_mat3x2.inl

@@ -554,6 +554,40 @@ namespace detail
         return Result;
         return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat3x2<T> operator* 
+	(
+		tmat3x2<T> const & m1, 
+		tmat3x3<T> const & m2
+	)
+	{
+		return tmat3x2<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat4x2<T> operator* 
+	(
+		tmat3x2<T> const & m1, 
+		tmat4x3<T> const & m2
+	)
+	{
+		return tmat4x2<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
+			m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],
+			m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat3x2<T> operator/ 
     GLM_FUNC_QUALIFIER tmat3x2<T> operator/ 
 	(
 	(

+ 37 - 0
glm/core/type_mat3x3.inl

@@ -652,6 +652,43 @@ namespace detail
 		return Result;
 		return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat2x3<T> operator* 
+	(
+		tmat3x3<T> const & m1, 
+		tmat2x3<T> const & m2
+	)
+	{
+		return tmat2x3<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat4x3<T> operator* 
+	(
+		tmat3x3<T> const & m1, 
+		tmat4x3<T> const & m2
+	)
+	{
+		return tmat4x3<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
+			m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],
+			m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2],
+			m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2],
+			m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]);
+	}
 
 
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat3x3<T> operator/ 
     GLM_FUNC_QUALIFIER tmat3x3<T> operator/ 

+ 40 - 0
glm/core/type_mat3x4.inl

@@ -586,6 +586,46 @@ namespace detail
         return Result;
         return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat2x4<T> operator* 
+	(
+		tmat3x4<T> const & m1, 
+		tmat2x3<T> const & m2
+	)
+	{
+		return tmat2x4<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],
+			m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
+			m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat3x4<T> operator* 
+	(
+		tmat3x4<T> const & m1, 
+		tmat3x3<T> const & m2
+	)
+	{
+		return tmat3x4<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2],
+			m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2],
+			m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2],
+			m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2],
+			m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat3x4<T> operator/ 
     GLM_FUNC_QUALIFIER tmat3x4<T> operator/ 
 	(
 	(

+ 34 - 0
glm/core/type_mat4x2.inl

@@ -598,6 +598,40 @@ namespace detail
         return Result;
         return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat3x2<T> operator* 
+	(
+		tmat4x2<T> const & m1, 
+		tmat3x4<T> const & m2
+	)
+	{
+		return tmat3x2<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat4x2<T> operator* 
+	(
+		tmat4x2<T> const & m1, 
+		tmat4x4<T> const & m2
+	)
+	{
+		return tmat4x2<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
+			m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],
+			m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat4x2<T> operator/ 
     GLM_FUNC_QUALIFIER tmat4x2<T> operator/ 
 	(
 	(

+ 38 - 0
glm/core/type_mat4x3.inl

@@ -556,6 +556,22 @@ namespace detail
             v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]);
             v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]);
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat2x3<T> operator* 
+	(
+		tmat4x3<T> const & m1, 
+		tmat2x4<T> const & m2
+	)
+	{
+		return tmat2x3<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat3x3<T> operator* 
     GLM_FUNC_QUALIFIER tmat3x3<T> operator* 
 	(
 	(
@@ -602,6 +618,28 @@ namespace detail
         return Result;
         return Result;
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat4x3<T> operator* 
+	(
+		tmat4x3<T> const & m1, 
+		tmat4x4<T> const & m2
+	)
+	{
+		return tmat4x3<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
+			m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],
+			m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3],
+			m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3],
+			m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat4x3<T> operator/ 
     GLM_FUNC_QUALIFIER tmat4x3<T> operator/ 
 	(
 	(

+ 40 - 0
glm/core/type_mat4x4.inl

@@ -713,6 +713,46 @@ namespace detail
             m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w);
             m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w);
     }
     }
 
 
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat2x4<T> operator* 
+	(
+		tmat4x4<T> const & m1, 
+		tmat2x4<T> const & m2
+	)
+	{
+		return tmat2x4<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],
+			m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
+			m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]);
+	}
+
+	template <typename T>
+	GLM_FUNC_QUALIFIER tmat3x4<T> operator* 
+	(
+		tmat4x4<T> const & m1, 
+		tmat3x4<T> const & m2
+	)
+	{
+		return tmat3x4<T>(
+			m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3],
+			m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3],
+			m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3],
+			m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3],
+			m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3],
+			m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3],
+			m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3],
+			m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3],
+			m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3],
+			m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3],
+			m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3],
+			m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]);
+	}
+
     template <typename T> 
     template <typename T> 
     GLM_FUNC_QUALIFIER tmat4x4<T> operator* 
     GLM_FUNC_QUALIFIER tmat4x4<T> operator* 
 	(
 	(

+ 1 - 0
readme.txt

@@ -52,6 +52,7 @@ generation distribution.
 GLM 0.9.2.7: 2011-1X-XX
 GLM 0.9.2.7: 2011-1X-XX
 --------------------------------------------------------------------------------
 --------------------------------------------------------------------------------
 - Added more swizzling constructors
 - Added more swizzling constructors
+- Added missing none-squared matrix products
 
 
 ================================================================================
 ================================================================================
 GLM 0.9.2.6: 2011-10-01
 GLM 0.9.2.6: 2011-10-01