bevy_render/render_phase/
rangefinder.rs1use bevy_math::{Mat4, Vec3, Vec4};
2
3pub struct ViewRangefinder3d {
5 view_from_world_row_2: Vec4,
6}
7
8impl ViewRangefinder3d {
9 pub fn from_world_from_view(world_from_view: &Mat4) -> ViewRangefinder3d {
11 let view_from_world = world_from_view.inverse();
12
13 ViewRangefinder3d {
14 view_from_world_row_2: view_from_world.row(2),
15 }
16 }
17
18 #[inline]
20 pub fn distance_translation(&self, translation: &Vec3) -> f32 {
21 self.view_from_world_row_2.dot(translation.extend(1.0))
24 }
25
26 #[inline]
28 pub fn distance(&self, transform: &Mat4) -> f32 {
29 self.view_from_world_row_2.dot(transform.col(3))
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use super::ViewRangefinder3d;
38 use bevy_math::{Mat4, Vec3};
39
40 #[test]
41 fn distance() {
42 let view_matrix = Mat4::from_translation(Vec3::new(0.0, 0.0, -1.0));
43 let rangefinder = ViewRangefinder3d::from_world_from_view(&view_matrix);
44 assert_eq!(rangefinder.distance(&Mat4::IDENTITY), 1.0);
45 assert_eq!(
46 rangefinder.distance(&Mat4::from_translation(Vec3::new(0.0, 0.0, 1.0))),
47 2.0
48 );
49 }
50}