diff options
Diffstat (limited to 'core/math/basis.cpp')
| -rw-r--r-- | core/math/basis.cpp | 50 | 
1 files changed, 20 insertions, 30 deletions
diff --git a/core/math/basis.cpp b/core/math/basis.cpp index dd38e25bb1..50299902eb 100644 --- a/core/math/basis.cpp +++ b/core/math/basis.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */  /*                                                                       */  /* Permission is hereby granted, free of charge, to any person obtaining */  /* a copy of this software and associated documentation files (the       */ @@ -31,8 +31,7 @@  #include "basis.h"  #include "core/math/math_funcs.h" -#include "core/os/copymem.h" -#include "core/print_string.h" +#include "core/string/print_string.h"  #define cofac(row1, col1, row2, col2) \  	(elements[row1][col1] * elements[row2][col2] - elements[row1][col2] * elements[row2][col1]) @@ -113,23 +112,26 @@ bool Basis::is_rotation() const {  	return Math::is_equal_approx(determinant(), 1, UNIT_EPSILON) && is_orthogonal();  } +#ifdef MATH_CHECKS +// This method is only used once, in diagonalize. If it's desired elsewhere, feel free to remove the #ifdef.  bool Basis::is_symmetric() const { -	if (!Math::is_equal_approx_ratio(elements[0][1], elements[1][0], UNIT_EPSILON)) { +	if (!Math::is_equal_approx(elements[0][1], elements[1][0])) {  		return false;  	} -	if (!Math::is_equal_approx_ratio(elements[0][2], elements[2][0], UNIT_EPSILON)) { +	if (!Math::is_equal_approx(elements[0][2], elements[2][0])) {  		return false;  	} -	if (!Math::is_equal_approx_ratio(elements[1][2], elements[2][1], UNIT_EPSILON)) { +	if (!Math::is_equal_approx(elements[1][2], elements[2][1])) {  		return false;  	}  	return true;  } +#endif  Basis Basis::diagonalize() {  //NOTE: only implemented for symmetric matrices -//with the Jacobi iterative method method +//with the Jacobi iterative method  #ifdef MATH_CHECKS  	ERR_FAIL_COND_V(!is_symmetric(), Basis());  #endif @@ -314,7 +316,7 @@ Vector3 Basis::rotref_posscale_decomposition(Basis &rotref) const {  // Multiplies the matrix from left by the rotation matrix: M -> R.M  // Note that this does *not* rotate the matrix itself.  // -// The main use of Basis is as Transform.basis, which is used a the transformation matrix +// The main use of Basis is as Transform.basis, which is used by the transformation matrix  // of 3D object. Rotate here refers to rotation of the object (which is R * (*this)),  // not the matrix itself (which is R * (*this) * R.transposed()).  Basis Basis::rotated(const Vector3 &p_axis, real_t p_phi) const { @@ -737,18 +739,6 @@ bool Basis::is_equal_approx(const Basis &p_basis) const {  	return elements[0].is_equal_approx(p_basis.elements[0]) && elements[1].is_equal_approx(p_basis.elements[1]) && elements[2].is_equal_approx(p_basis.elements[2]);  } -bool Basis::is_equal_approx_ratio(const Basis &a, const Basis &b, real_t p_epsilon) const { -	for (int i = 0; i < 3; i++) { -		for (int j = 0; j < 3; j++) { -			if (!Math::is_equal_approx_ratio(a.elements[i][j], b.elements[i][j], p_epsilon)) { -				return false; -			} -		} -	} - -	return true; -} -  bool Basis::operator==(const Basis &p_matrix) const {  	for (int i = 0; i < 3; i++) {  		for (int j = 0; j < 3; j++) { @@ -799,8 +789,8 @@ Quat Basis::get_quat() const {  		temp[2] = ((m.elements[1][0] - m.elements[0][1]) * s);  	} else {  		int i = m.elements[0][0] < m.elements[1][1] ? -						(m.elements[1][1] < m.elements[2][2] ? 2 : 1) : -						(m.elements[0][0] < m.elements[2][2] ? 2 : 0); +						  (m.elements[1][1] < m.elements[2][2] ? 2 : 1) : +						  (m.elements[0][0] < m.elements[2][2] ? 2 : 0);  		int j = (i + 1) % 3;  		int k = (i + 2) % 3; @@ -890,7 +880,7 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const {  	if ((Math::abs(elements[1][0] - elements[0][1]) < epsilon) && (Math::abs(elements[2][0] - elements[0][2]) < epsilon) && (Math::abs(elements[2][1] - elements[1][2]) < epsilon)) {  		// singularity found  		// first check for identity matrix which must have +1 for all terms -		//  in leading diagonaland zero in other terms +		// in leading diagonal and zero in other terms  		if ((Math::abs(elements[1][0] + elements[0][1]) < epsilon2) && (Math::abs(elements[2][0] + elements[0][2]) < epsilon2) && (Math::abs(elements[2][1] + elements[1][2]) < epsilon2) && (Math::abs(elements[0][0] + elements[1][1] + elements[2][2] - 3) < epsilon2)) {  			// this singularity is identity matrix so angle = 0  			r_axis = Vector3(0, 1, 0); @@ -1026,15 +1016,15 @@ void Basis::set_diagonal(const Vector3 &p_diag) {  	elements[2][2] = p_diag.z;  } -Basis Basis::slerp(const Basis &target, const real_t &t) const { +Basis Basis::slerp(const Basis &p_to, const real_t &p_weight) const {  	//consider scale  	Quat from(*this); -	Quat to(target); +	Quat to(p_to); -	Basis b(from.slerp(to, t)); -	b.elements[0] *= Math::lerp(elements[0].length(), target.elements[0].length(), t); -	b.elements[1] *= Math::lerp(elements[1].length(), target.elements[1].length(), t); -	b.elements[2] *= Math::lerp(elements[2].length(), target.elements[2].length(), t); +	Basis b(from.slerp(to, p_weight)); +	b.elements[0] *= Math::lerp(elements[0].length(), p_to.elements[0].length(), p_weight); +	b.elements[1] *= Math::lerp(elements[1].length(), p_to.elements[1].length(), p_weight); +	b.elements[2] *= Math::lerp(elements[2].length(), p_to.elements[2].length(), p_weight);  	return b;  }  |