Skip to content

Commit 7594e9c

Browse files
authored
Merge pull request #431 from dataphract/fix/vector-reflect
fix vector{2,3} reflect() implementations
2 parents 5aade3a + 437b293 commit 7594e9c

File tree

4 files changed

+72
-2
lines changed

4 files changed

+72
-2
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ impl Vector2 {
192192
}
193193

194194
pub fn reflect(self, normal: Self) -> Self {
195-
Self::from_glam(self.to_glam().reject_from(normal.to_glam()))
195+
2.0 * normal * self.dot(normal) - self
196196
}
197197

198198
pub fn round(self) -> Self {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ impl Vector3 {
194194
}
195195

196196
pub fn reflect(self, normal: Self) -> Self {
197-
Self::from_glam(self.to_glam().reject_from(normal.to_glam()))
197+
2.0 * normal * self.dot(normal) - self
198198
}
199199

200200
pub fn round(self) -> Self {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this
4+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
5+
*/
6+
7+
use crate::framework::itest;
8+
9+
use godot::builtin::inner::{InnerVector2, InnerVector3};
10+
use godot::builtin::{real, real_consts::PI, Vector2, Vector3};
11+
use godot::private::class_macros::assert_eq_approx;
12+
13+
#[itest]
14+
fn vector2_equiv() {
15+
for c in 0..10 {
16+
let angle = 0.2 * c as real * PI;
17+
18+
let outer = Vector2::new(angle.cos(), angle.sin());
19+
let inner = InnerVector2::from_outer(&outer);
20+
21+
let x_axis = Vector2::new(1.0, 0.0);
22+
let y_axis = Vector2::new(0.0, 1.0);
23+
24+
assert_eq_approx!(
25+
outer.reflect(x_axis),
26+
inner.reflect(x_axis),
27+
"reflect (x-axis)\n",
28+
);
29+
30+
assert_eq_approx!(
31+
outer.reflect(y_axis),
32+
inner.reflect(y_axis),
33+
"reflect (y-axis)\n",
34+
);
35+
}
36+
}
37+
38+
#[itest]
39+
fn vector3_equiv() {
40+
for c in 0..10 {
41+
let angle = 0.2 * c as real * PI;
42+
let z = 0.2 * c as real - 1.0;
43+
44+
let outer = Vector3::new(angle.cos(), angle.sin(), z);
45+
let inner = InnerVector3::from_outer(&outer);
46+
47+
let x_axis = Vector3::new(1.0, 0.0, 0.0);
48+
let y_axis = Vector3::new(0.0, 1.0, 0.0);
49+
let z_axis = Vector3::new(0.0, 0.0, 1.0);
50+
51+
assert_eq_approx!(
52+
outer.reflect(x_axis),
53+
inner.reflect(x_axis),
54+
"reflect (x-axis)\n",
55+
);
56+
57+
assert_eq_approx!(
58+
outer.reflect(y_axis),
59+
inner.reflect(y_axis),
60+
"reflect (y-axis)\n",
61+
);
62+
63+
assert_eq_approx!(
64+
outer.reflect(z_axis),
65+
inner.reflect(z_axis),
66+
"reflect (z-axis)\n",
67+
);
68+
}
69+
}

itest/rust/src/builtin_tests/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ mod geometry {
1313
mod rect2i_test;
1414
mod transform2d_test;
1515
mod transform3d_test;
16+
mod vector_test;
1617
}
1718

1819
mod containers {

0 commit comments

Comments
 (0)