renderling/
cubemap.rs

1//! Cubemap utilities.
2//!
3//! Shaders, render pipelines and layouts for creating and sampling cubemaps.
4//!
5//! For more info see:
6//! * <https://github.com/markpmlim/MetalCubemapping>
7
8#[cfg(cpu)]
9mod cpu;
10#[cfg(cpu)]
11pub use cpu::*;
12
13pub mod shader;
14
15#[cfg(test)]
16mod test {
17    use glam::{Vec2, Vec3};
18
19    use crate::cubemap::shader::{CubemapDescriptor, CubemapFaceDirection};
20
21    #[test]
22    fn cubemap_right() {
23        assert_eq!(Vec3::NEG_Z, CubemapFaceDirection::X.right());
24        assert_eq!(Vec3::Z, CubemapFaceDirection::NEG_X.right());
25        assert_eq!(Vec3::X, CubemapFaceDirection::Y.right());
26        assert_eq!(Vec3::X, CubemapFaceDirection::NEG_Y.right());
27        assert_eq!(Vec3::X, CubemapFaceDirection::Z.right());
28        assert_eq!(Vec3::NEG_X, CubemapFaceDirection::NEG_Z.right());
29
30        assert_eq!(
31            (1, Vec2::new(0.0, 1.0)),
32            CubemapDescriptor::get_face_index_and_uv(Vec3::NEG_ONE)
33        );
34    }
35
36    #[test]
37    fn cubemap_face_index() {
38        let center = Vec2::splat(0.5);
39        let data = [
40            (Vec3::X, 0, center),
41            (Vec3::NEG_X, 1, center),
42            (Vec3::Y, 2, center),
43            (Vec3::NEG_Y, 3, center),
44            (Vec3::Z, 4, center),
45            (Vec3::NEG_Z, 5, center),
46        ];
47        for (coord, expected_face_index, expected_uv) in data {
48            let (seen_face_index, seen_uv) = CubemapDescriptor::get_face_index_and_uv(coord);
49            dbg!((coord, seen_face_index, seen_uv));
50            assert_eq!(expected_face_index, seen_face_index);
51            assert_eq!(expected_uv, seen_uv);
52        }
53    }
54}