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}