[3.x] Make is_equal_approx have explicit float and double versions

This commit is contained in:
Aaron Franke 2021-05-20 06:26:45 -04:00
parent 65ba193ae8
commit 1154b6264c
No known key found for this signature in database
GPG key ID: 40A1750B977E56BF
6 changed files with 35 additions and 9 deletions

View file

@ -109,7 +109,7 @@ bool Basis::is_diagonal() const {
} }
bool Basis::is_rotation() const { bool Basis::is_rotation() const {
return Math::is_equal_approx(determinant(), 1, UNIT_EPSILON) && is_orthogonal(); return Math::is_equal_approx(determinant(), 1, (real_t)UNIT_EPSILON) && is_orthogonal();
} }
bool Basis::is_symmetric() const { bool Basis::is_symmetric() const {

View file

@ -303,20 +303,20 @@ public:
return diff < epsilon; return diff < epsilon;
} }
static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b) { static _ALWAYS_INLINE_ bool is_equal_approx(float a, float b) {
// Check for exact equality first, required to handle "infinity" values. // Check for exact equality first, required to handle "infinity" values.
if (a == b) { if (a == b) {
return true; return true;
} }
// Then check for approximate equality. // Then check for approximate equality.
real_t tolerance = CMP_EPSILON * abs(a); float tolerance = CMP_EPSILON * abs(a);
if (tolerance < CMP_EPSILON) { if (tolerance < CMP_EPSILON) {
tolerance = CMP_EPSILON; tolerance = CMP_EPSILON;
} }
return abs(a - b) < tolerance; return abs(a - b) < tolerance;
} }
static _ALWAYS_INLINE_ bool is_equal_approx(real_t a, real_t b, real_t tolerance) { static _ALWAYS_INLINE_ bool is_equal_approx(float a, float b, float tolerance) {
// Check for exact equality first, required to handle "infinity" values. // Check for exact equality first, required to handle "infinity" values.
if (a == b) { if (a == b) {
return true; return true;
@ -325,7 +325,33 @@ public:
return abs(a - b) < tolerance; return abs(a - b) < tolerance;
} }
static _ALWAYS_INLINE_ bool is_zero_approx(real_t s) { static _ALWAYS_INLINE_ bool is_zero_approx(float s) {
return abs(s) < CMP_EPSILON;
}
static _ALWAYS_INLINE_ bool is_equal_approx(double a, double b) {
// Check for exact equality first, required to handle "infinity" values.
if (a == b) {
return true;
}
// Then check for approximate equality.
double tolerance = CMP_EPSILON * abs(a);
if (tolerance < CMP_EPSILON) {
tolerance = CMP_EPSILON;
}
return abs(a - b) < tolerance;
}
static _ALWAYS_INLINE_ bool is_equal_approx(double a, double b, double tolerance) {
// Check for exact equality first, required to handle "infinity" values.
if (a == b) {
return true;
}
// Then check for approximate equality.
return abs(a - b) < tolerance;
}
static _ALWAYS_INLINE_ bool is_zero_approx(double s) {
return abs(s) < CMP_EPSILON; return abs(s) < CMP_EPSILON;
} }

View file

@ -136,7 +136,7 @@ Quat Quat::normalized() const {
} }
bool Quat::is_normalized() const { bool Quat::is_normalized() const {
return Math::is_equal_approx(length_squared(), 1.0, UNIT_EPSILON); //use less epsilon return Math::is_equal_approx(length_squared(), 1, (real_t)UNIT_EPSILON); //use less epsilon
} }
Quat Quat::inverse() const { Quat Quat::inverse() const {

View file

@ -59,7 +59,7 @@ Vector2 Vector2::normalized() const {
bool Vector2::is_normalized() const { bool Vector2::is_normalized() const {
// use length_squared() instead of length() to avoid sqrt(), makes it more stringent. // use length_squared() instead of length() to avoid sqrt(), makes it more stringent.
return Math::is_equal_approx(length_squared(), 1.0, UNIT_EPSILON); return Math::is_equal_approx(length_squared(), 1, (real_t)UNIT_EPSILON);
} }
real_t Vector2::distance_to(const Vector2 &p_vector2) const { real_t Vector2::distance_to(const Vector2 &p_vector2) const {

View file

@ -413,7 +413,7 @@ Vector3 Vector3::normalized() const {
bool Vector3::is_normalized() const { bool Vector3::is_normalized() const {
// use length_squared() instead of length() to avoid sqrt(), makes it more stringent. // use length_squared() instead of length() to avoid sqrt(), makes it more stringent.
return Math::is_equal_approx(length_squared(), 1.0, UNIT_EPSILON); return Math::is_equal_approx(length_squared(), 1, (real_t)UNIT_EPSILON);
} }
Vector3 Vector3::inverse() const { Vector3 Vector3::inverse() const {

View file

@ -461,7 +461,7 @@ void SpriteFramesEditor::_animation_select() {
if (frames->has_animation(edited_anim)) { if (frames->has_animation(edited_anim)) {
double value = anim_speed->get_line_edit()->get_text().to_double(); double value = anim_speed->get_line_edit()->get_text().to_double();
if (!Math::is_equal_approx(value, frames->get_animation_speed(edited_anim))) { if (!Math::is_equal_approx(value, (double)frames->get_animation_speed(edited_anim))) {
_animation_fps_changed(value); _animation_fps_changed(value);
} }
} }