Skip to content

Commit 5f1406d

Browse files
[Math] Add is_finite methods
1 parent b021245 commit 5f1406d

19 files changed

+53
-0
lines changed

include/godot_cpp/core/math.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,14 @@ inline bool is_inf(double p_val) {
613613
return std::isinf(p_val);
614614
}
615615

616+
inline bool is_finite(float p_val) {
617+
return std::isfinite(p_val);
618+
}
619+
620+
inline bool is_finite(double p_val) {
621+
return std::isfinite(p_val);
622+
}
623+
616624
inline bool is_equal_approx(float a, float b) {
617625
// Check for exact equality first, required to handle "infinity" values.
618626
if (a == b) {

include/godot_cpp/variant/aabb.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ struct _NO_DISCARD_ AABB {
6565
bool operator!=(const AABB &p_rval) const;
6666

6767
bool is_equal_approx(const AABB &p_aabb) const;
68+
bool is_finite() const;
6869
_FORCE_INLINE_ bool intersects(const AABB &p_aabb) const; /// Both AABBs overlap
6970
_FORCE_INLINE_ bool intersects_inclusive(const AABB &p_aabb) const; /// Both AABBs (or their faces) overlap
7071
_FORCE_INLINE_ bool encloses(const AABB &p_aabb) const; /// p_aabb is completely inside this

include/godot_cpp/variant/basis.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ struct _NO_DISCARD_ Basis {
128128
}
129129

130130
bool is_equal_approx(const Basis &p_basis) const;
131+
bool is_finite() const;
131132

132133
bool operator==(const Basis &p_matrix) const;
133134
bool operator!=(const Basis &p_matrix) const;

include/godot_cpp/variant/quaternion.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ struct _NO_DISCARD_ Quaternion {
5555
}
5656
_FORCE_INLINE_ real_t length_squared() const;
5757
bool is_equal_approx(const Quaternion &p_quaternion) const;
58+
bool is_finite() const;
5859
real_t length() const;
5960
void normalize();
6061
Quaternion normalized() const;

include/godot_cpp/variant/rect2.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ struct _NO_DISCARD_ Rect2 {
209209
}
210210

211211
bool is_equal_approx(const Rect2 &p_rect) const;
212+
bool is_finite() const;
212213

213214
bool operator==(const Rect2 &p_rect) const { return position == p_rect.position && size == p_rect.size; }
214215
bool operator!=(const Rect2 &p_rect) const { return position != p_rect.position || size != p_rect.size; }

include/godot_cpp/variant/transform2d.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ struct _NO_DISCARD_ Transform2D {
9999
void orthonormalize();
100100
Transform2D orthonormalized() const;
101101
bool is_equal_approx(const Transform2D &p_transform) const;
102+
bool is_finite() const;
102103

103104
Transform2D looking_at(const Vector2 &p_target) const;
104105

include/godot_cpp/variant/transform3d.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ struct _NO_DISCARD_ Transform3D {
7878
void orthogonalize();
7979
Transform3D orthogonalized() const;
8080
bool is_equal_approx(const Transform3D &p_transform) const;
81+
bool is_finite() const;
8182

8283
bool operator==(const Transform3D &p_transform) const;
8384
bool operator!=(const Transform3D &p_transform) const;

include/godot_cpp/variant/vector2.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ struct _NO_DISCARD_ Vector2 {
123123

124124
bool is_equal_approx(const Vector2 &p_v) const;
125125
bool is_zero_approx() const;
126+
bool is_finite() const;
126127

127128
Vector2 operator+(const Vector2 &p_v) const;
128129
void operator+=(const Vector2 &p_v);

include/godot_cpp/variant/vector3.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ struct _NO_DISCARD_ Vector3 {
146146

147147
bool is_equal_approx(const Vector3 &p_v) const;
148148
bool is_zero_approx() const;
149+
bool is_finite() const;
149150

150151
/* Operators */
151152

include/godot_cpp/variant/vector4.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ struct _NO_DISCARD_ Vector4 {
8181
_FORCE_INLINE_ real_t length_squared() const;
8282
bool is_equal_approx(const Vector4 &p_vec4) const;
8383
bool is_zero_approx() const;
84+
bool is_finite() const;
8485
real_t length() const;
8586
void normalize();
8687
Vector4 normalized() const;

src/variant/aabb.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ bool AABB::is_equal_approx(const AABB &p_aabb) const {
7878
return position.is_equal_approx(p_aabb.position) && size.is_equal_approx(p_aabb.size);
7979
}
8080

81+
bool AABB::is_finite() const {
82+
return position.is_finite() && size.is_finite();
83+
}
84+
8185
AABB AABB::intersection(const AABB &p_aabb) const {
8286
#ifdef MATH_CHECKS
8387
if (unlikely(size.x < 0 || size.y < 0 || size.z < 0 || p_aabb.size.x < 0 || p_aabb.size.y < 0 || p_aabb.size.z < 0)) {

src/variant/basis.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,10 @@ bool Basis::is_equal_approx(const Basis &p_basis) const {
692692
return rows[0].is_equal_approx(p_basis.rows[0]) && rows[1].is_equal_approx(p_basis.rows[1]) && rows[2].is_equal_approx(p_basis.rows[2]);
693693
}
694694

695+
bool Basis::is_finite() const {
696+
return rows[0].is_finite() && rows[1].is_finite() && rows[2].is_finite();
697+
}
698+
695699
bool Basis::operator==(const Basis &p_matrix) const {
696700
for (int i = 0; i < 3; i++) {
697701
for (int j = 0; j < 3; j++) {

src/variant/quaternion.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ bool Quaternion::is_equal_approx(const Quaternion &p_quaternion) const {
8181
return Math::is_equal_approx(x, p_quaternion.x) && Math::is_equal_approx(y, p_quaternion.y) && Math::is_equal_approx(z, p_quaternion.z) && Math::is_equal_approx(w, p_quaternion.w);
8282
}
8383

84+
bool Quaternion::is_finite() const {
85+
return Math::is_finite(x) && Math::is_finite(y) && Math::is_finite(z) && Math::is_finite(w);
86+
}
87+
8488
real_t Quaternion::length() const {
8589
return Math::sqrt(length_squared());
8690
}

src/variant/rect2.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ bool Rect2::is_equal_approx(const Rect2 &p_rect) const {
4040
return position.is_equal_approx(p_rect.position) && size.is_equal_approx(p_rect.size);
4141
}
4242

43+
bool Rect2::is_finite() const {
44+
return position.is_finite() && size.is_finite();
45+
}
46+
4347
bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_pos, Point2 *r_normal) const {
4448
#ifdef MATH_CHECKS
4549
if (unlikely(size.x < 0 || size.y < 0)) {

src/variant/transform2d.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ bool Transform2D::is_equal_approx(const Transform2D &p_transform) const {
170170
return columns[0].is_equal_approx(p_transform.columns[0]) && columns[1].is_equal_approx(p_transform.columns[1]) && columns[2].is_equal_approx(p_transform.columns[2]);
171171
}
172172

173+
bool Transform2D::is_finite() const {
174+
return columns[0].is_finite() && columns[1].is_finite() && columns[2].is_finite();
175+
}
176+
173177
Transform2D Transform2D::looking_at(const Vector2 &p_target) const {
174178
Transform2D return_trans = Transform2D(get_rotation(), get_origin());
175179
Vector2 target_position = affine_inverse().xform(p_target);

src/variant/transform3d.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ bool Transform3D::is_equal_approx(const Transform3D &p_transform) const {
175175
return basis.is_equal_approx(p_transform.basis) && origin.is_equal_approx(p_transform.origin);
176176
}
177177

178+
bool Transform3D::is_finite() const {
179+
return basis.is_finite() && origin.is_finite();
180+
}
181+
178182
bool Transform3D::operator==(const Transform3D &p_transform) const {
179183
return (basis == p_transform.basis && origin == p_transform.origin);
180184
}

src/variant/vector2.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ bool Vector2::is_zero_approx() const {
188188
return Math::is_zero_approx(x) && Math::is_zero_approx(y);
189189
}
190190

191+
bool Vector2::is_finite() const {
192+
return Math::is_finite(x) && Math::is_finite(y);
193+
}
194+
191195
Vector2::operator String() const {
192196
return "(" + String::num_real(x, false) + ", " + String::num_real(y, false) + ")";
193197
}

src/variant/vector3.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ bool Vector3::is_zero_approx() const {
141141
return Math::is_zero_approx(x) && Math::is_zero_approx(y) && Math::is_zero_approx(z);
142142
}
143143

144+
bool Vector3::is_finite() const {
145+
return Math::is_finite(x) && Math::is_finite(y) && Math::is_finite(z);
146+
}
147+
144148
Vector3::operator String() const {
145149
return "(" + String::num_real(x, false) + ", " + String::num_real(y, false) + ", " + String::num_real(z, false) + ")";
146150
}

src/variant/vector4.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ bool Vector4::is_zero_approx() const {
6767
return Math::is_zero_approx(x) && Math::is_zero_approx(y) && Math::is_zero_approx(z) && Math::is_zero_approx(w);
6868
}
6969

70+
bool Vector4::is_finite() const {
71+
return Math::is_finite(x) && Math::is_finite(y) && Math::is_finite(z) && Math::is_finite(w);
72+
}
73+
7074
real_t Vector4::length() const {
7175
return Math::sqrt(length_squared());
7276
}

0 commit comments

Comments
 (0)