cube_core/cube/
slice_builder.rs

1use crate::{
2    utils::{
3        cube_utils::{Axis, Color}
4    },
5    cube::{
6        slice::{CubeSlice, CubeSliceOrder},
7        cube::{Cube, Face},
8        core::{
9            grid::{Grid, GridFace, GridSide, NeighborSlice}
10        }
11    }
12};
13
14pub struct CubeSliceBuilder<'a> {
15    cube: &'a Cube,
16    split_faces: (GridSide, GridSide),
17    idx_1: (usize, usize),
18    idx_2: (usize, usize),
19    idx_3: (usize, usize),
20    idx_4: (usize, usize),
21    face_1: GridSide,
22    face_2: GridSide,
23}
24
25impl <'a> CubeSliceBuilder<'a> {
26    pub fn create_cube_slices(cube: &Cube, grid: &Grid, axis: &Axis) -> [CubeSlice; 3] {
27        let builder: CubeSliceBuilder = match axis {
28            Axis::X => CubeSliceBuilder {
29                cube,
30                split_faces: (
31                    GridSide::Top,
32                    GridSide::Bottom
33                ),
34                idx_1: (13, 1),
35                idx_2: (13, 1),
36                idx_3: (2, 14),
37                idx_4: (2, 14),
38                face_1: GridSide::Left,
39                face_2: GridSide::Right,
40            },
41            Axis::Y => CubeSliceBuilder {
42                cube,
43                split_faces: (
44                    GridSide::Back,
45                    GridSide::Front
46                ),
47                idx_1: (4, 7),
48                idx_2: (4, 7),
49                idx_3: (11, 8),
50                idx_4: (11, 8),
51                face_1: GridSide::Top,
52                face_2: GridSide::Bottom,
53            },
54            Axis::Z => CubeSliceBuilder {
55                cube,
56                split_faces: (
57                    GridSide::Top,
58                    GridSide::Bottom
59                ),
60                idx_1: (11, 8),
61                idx_2: (4, 7),
62                idx_3: (4, 7),
63                idx_4: (11, 8),
64                face_1: GridSide::Front,
65                face_2: GridSide::Back,
66            },
67        };
68
69        builder.build_cube_slices(grid)
70    }
71
72    fn build_cube_slices(self, grid: &Grid) -> [CubeSlice; 3] {
73        let sf_0_idx = self.split_faces.0.idx();
74        let sf_2_idx = self.split_faces.1.idx();
75
76        let f_1_idx = self.face_1.idx();
77        let f_2_idx = self.face_2.idx();
78
79        let axis = &self.face_1.axis();
80
81        let mut last_corners = [
82            self.cube.faces[sf_0_idx].markers.get(self.idx_3.0).unwrap().clone(),
83            self.cube.faces[sf_0_idx].markers.get(self.idx_3.1).unwrap().clone(),
84            self.cube.faces[sf_2_idx].markers.get(self.idx_4.0).unwrap().clone(),
85            self.cube.faces[sf_2_idx].markers.get(self.idx_4.1).unwrap().clone(),
86        ];
87
88        if let Axis::Y = axis {
89            last_corners.rotate_right(2);
90        }
91
92        let neighbors_1 = grid.get_neighbors(self.face_1);
93        let neighbors_1_colors: Vec<[Color; 3]> = self.get_slices_colors(neighbors_1, grid);
94        
95        let middles = grid.get_neighbors(GridSide::middle_layer_from_axis(axis));
96        let middles_colors: Vec<[Color; 3]> = self.get_slices_colors(middles, grid);
97
98        let neighbors_2 = grid.get_neighbors(self.face_2);
99        let neighbors_2_colors: Vec<[Color; 3]> = self.get_slices_colors(neighbors_2, grid);
100
101        [
102            CubeSlice::new(
103                self.cube.position,
104                self.cube.faces[f_1_idx].clone(),
105                Face::new(
106                    [
107                        self.cube.faces[sf_0_idx].markers.get(self.idx_1.0).unwrap().clone(),
108                        self.cube.faces[sf_0_idx].markers.get(self.idx_1.1).unwrap().clone(),
109                        self.cube.faces[sf_2_idx].markers.get(self.idx_2.0).unwrap().clone(),
110                        self.cube.faces[sf_2_idx].markers.get(self.idx_2.1).unwrap().clone(),
111                    ], GridFace::empty()
112                ),
113                neighbors_1_colors,
114                axis,
115                CubeSliceOrder::FIRST
116            ),
117            CubeSlice::new(
118                self.cube.position,
119                Face::new(
120                    [
121                        self.cube.faces[sf_0_idx].markers.get(self.idx_1.1).unwrap().clone(),
122                        self.cube.faces[sf_0_idx].markers.get(self.idx_1.0).unwrap().clone(),
123                        self.cube.faces[sf_2_idx].markers.get(self.idx_2.1).unwrap().clone(),
124                        self.cube.faces[sf_2_idx].markers.get(self.idx_2.0).unwrap().clone(),
125                    ], GridFace::empty()
126                ),
127                Face::new([
128                        self.cube.faces[sf_0_idx].markers.get(self.idx_3.1).unwrap().clone(),
129                        self.cube.faces[sf_0_idx].markers.get(self.idx_3.0).unwrap().clone(),
130                        self.cube.faces[sf_2_idx].markers.get(self.idx_4.1).unwrap().clone(),
131                        self.cube.faces[sf_2_idx].markers.get(self.idx_4.0).unwrap().clone(),
132                    ], GridFace::empty()
133                ),
134                middles_colors,
135                axis,
136                CubeSliceOrder::MIDDLE
137            ),
138            CubeSlice::new(
139                self.cube.position,
140                Face::new(last_corners, GridFace::empty()),
141                self.cube.faces[f_2_idx].clone(),
142                neighbors_2_colors,
143                axis,
144                CubeSliceOrder::LAST
145            ),
146        ]
147    }
148
149    fn get_slices_colors(&self, slices: [NeighborSlice; 4], grid: &Grid) -> Vec<[Color; 3]> {
150        slices.iter()
151            .map(|ns| ns.read_from(grid))
152            .collect()
153    }
154}