Skip to content

Commit 406a5d9

Browse files
authored
Merge pull request #865 from Yarwin/bugfix/fix_vector_sign
Bugfix - Vector3::sign gives incorrect results due to i32 conversion
2 parents ea8237d + 6d77c68 commit 406a5d9

File tree

7 files changed

+48
-8
lines changed

7 files changed

+48
-8
lines changed

godot-core/src/builtin/vectors/vector2.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,14 @@ mod test {
227227
assert_eq_approx!(a.coord_max(b), Vector2::new(1.2, 5.6));
228228
}
229229

230+
#[test]
231+
fn sign() {
232+
let vector = Vector2::new(0.2, -0.5);
233+
assert_eq!(vector.sign(), Vector2::new(1., -1.));
234+
let vector = Vector2::new(0.1, 0.0);
235+
assert_eq!(vector.sign(), Vector2::new(1., 0.));
236+
}
237+
230238
#[cfg(feature = "serde")]
231239
#[test]
232240
fn serde_roundtrip() {

godot-core/src/builtin/vectors/vector2i.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ mod test {
150150
crate::builtin::test_utils::roundtrip(&vector, expected_json);
151151
}
152152

153+
#[test]
154+
fn sign() {
155+
let vector = Vector2i::new(2, -5);
156+
assert_eq!(vector.sign(), Vector2i::new(1, -1));
157+
let vector = Vector2i::new(1, 0);
158+
assert_eq!(vector.sign(), Vector2i::new(1, 0));
159+
}
160+
153161
#[test]
154162
fn axis_min_max() {
155163
assert_eq!(Vector2i::new(10, 5).max_axis(), Some(Vector2Axis::X));

godot-core/src/builtin/vectors/vector3.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,12 @@ mod test {
325325
);
326326
}
327327

328+
#[test]
329+
fn sign() {
330+
let vector = Vector3::new(0.2, -0.5, 0.0);
331+
assert_eq!(vector.sign(), Vector3::new(1., -1., 0.));
332+
}
333+
328334
#[test]
329335
fn coord_min_max() {
330336
let a = Vector3::new(1.2, 3.4, 5.6);

godot-core/src/builtin/vectors/vector3i.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ mod test {
154154
crate::builtin::test_utils::roundtrip(&vector, expected_json);
155155
}
156156

157+
#[test]
158+
fn sign() {
159+
let vector = Vector3i::new(2, -5, 0);
160+
assert_eq!(vector.sign(), Vector3i::new(1, -1, 0));
161+
}
162+
157163
#[test]
158164
fn axis_min_max() {
159165
assert_eq!(Vector3i::new(10, 5, -5).max_axis(), Some(Vector3Axis::X));

godot-core/src/builtin/vectors/vector4.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,8 @@ impl GlamConv for Vector4 {
127127

128128
#[cfg(test)]
129129
mod test {
130-
use crate::assert_eq_approx;
131-
132130
use super::*;
131+
use crate::builtin::math::assert_eq_approx;
133132

134133
#[test]
135134
fn coord_min_max() {
@@ -139,6 +138,12 @@ mod test {
139138
assert_eq_approx!(a.coord_max(b), Vector4::new(1.2, 5.6, 5.6, 1.2),);
140139
}
141140

141+
#[test]
142+
fn sign() {
143+
let vector = Vector4::new(0.2, -0.5, 0., 999.0);
144+
assert_eq!(vector.sign(), Vector4::new(1., -1., 0., 1.));
145+
}
146+
142147
#[cfg(feature = "serde")]
143148
#[test]
144149
fn serde_roundtrip() {

godot-core/src/builtin/vectors/vector4i.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@ mod test {
157157
crate::builtin::test_utils::roundtrip(&vector, expected_json);
158158
}
159159

160+
#[test]
161+
fn sign() {
162+
let vector = Vector4i::new(2, -5, 0, 999);
163+
assert_eq!(vector.sign(), Vector4i::new(1, -1, 0, 1));
164+
}
165+
160166
#[test]
161167
fn axis_min_max() {
162168
assert_eq!(Vector4i::new(10, 5, -5, 0).max_axis(), Some(Vector4Axis::X));

godot-core/src/builtin/vectors/vector_macros.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -484,16 +484,17 @@ macro_rules! impl_vector_fns {
484484
#[inline]
485485
pub fn sign(self) -> Self {
486486
#[inline]
487-
fn f(x: i32) -> i32 {
488-
match x.cmp(&0) {
489-
Ordering::Equal => 0,
490-
Ordering::Greater => 1,
491-
Ordering::Less => -1,
487+
fn f(c: $Scalar) -> $Scalar {
488+
let r = c.partial_cmp(&(0 as $Scalar)).unwrap_or_else(|| panic!("Vector component {c} isn't signed!"));
489+
match r {
490+
Ordering::Equal => 0 as $Scalar,
491+
Ordering::Greater => 1 as $Scalar,
492+
Ordering::Less => -1 as $Scalar,
492493
}
493494
}
494495

495496
Self::new(
496-
$( f(self.$comp as i32) as $Scalar ),*
497+
$( f(self.$comp) ),*
497498
)
498499
}
499500
}

0 commit comments

Comments
 (0)