|  |  | @ -6,40 +6,38 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | namespace glm |  |  |  | namespace glm | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	template<typename T, precision P> |  |  |  | 	template<typename T, precision P> | 
			
		
	
		
		
			
				
					
					|  |  |  | 	GLM_FUNC_QUALIFIER void axisAngle |  |  |  | 	GLM_FUNC_QUALIFIER void axisAngle(mat<4, 4, T, P> const& mat, vec<3, T, P> & axis, T & angle) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	( |  |  |  | 	{ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		mat<4, 4, T, P> const& mat, |  |  |  | 		T epsilon = static_cast<T>(0.01); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		vec<3, T, P> & axis, |  |  |  | 		T epsilon2 = static_cast<T>(0.1); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		T & angle |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T epsilon = (T)0.01; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T epsilon2 = (T)0.1; |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if((abs(mat[1][0] - mat[0][1]) < epsilon) && (abs(mat[2][0] - mat[0][2]) < epsilon) && (abs(mat[2][1] - mat[1][2]) < epsilon)) |  |  |  | 		if((abs(mat[1][0] - mat[0][1]) < epsilon) && (abs(mat[2][0] - mat[0][2]) < epsilon) && (abs(mat[2][1] - mat[1][2]) < epsilon)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 		{ |  |  |  | 		{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 			if ((abs(mat[1][0] + mat[0][1]) < epsilon2) && (abs(mat[2][0] + mat[0][2]) < epsilon2) && (abs(mat[2][1] + mat[1][2]) < epsilon2) && (abs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) |  |  |  | 			if ((abs(mat[1][0] + mat[0][1]) < epsilon2) && (abs(mat[2][0] + mat[0][2]) < epsilon2) && (abs(mat[2][1] + mat[1][2]) < epsilon2) && (abs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  | 			{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 				angle = (T)0.0; |  |  |  | 				angle = static_cast<T>(0.0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				axis.x = (T)1.0; |  |  |  | 				axis.x = static_cast<T>(1.0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				axis.y = (T)0.0; |  |  |  | 				axis.y = static_cast<T>(0.0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				axis.z = (T)0.0; |  |  |  | 				axis.z = static_cast<T>(0.0); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 				return; |  |  |  | 				return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			angle = static_cast<T>(3.1415926535897932384626433832795); |  |  |  | 			angle = static_cast<T>(3.1415926535897932384626433832795); | 
			
		
	
		
		
			
				
					
					|  |  |  | 			T xx = (mat[0][0] + (T)1.0) * (T)0.5; |  |  |  | 			T xx = (mat[0][0] + static_cast<T>(1.0)) * static_cast<T>(0.5); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			T yy = (mat[1][1] + (T)1.0) * (T)0.5; |  |  |  | 			T yy = (mat[1][1] + static_cast<T>(1.0)) * static_cast<T>(0.5); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			T zz = (mat[2][2] + (T)1.0) * (T)0.5; |  |  |  | 			T zz = (mat[2][2] + static_cast<T>(1.0)) * static_cast<T>(0.5); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			T xy = (mat[1][0] + mat[0][1]) * (T)0.25; |  |  |  | 			T xy = (mat[1][0] + mat[0][1]) * static_cast<T>(0.25); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			T xz = (mat[2][0] + mat[0][2]) * (T)0.25; |  |  |  | 			T xz = (mat[2][0] + mat[0][2]) * static_cast<T>(0.25); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			T yz = (mat[2][1] + mat[1][2]) * (T)0.25; |  |  |  | 			T yz = (mat[2][1] + mat[1][2]) * static_cast<T>(0.25); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			if((xx > yy) && (xx > zz)) |  |  |  | 			if((xx > yy) && (xx > zz)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  | 			{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if (xx < epsilon) { |  |  |  | 				if(xx < epsilon) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.x = (T)0.0; |  |  |  | 				{ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.y = (T)0.7071; |  |  |  | 					axis.x = static_cast<T>(0.0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.z = (T)0.7071; |  |  |  | 					axis.y = static_cast<T>(0.7071); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				} else { |  |  |  | 					axis.z = static_cast<T>(0.7071); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.x = sqrt(xx); |  |  |  | 					axis.x = sqrt(xx); | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.y = xy / axis.x; |  |  |  | 					axis.y = xy / axis.x; | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.z = xz / axis.x; |  |  |  | 					axis.z = xz / axis.x; | 
			
		
	
	
		
		
			
				
					|  |  | @ -47,11 +45,14 @@ namespace glm | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			else if (yy > zz) |  |  |  | 			else if (yy > zz) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  | 			{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if (yy < epsilon) { |  |  |  | 				if(yy < epsilon) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.x = (T)0.7071; |  |  |  | 				{ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.y = (T)0.0; |  |  |  | 					axis.x = static_cast<T>(0.7071); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.z = (T)0.7071; |  |  |  | 					axis.y = static_cast<T>(0.0); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				} else { |  |  |  | 					axis.z = static_cast<T>(0.7071); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.y = sqrt(yy); |  |  |  | 					axis.y = sqrt(yy); | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.x = xy / axis.y; |  |  |  | 					axis.x = xy / axis.y; | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.z = yz / axis.y; |  |  |  | 					axis.z = yz / axis.y; | 
			
		
	
	
		
		
			
				
					|  |  | @ -59,11 +60,14 @@ namespace glm | 
			
		
	
		
		
			
				
					
					|  |  |  | 			} |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 			else |  |  |  | 			else | 
			
		
	
		
		
			
				
					
					|  |  |  | 			{ |  |  |  | 			{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 				if (zz < epsilon) { |  |  |  | 				if (zz < epsilon) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.x = (T)0.7071; |  |  |  | 				{ | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.y = (T)0.7071; |  |  |  | 					axis.x = static_cast<T>(0.7071); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.z = (T)0.0; |  |  |  | 					axis.y = static_cast<T>(0.7071); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 				} else { |  |  |  | 					axis.z = static_cast<T>(0.0); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.z = sqrt(zz); |  |  |  | 					axis.z = sqrt(zz); | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.x = xz / axis.z; |  |  |  | 					axis.x = xz / axis.z; | 
			
		
	
		
		
			
				
					
					|  |  |  | 					axis.y = yz / axis.z; |  |  |  | 					axis.y = yz / axis.z; | 
			
		
	
	
		
		
			
				
					|  |  | @ -73,8 +77,8 @@ namespace glm | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1])); |  |  |  | 		T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1])); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (glm::abs(s) < T(0.001)) |  |  |  | 		if (glm::abs(s) < T(0.001)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			s = (T)1.0; |  |  |  | 			s = static_cast<T>(1); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		T const angleCos = (mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) * (T)0.5; |  |  |  | 		T const angleCos = (mat[0][0] + mat[1][1] + mat[2][2] - static_cast<T>(1)) * static_cast<T>(0.5); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		if(angleCos - static_cast<T>(1) < epsilon) |  |  |  | 		if(angleCos - static_cast<T>(1) < epsilon) | 
			
		
	
		
		
			
				
					
					|  |  |  | 			angle = pi<T>() * static_cast<T>(0.25); |  |  |  | 			angle = pi<T>() * static_cast<T>(0.25); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		else |  |  |  | 		else | 
			
		
	
	
		
		
			
				
					|  |  | @ -85,11 +89,7 @@ namespace glm | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	template<typename T, precision P> |  |  |  | 	template<typename T, precision P> | 
			
		
	
		
		
			
				
					
					|  |  |  | 	GLM_FUNC_QUALIFIER mat<4, 4, T, P> axisAngleMatrix |  |  |  | 	GLM_FUNC_QUALIFIER mat<4, 4, T, P> axisAngleMatrix(vec<3, T, P> const & axis, T const angle) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	( |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		vec<3, T, P> const & axis, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T const angle |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	) |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T c = cos(angle); |  |  |  | 		T c = cos(angle); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T s = sin(angle); |  |  |  | 		T s = sin(angle); | 
			
		
	
	
		
		
			
				
					|  |  | @ -97,32 +97,24 @@ namespace glm | 
			
		
	
		
		
			
				
					
					|  |  |  | 		vec<3, T, P> n = normalize(axis); |  |  |  | 		vec<3, T, P> n = normalize(axis); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return mat<4, 4, T, P>( |  |  |  | 		return mat<4, 4, T, P>( | 
			
		
	
		
		
			
				
					
					|  |  |  | 			t * n.x * n.x + c,          t * n.x * n.y + n.z * s,    t * n.x * n.z - n.y * s,    T(0), |  |  |  | 			t * n.x * n.x + c,          t * n.x * n.y + n.z * s,    t * n.x * n.z - n.y * s,    static_cast<T>(0.0), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			t * n.x * n.y - n.z * s,    t * n.y * n.y + c,          t * n.y * n.z + n.x * s,    T(0), |  |  |  | 			t * n.x * n.y - n.z * s,    t * n.y * n.y + c,          t * n.y * n.z + n.x * s,    static_cast<T>(0.0), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			t * n.x * n.z + n.y * s,    t * n.y * n.z - n.x * s,    t * n.z * n.z + c,          T(0), |  |  |  | 			t * n.x * n.z + n.y * s,    t * n.y * n.z - n.x * s,    t * n.z * n.z + c,          static_cast<T>(0.0), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			T(0),                        T(0),                        T(0),                     T(1)); |  |  |  | 			static_cast<T>(0.0),        static_cast<T>(0.0),        static_cast<T>(0.0),        static_cast<T>(1.0)); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	template<typename T, precision P> |  |  |  | 	template<typename T, precision P> | 
			
		
	
		
		
			
				
					
					|  |  |  | 	GLM_FUNC_QUALIFIER mat<4, 4, T, P> extractMatrixRotation |  |  |  | 	GLM_FUNC_QUALIFIER mat<4, 4, T, P> extractMatrixRotation(mat<4, 4, T, P> const& m) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	( |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		mat<4, 4, T, P> const& m |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	) |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return mat<4, 4, T, P>( |  |  |  | 		return mat<4, 4, T, P>( | 
			
		
	
		
		
			
				
					
					|  |  |  | 			m[0][0], m[0][1], m[0][2], 0.0, |  |  |  | 			m[0][0], m[0][1], m[0][2], static_cast<T>(0.0), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			m[1][0], m[1][1], m[1][2], 0.0, |  |  |  | 			m[1][0], m[1][1], m[1][2], static_cast<T>(0.0), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			m[2][0], m[2][1], m[2][2], 0.0, |  |  |  | 			m[2][0], m[2][1], m[2][2], static_cast<T>(0.0), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			0.0,     0.0,     0.0,     1.0); |  |  |  | 			static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0)); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	template<typename T, precision P> |  |  |  | 	template<typename T, precision P> | 
			
		
	
		
		
			
				
					
					|  |  |  | 	GLM_FUNC_QUALIFIER mat<4, 4, T, P> interpolate |  |  |  | 	GLM_FUNC_QUALIFIER mat<4, 4, T, P> interpolate(mat<4, 4, T, P> const& m1, mat<4, 4, T, P> const& m2, T const delta) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	( |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		mat<4, 4, T, P> const& m1, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		mat<4, 4, T, P> const& m2, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		T const delta |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	) |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		mat<4, 4, T, P> m1rot = extractMatrixRotation(m1); |  |  |  | 		mat<4, 4, T, P> m1rot = extractMatrixRotation(m1); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		mat<4, 4, T, P> dltRotation = m2 * transpose(m1rot); |  |  |  | 		mat<4, 4, T, P> dltRotation = m2 * transpose(m1rot); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |