Browse Source

- Added mix implementation for matrices in EXT_matrix_common #842

Christophe Riccio 6 years ago
parent
commit
6492c8593f

+ 36 - 0
glm/ext/matrix_common.hpp

@@ -0,0 +1,36 @@
+/// @ref ext_matrix_common
+/// @file glm/ext/matrix_common.hpp
+///
+/// @defgroup ext_matrix_common GLM_EXT_matrix_common
+/// @ingroup ext
+///
+/// Defines functions for common matrix operations.
+///
+/// Include <glm/ext/matrix_common.hpp> to use the features of this extension.
+///
+/// @see ext_matrix_common
+
+#pragma once
+
+#include "../detail/qualifier.hpp"
+#include "../detail/_fixes.hpp"
+
+#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
+#	pragma message("GLM: GLM_EXT_matrix_transform extension included")
+#endif
+
+namespace glm
+{
+	/// @addtogroup ext_matrix_common
+	/// @{
+
+	template<length_t C, length_t R, typename T, typename U, qualifier Q>
+	GLM_FUNC_DECL mat<C, R, T, Q> mix(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y, mat<C, R, U, Q> const& a);
+
+	template<length_t C, length_t R, typename T, typename U, qualifier Q>
+	GLM_FUNC_DECL mat<C, R, T, Q> mix(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y, U a);
+
+	/// @}
+}//namespace glm
+
+#include "matrix_common.inl"

+ 16 - 0
glm/ext/matrix_common.inl

@@ -0,0 +1,16 @@
+#include "../matrix.hpp"
+
+namespace glm
+{
+	template<length_t C, length_t R, typename T, typename U, qualifier Q>
+	GLM_FUNC_QUALIFIER mat<C, R, T, Q> mix(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y, U a)
+	{
+		return mat<C, R, U, Q>(x) * (static_cast<U>(1) - a) + mat<C, R, U, Q>(y) * a;
+	}
+
+	template<length_t C, length_t R, typename T, typename U, qualifier Q>
+	GLM_FUNC_QUALIFIER mat<C, R, T, Q> mix(mat<C, R, T, Q> const& x, mat<C, R, T, Q> const& y, mat<C, R, U, Q> const& a)
+	{
+		return matrixCompMult(mat<C, R, U, Q>(x), static_cast<U>(1) - a) + matrixCompMult(mat<C, R, U, Q>(y), a);
+	}
+}//namespace glm

+ 3 - 0
readme.md

@@ -53,6 +53,9 @@ glm::mat4 camera(float Translate, glm::vec2 const& Rotate)
 ## Release notes
 ## Release notes
 
 
 ### [GLM 0.9.9.4](https://github.com/g-truc/glm/tree/master) - 2018-1X-XX
 ### [GLM 0.9.9.4](https://github.com/g-truc/glm/tree/master) - 2018-1X-XX
+#### Features:
+- Added mix implementation for matrices in EXT_matrix_common #842
+
 #### Improvements:
 #### Improvements:
 - Added GLM_FORCE_INTRINSICS to enable SIMD instruction code path. By default, it's disabled allowing constexpr support by default.
 - Added GLM_FORCE_INTRINSICS to enable SIMD instruction code path. By default, it's disabled allowing constexpr support by default.
 
 

+ 1 - 0
test/ext/CMakeLists.txt

@@ -1,5 +1,6 @@
 glmCreateTestGTC(ext_matrix_relational)
 glmCreateTestGTC(ext_matrix_relational)
 glmCreateTestGTC(ext_matrix_transform)
 glmCreateTestGTC(ext_matrix_transform)
+glmCreateTestGTC(ext_matrix_common)
 glmCreateTestGTC(ext_quaternion_common)
 glmCreateTestGTC(ext_quaternion_common)
 glmCreateTestGTC(ext_quaternion_exponential)
 glmCreateTestGTC(ext_quaternion_exponential)
 glmCreateTestGTC(ext_quaternion_geometric)
 glmCreateTestGTC(ext_quaternion_geometric)

+ 53 - 0
test/ext/ext_matrix_common.cpp

@@ -0,0 +1,53 @@
+#include <glm/ext/matrix_common.hpp>
+#include <glm/ext/matrix_double4x4.hpp>
+#include <glm/ext/matrix_float4x4.hpp>
+#include <glm/ext/matrix_relational.hpp>
+#include <glm/ext/vector_bool4.hpp>
+
+static int test_mix()
+{
+	int Error = 0;
+
+	{
+		glm::mat4 A(2);
+		glm::mat4 B(4);
+		glm::mat4 C = glm::mix(A, B, 0.5f);
+		glm::bvec4 const D = glm::equal(C, glm::mat4(3), 1);
+		Error += glm::all(D) ? 0 : 1;
+	}
+
+	{
+		glm::mat4 A(2);
+		glm::mat4 B(4);
+		glm::mat4 C = glm::mix(A, B, 0.5);
+		glm::bvec4 const D = glm::equal(C, glm::mat4(3), 1);
+		Error += glm::all(D) ? 0 : 1;
+	}
+
+	{
+		glm::dmat4 A(2);
+		glm::dmat4 B(4);
+		glm::dmat4 C = glm::mix(A, B, 0.5);
+		glm::bvec4 const D = glm::equal(C, glm::dmat4(3), 1);
+		Error += glm::all(D) ? 0 : 1;
+	}
+
+	{
+		glm::dmat4 A(2);
+		glm::dmat4 B(4);
+		glm::dmat4 C = glm::mix(A, B, 0.5f);
+		glm::bvec4 const D = glm::equal(C, glm::dmat4(3), 1);
+		Error += glm::all(D) ? 0 : 1;
+	}
+
+	return Error;
+}
+
+int main()
+{
+	int Error = 0;
+
+	Error += test_mix();
+
+	return Error;
+}

+ 1 - 0
test/gtc/gtc_matrix_transform.cpp

@@ -1,5 +1,6 @@
 #include <glm/gtc/matrix_transform.hpp>
 #include <glm/gtc/matrix_transform.hpp>
 #include <glm/gtc/constants.hpp>
 #include <glm/gtc/constants.hpp>
+#include <glm/ext/matrix_relational.hpp>
 
 
 int test_perspective()
 int test_perspective()
 {
 {