[3.x] Make is_equal_approx have explicit float and double versions
This commit is contained in:
parent
65ba193ae8
commit
1154b6264c
6 changed files with 35 additions and 9 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue