summaryrefslogtreecommitdiff
path: root/core/math
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2017-02-14 16:04:36 +0100
committerGitHub <noreply@github.com>2017-02-14 16:04:36 +0100
commit78336990f4f6c36db2000d6097826bbe573eb016 (patch)
tree8bb33b592e3d3982ca5faf5e041c37644d5b525d /core/math
parent81edda18f39efc4f783bc6fa2b381c01cfc0ef2d (diff)
parentadcc211feb7827127b2548c791f2de0b6efda3d3 (diff)
Merge pull request #7807 from hpvb/fix-7354
Make nan==nan true for GDScript
Diffstat (limited to 'core/math')
-rw-r--r--core/math/math_2d.cpp7
-rw-r--r--core/math/math_2d.h3
-rw-r--r--core/math/plane.cpp5
-rw-r--r--core/math/plane.h1
-rw-r--r--core/math/quat.cpp19
-rw-r--r--core/math/quat.h2
-rw-r--r--core/math/vector3.cpp11
-rw-r--r--core/math/vector3.h1
8 files changed, 48 insertions, 1 deletions
diff --git a/core/math/math_2d.cpp b/core/math/math_2d.cpp
index 76eeece688..995cb0834a 100644
--- a/core/math/math_2d.cpp
+++ b/core/math/math_2d.cpp
@@ -157,6 +157,13 @@ bool Vector2::operator!=(const Vector2& p_vec2) const {
return x!=p_vec2.x || y!=p_vec2.y;
}
+bool Vector2::nan_equals(const Vector2& p_vec2) const {
+
+ return (x==p_vec2.x && y==p_vec2.y) ||
+ (x==p_vec2.x && isnan(y) && isnan(p_vec2.y)) ||
+ (isnan(x) && isnan(p_vec2.x) && y == p_vec2.y);
+}
+
Vector2 Vector2::floor() const {
return Vector2( Math::floor(x), Math::floor(y) );
diff --git a/core/math/math_2d.h b/core/math/math_2d.h
index a24c4266ee..6dd8799ba2 100644
--- a/core/math/math_2d.h
+++ b/core/math/math_2d.h
@@ -133,6 +133,7 @@ struct Vector2 {
bool operator<(const Vector2& p_vec2) const { return (x==p_vec2.x)?(y<p_vec2.y):(x<p_vec2.x); }
bool operator<=(const Vector2& p_vec2) const { return (x==p_vec2.x)?(y<=p_vec2.y):(x<=p_vec2.x); }
+ bool nan_equals(const Vector2& p_vec2) const;
real_t angle() const;
void set_rotation(real_t p_radians) {
@@ -319,6 +320,8 @@ struct Rect2 {
bool operator==(const Rect2& p_rect) const { return pos==p_rect.pos && size==p_rect.size; }
bool operator!=(const Rect2& p_rect) const { return pos!=p_rect.pos || size!=p_rect.size; }
+ bool nan_equals(const Rect2& p_rect) const { return pos.nan_equals(p_rect.pos) && size == p_rect.size; }
+
inline Rect2 grow(real_t p_by) const {
Rect2 g=*this;
diff --git a/core/math/plane.cpp b/core/math/plane.cpp
index 2a97932049..0d446059c4 100644
--- a/core/math/plane.cpp
+++ b/core/math/plane.cpp
@@ -164,3 +164,8 @@ Plane::operator String() const {
return normal.operator String() + ", " + rtos(d);
}
+
+bool Plane::nan_equals(const Plane& p_plane) const {
+
+ return normal.nan_equals(p_plane.normal) && d == p_plane.d;
+}
diff --git a/core/math/plane.h b/core/math/plane.h
index 8235c59135..13cfc265bc 100644
--- a/core/math/plane.h
+++ b/core/math/plane.h
@@ -73,6 +73,7 @@ public:
_FORCE_INLINE_ bool operator==(const Plane& p_plane) const;
_FORCE_INLINE_ bool operator!=(const Plane& p_plane) const;
+ bool nan_equals(const Plane& p_plane) const;
operator String() const;
_FORCE_INLINE_ Plane() { d=0; }
diff --git a/core/math/quat.cpp b/core/math/quat.cpp
index 4085f9b84a..5ba5a7706b 100644
--- a/core/math/quat.cpp
+++ b/core/math/quat.cpp
@@ -284,3 +284,22 @@ Quat::Quat(const Vector3& axis, const real_t& angle) {
cos_angle);
}
}
+
+bool Quat::nan_equals(const Quat& q2) const {
+ return (x == q2.x && y == q2.y && z == q2.z && w == q2.w) ||
+ (x == q2.x && y == q2.y && z == q2.z && isnan(w) && isnan(q2.w)) ||
+ (x == q2.x && y == q2.y && isnan(z) && isnan(q2.z) && w == q2.w) ||
+ (x == q2.x && y == q2.y && isnan(z) && isnan(q2.z) && isnan(w) && isnan(q2.w)) ||
+ (x == q2.x && isnan(y) && isnan(q2.y) && z == q2.z && w == q2.w) ||
+ (x == q2.x && isnan(y) && isnan(q2.y) && z == q2.z && isnan(w) && isnan(q2.w)) ||
+ (x == q2.x && isnan(y) && isnan(q2.y) && isnan(z) && isnan(q2.z) && w == q2.w) ||
+ (x == q2.x && isnan(y) && isnan(q2.y) && isnan(z) && isnan(q2.z) && isnan(w) && isnan(q2.w)) ||
+ (isnan(x) && isnan(q2.x) && y == q2.y && z == q2.z && w == q2.w) ||
+ (isnan(x) && isnan(q2.x) && y == q2.y && z == q2.z && isnan(w) && isnan(q2.w)) ||
+ (isnan(x) && isnan(q2.x) && y == q2.y && isnan(z) && isnan(q2.z) && w == q2.w) ||
+ (isnan(x) && isnan(q2.x) && y == q2.y && isnan(z) && isnan(q2.z) && isnan(w) && isnan(q2.w)) ||
+ (isnan(x) && isnan(q2.x) && isnan(y) && isnan(q2.y) && z == q2.z && w == q2.w) ||
+ (isnan(x) && isnan(q2.x) && isnan(y) && isnan(q2.y) && z == q2.z && isnan(w) && isnan(q2.w)) ||
+ (isnan(x) && isnan(q2.x) && isnan(y) && isnan(q2.y) && isnan(z) && isnan(q2.z) && w == q2.w) ||
+ (isnan(x) && isnan(q2.x) && isnan(y) && isnan(q2.y) && isnan(z) && isnan(q2.z) && isnan(w) && isnan(q2.w));
+}
diff --git a/core/math/quat.h b/core/math/quat.h
index d3a50343a3..5d91bb1d36 100644
--- a/core/math/quat.h
+++ b/core/math/quat.h
@@ -93,6 +93,7 @@ public:
_FORCE_INLINE_ Quat operator*(const real_t& s) const;
_FORCE_INLINE_ Quat operator/(const real_t& s) const;
+ bool nan_equals(const Quat& q2) const;
_FORCE_INLINE_ bool operator==(const Quat& p_quat) const;
_FORCE_INLINE_ bool operator!=(const Quat& p_quat) const;
@@ -193,5 +194,4 @@ bool Quat::operator!=(const Quat& p_quat) const {
return x!=p_quat.x || y!=p_quat.y || z!=p_quat.z || w!=p_quat.w;
}
-
#endif
diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp
index 2ab5fa0465..7fdb54bb69 100644
--- a/core/math/vector3.cpp
+++ b/core/math/vector3.cpp
@@ -176,6 +176,17 @@ Vector3 Vector3::cubic_interpolate(const Vector3& p_b,const Vector3& p_pre_a, co
return out;
}
# endif
+bool Vector3::nan_equals(const Vector3& p_v) const {
+ return (x == p_v.x && y == p_v.y && z == p_v.z) ||
+ (x == p_v.x && y == p_v.y && isnan(z) && isnan(p_v.z)) ||
+ (x == p_v.x && isnan(y) && isnan(p_v.y) && z == p_v.z) ||
+ (isnan(x) && isnan(p_v.x) && y == p_v.y && z == p_v.z) ||
+ (x == p_v.x && isnan(y) && isnan(p_v.y) && isnan(z) && isnan(p_v.z)) ||
+ (isnan(x) && isnan(p_v.x) && y == p_v.y && isnan(z) && isnan(p_v.z)) ||
+ (isnan(x) && isnan(p_v.x) && isnan(y) && isnan(p_v.y) && z == p_v.z) ||
+ (isnan(x) && isnan(p_v.x) && isnan(y) && isnan(p_v.y) && isnan(z) && isnan(p_v.z));
+}
+
Vector3::operator String() const {
return (rtos(x)+", "+rtos(y)+", "+rtos(z));
diff --git a/core/math/vector3.h b/core/math/vector3.h
index a289f9bf4c..938b1b16cb 100644
--- a/core/math/vector3.h
+++ b/core/math/vector3.h
@@ -134,6 +134,7 @@ struct Vector3 {
_FORCE_INLINE_ bool operator<(const Vector3& p_v) const;
_FORCE_INLINE_ bool operator<=(const Vector3& p_v) const;
+ bool nan_equals(const Vector3& p_v) const;
operator String() const;
_FORCE_INLINE_ Vector3() { x=y=z=0; }