Skip to content

Commit

Permalink
Merge pull request #32477 from aaronfranke/equal-approx-separate
Browse files Browse the repository at this point in the history
Make is_equal_approx separate and make == exact again
  • Loading branch information
akien-mga authored Nov 7, 2019
2 parents f0fc28f + 218f38c commit 77816fe
Show file tree
Hide file tree
Showing 37 changed files with 197 additions and 85 deletions.
5 changes: 5 additions & 0 deletions core/color.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ void Color::set_hsv(float p_h, float p_s, float p_v, float p_alpha) {
}
}

bool Color::is_equal_approx(const Color &p_color) const {

return Math::is_equal_approx(r, p_color.r) && Math::is_equal_approx(g, p_color.g) && Math::is_equal_approx(b, p_color.b) && Math::is_equal_approx(a, p_color.a);
}

void Color::invert() {

r = 1.0 - r;
Expand Down
2 changes: 2 additions & 0 deletions core/color.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ struct Color {
void operator/=(const Color &p_color);
void operator/=(const real_t &rvalue);

bool is_equal_approx(const Color &p_color) const;

void invert();
void contrast();
Color inverted() const;
Expand Down
5 changes: 5 additions & 0 deletions core/math/aabb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ void AABB::merge_with(const AABB &p_aabb) {
size = max - min;
}

bool AABB::is_equal_approx(const AABB &p_aabb) const {

return position.is_equal_approx(p_aabb.position) && size.is_equal_approx(p_aabb.size);
}

AABB AABB::intersection(const AABB &p_aabb) const {

Vector3 src_min = position;
Expand Down
1 change: 1 addition & 0 deletions core/math/aabb.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ class AABB {
bool operator==(const AABB &p_rval) const;
bool operator!=(const AABB &p_rval) const;

bool is_equal_approx(const AABB &p_aabb) const;
_FORCE_INLINE_ bool intersects(const AABB &p_aabb) const; /// Both AABBs overlap
_FORCE_INLINE_ bool intersects_inclusive(const AABB &p_aabb) const; /// Both AABBs (or their faces) overlap
_FORCE_INLINE_ bool encloses(const AABB &p_aabb) const; /// p_aabb is completely inside this
Expand Down
21 changes: 7 additions & 14 deletions core/math/basis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,17 +106,17 @@ Basis Basis::orthonormalized() const {
}

bool Basis::is_orthogonal() const {
Basis id;
Basis identity;
Basis m = (*this) * transposed();

return is_equal_approx(id, m);
return m.is_equal_approx(identity);
}

bool Basis::is_diagonal() const {
return (
Math::is_equal_approx(elements[0][1], 0) && Math::is_equal_approx(elements[0][2], 0) &&
Math::is_equal_approx(elements[1][0], 0) && Math::is_equal_approx(elements[1][2], 0) &&
Math::is_equal_approx(elements[2][0], 0) && Math::is_equal_approx(elements[2][1], 0));
Math::is_zero_approx(elements[0][1]) && Math::is_zero_approx(elements[0][2]) &&
Math::is_zero_approx(elements[1][0]) && Math::is_zero_approx(elements[1][2]) &&
Math::is_zero_approx(elements[2][0]) && Math::is_zero_approx(elements[2][1]));
}

bool Basis::is_rotation() const {
Expand Down Expand Up @@ -557,16 +557,9 @@ void Basis::set_euler_yxz(const Vector3 &p_euler) {
*this = ymat * xmat * zmat;
}

bool Basis::is_equal_approx(const Basis &a, const Basis &b, real_t p_epsilon) const {
bool Basis::is_equal_approx(const Basis &p_basis) const {

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!Math::is_equal_approx(a.elements[i][j], b.elements[i][j], p_epsilon))
return false;
}
}

return true;
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 {
Expand Down
4 changes: 3 additions & 1 deletion core/math/basis.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,9 @@ class Basis {
return elements[0][2] * v[0] + elements[1][2] * v[1] + elements[2][2] * v[2];
}

bool is_equal_approx(const Basis &a, const Basis &b, real_t p_epsilon = CMP_EPSILON) const;
bool is_equal_approx(const Basis &p_basis) const;
// TODO: Break compatibility in 4.0 by getting rid of this so that it's only an instance method. See also TODO in variant_call.cpp
bool is_equal_approx(const Basis &a, const Basis &b) const { return a.is_equal_approx(b); }
bool is_equal_approx_ratio(const Basis &a, const Basis &b, real_t p_epsilon = UNIT_EPSILON) const;

bool operator==(const Basis &p_matrix) const;
Expand Down
4 changes: 2 additions & 2 deletions core/math/bsp_tree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ static int _bsp_create_node(const Face3 *p_faces, const Vector<int> &p_indices,
const Face3 &f = p_faces[indices[i]];

/*
if (f.get_plane().is_almost_like(divisor_plane))
if (f.get_plane().is_equal_approx(divisor_plane))
continue;
*/

Expand Down Expand Up @@ -412,7 +412,7 @@ static int _bsp_create_node(const Face3 *p_faces, const Vector<int> &p_indices,

for (int i = 0; i < p_planes.size(); i++) {

if (p_planes[i].is_almost_like(divisor_plane)) {
if (p_planes[i].is_equal_approx(divisor_plane)) {
divisor_plane_idx = i;
break;
}
Expand Down
4 changes: 2 additions & 2 deletions core/math/delaunay.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ class Delaunay2D {
}

static bool edge_compare(const Vector<Vector2> &p_vertices, const Edge &p_a, const Edge &p_b) {
if (p_vertices[p_a.edge[0]] == p_vertices[p_b.edge[0]] && p_vertices[p_a.edge[1]] == p_vertices[p_b.edge[1]]) {
if (p_vertices[p_a.edge[0]].is_equal_approx(p_vertices[p_b.edge[0]]) && p_vertices[p_a.edge[1]].is_equal_approx(p_vertices[p_b.edge[1]])) {
return true;
}

if (p_vertices[p_a.edge[0]] == p_vertices[p_b.edge[1]] && p_vertices[p_a.edge[1]] == p_vertices[p_b.edge[0]]) {
if (p_vertices[p_a.edge[0]].is_equal_approx(p_vertices[p_b.edge[1]]) && p_vertices[p_a.edge[1]].is_equal_approx(p_vertices[p_b.edge[0]])) {
return true;
}

Expand Down
7 changes: 2 additions & 5 deletions core/math/plane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@

#include "core/math/math_funcs.h"

#define _PLANE_EQ_DOT_EPSILON 0.999
#define _PLANE_EQ_D_EPSILON 0.0001

void Plane::set_normal(const Vector3 &p_normal) {

normal = p_normal;
Expand Down Expand Up @@ -156,9 +153,9 @@ bool Plane::intersects_segment(const Vector3 &p_begin, const Vector3 &p_end, Vec

/* misc */

bool Plane::is_almost_like(const Plane &p_plane) const {
bool Plane::is_equal_approx(const Plane &p_plane) const {

return (normal.dot(p_plane.normal) > _PLANE_EQ_DOT_EPSILON && Math::absd(d - p_plane.d) < _PLANE_EQ_D_EPSILON);
return normal.is_equal_approx(p_plane.normal) && Math::is_equal_approx(d, p_plane.d);
}

Plane::operator String() const {
Expand Down
6 changes: 3 additions & 3 deletions core/math/plane.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class Plane {
/* misc */

Plane operator-() const { return Plane(-normal, -d); }
bool is_almost_like(const Plane &p_plane) const;
bool is_equal_approx(const Plane &p_plane) const;

_FORCE_INLINE_ bool operator==(const Plane &p_plane) const;
_FORCE_INLINE_ bool operator!=(const Plane &p_plane) const;
Expand Down Expand Up @@ -125,12 +125,12 @@ Plane::Plane(const Vector3 &p_point1, const Vector3 &p_point2, const Vector3 &p_

bool Plane::operator==(const Plane &p_plane) const {

return normal == p_plane.normal && Math::is_equal_approx(d, p_plane.d);
return normal == p_plane.normal && d == p_plane.d;
}

bool Plane::operator!=(const Plane &p_plane) const {

return normal != p_plane.normal || !Math::is_equal_approx(d, p_plane.d);
return normal != p_plane.normal || d != p_plane.d;
}

#endif // PLANE_H
5 changes: 5 additions & 0 deletions core/math/quat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ Quat Quat::operator*(const Quat &q) const {
return r;
}

bool Quat::is_equal_approx(const Quat &p_quat) const {

return Math::is_equal_approx(x, p_quat.x) && Math::is_equal_approx(y, p_quat.y) && Math::is_equal_approx(z, p_quat.z) && Math::is_equal_approx(w, p_quat.w);
}

real_t Quat::length() const {

return Math::sqrt(length_squared());
Expand Down
1 change: 1 addition & 0 deletions core/math/quat.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class Quat {
real_t x, y, z, w;

_FORCE_INLINE_ real_t length_squared() const;
bool is_equal_approx(const Quat &p_quat) const;
real_t length() const;
void normalize();
Quat normalized() const;
Expand Down
2 changes: 1 addition & 1 deletion core/math/quick_hull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry::MeshData &r_me
ERR_CONTINUE(O == E);
ERR_CONTINUE(O == NULL);

if (O->get().plane.is_almost_like(f.plane)) {
if (O->get().plane.is_equal_approx(f.plane)) {
//merge and delete edge and contiguous face, while repointing edges (uuugh!)
int ois = O->get().indices.size();
int merged = 0;
Expand Down
5 changes: 5 additions & 0 deletions core/math/rect2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@

#include "core/math/transform_2d.h" // Includes rect2.h but Rect2 needs Transform2D

bool Rect2::is_equal_approx(const Rect2 &p_rect) const {

return position.is_equal_approx(p_rect.position) && size.is_equal_approx(p_rect.size);
}

bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_pos, Point2 *r_normal) const {

real_t min = 0, max = 1;
Expand Down
1 change: 1 addition & 0 deletions core/math/rect2.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ struct Rect2 {

return true;
}
bool is_equal_approx(const Rect2 &p_rect) const;

bool operator==(const Rect2 &p_rect) const { return position == p_rect.position && size == p_rect.size; }
bool operator!=(const Rect2 &p_rect) const { return position != p_rect.position || size != p_rect.size; }
Expand Down
5 changes: 5 additions & 0 deletions core/math/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,11 @@ Transform Transform::orthonormalized() const {
return _copy;
}

bool Transform::is_equal_approx(const Transform &p_transform) const {

return basis.is_equal_approx(p_transform.basis) && origin.is_equal_approx(p_transform.origin);
}

bool Transform::operator==(const Transform &p_transform) const {

return (basis == p_transform.basis && origin == p_transform.origin);
Expand Down
1 change: 1 addition & 0 deletions core/math/transform.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ class Transform {

void orthonormalize();
Transform orthonormalized() const;
bool is_equal_approx(const Transform &p_transform) const;

bool operator==(const Transform &p_transform) const;
bool operator!=(const Transform &p_transform) const;
Expand Down
6 changes: 6 additions & 0 deletions core/math/transform_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,19 @@ void Transform2D::orthonormalize() {
elements[0] = x;
elements[1] = y;
}

Transform2D Transform2D::orthonormalized() const {

Transform2D on = *this;
on.orthonormalize();
return on;
}

bool Transform2D::is_equal_approx(const Transform2D &p_transform) const {

return elements[0].is_equal_approx(p_transform.elements[0]) && elements[1].is_equal_approx(p_transform.elements[1]) && elements[2].is_equal_approx(p_transform.elements[2]);
}

bool Transform2D::operator==(const Transform2D &p_transform) const {

for (int i = 0; i < 3; i++) {
Expand Down
1 change: 1 addition & 0 deletions core/math/transform_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ struct Transform2D {

void orthonormalize();
Transform2D orthonormalized() const;
bool is_equal_approx(const Transform2D &p_transform) const;

bool operator==(const Transform2D &p_transform) const;
bool operator!=(const Transform2D &p_transform) const;
Expand Down
4 changes: 4 additions & 0 deletions core/math/vector2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,10 @@ Vector2 Vector2::reflect(const Vector2 &p_normal) const {
return 2.0 * p_normal * this->dot(p_normal) - *this;
}

bool Vector2::is_equal_approx(const Vector2 &p_v) const {
return Math::is_equal_approx(x, p_v.x) && Math::is_equal_approx(y, p_v.y);
}

/* Vector2i */

Vector2i Vector2i::operator+(const Vector2i &p_v) const {
Expand Down
6 changes: 4 additions & 2 deletions core/math/vector2.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ struct Vector2 {
Vector2 bounce(const Vector2 &p_normal) const;
Vector2 reflect(const Vector2 &p_normal) const;

bool is_equal_approx(const Vector2 &p_v) const;

Vector2 operator+(const Vector2 &p_v) const;
void operator+=(const Vector2 &p_v);
Vector2 operator-(const Vector2 &p_v) const;
Expand Down Expand Up @@ -221,11 +223,11 @@ _FORCE_INLINE_ Vector2 Vector2::operator-() const {

_FORCE_INLINE_ bool Vector2::operator==(const Vector2 &p_vec2) const {

return Math::is_equal_approx(x, p_vec2.x) && Math::is_equal_approx(y, p_vec2.y);
return x == p_vec2.x && y == p_vec2.y;
}
_FORCE_INLINE_ bool Vector2::operator!=(const Vector2 &p_vec2) const {

return !Math::is_equal_approx(x, p_vec2.x) || !Math::is_equal_approx(y, p_vec2.y);
return x != p_vec2.x || y != p_vec2.y;
}

Vector2 Vector2::linear_interpolate(const Vector2 &p_b, real_t p_t) const {
Expand Down
5 changes: 5 additions & 0 deletions core/math/vector3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ Basis Vector3::to_diagonal_matrix() const {
0, 0, z);
}

bool Vector3::is_equal_approx(const Vector3 &p_v) const {

return Math::is_equal_approx(x, p_v.x) && Math::is_equal_approx(y, p_v.y) && Math::is_equal_approx(z, p_v.z);
}

Vector3::operator String() const {

return (rtos(x) + ", " + rtos(y) + ", " + rtos(z));
Expand Down
7 changes: 5 additions & 2 deletions core/math/vector3.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ struct Vector3 {
_FORCE_INLINE_ Vector3 bounce(const Vector3 &p_normal) const;
_FORCE_INLINE_ Vector3 reflect(const Vector3 &p_normal) const;

bool is_equal_approx(const Vector3 &p_v) const;

/* Operators */

_FORCE_INLINE_ Vector3 &operator+=(const Vector3 &p_v);
Expand Down Expand Up @@ -330,11 +332,12 @@ Vector3 Vector3::operator-() const {

bool Vector3::operator==(const Vector3 &p_v) const {

return (Math::is_equal_approx(x, p_v.x) && Math::is_equal_approx(y, p_v.y) && Math::is_equal_approx(z, p_v.z));
return x == p_v.x && y == p_v.y && z == p_v.z;
}

bool Vector3::operator!=(const Vector3 &p_v) const {
return (!Math::is_equal_approx(x, p_v.x) || !Math::is_equal_approx(y, p_v.y) || !Math::is_equal_approx(z, p_v.z));

return x != p_v.x || y != p_v.y || z != p_v.z;
}

bool Vector3::operator<(const Vector3 &p_v) const {
Expand Down
Loading

0 comments on commit 77816fe

Please sign in to comment.