aboutsummaryrefslogtreecommitdiff
path: root/src/cube_transform.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/cube_transform.h')
-rw-r--r--src/cube_transform.h470
1 files changed, 155 insertions, 315 deletions
diff --git a/src/cube_transform.h b/src/cube_transform.h
index d9a0941..358b051 100644
--- a/src/cube_transform.h
+++ b/src/cube_transform.h
@@ -1,336 +1,176 @@
1/* TODO: remove these macros, if the below works */
2
1#define _trans_edges_rotation(T, c) \ 3#define _trans_edges_rotation(T, c) \
2 compose_fast_edges(compose_fast_edges(_trans_cube_ ## T, c), \ 4 compose_edges(compose_edges(_trans_cube_ ## T, c), \
3 _trans_cube_ ## T ## _inverse) 5 _trans_cube_ ## T ## _inverse)
4#define _trans_edges_mirrored(T, c) _trans_edges_rotation(T, c) 6#define _trans_edges_mirrored(T, c) _trans_edges_rotation(T, c)
5 7
6#define _trans_corners_rotation(T, c) \ 8#define _trans_corners_rotation(T, c) \
7 compose_fast_corners(compose_fast_corners(_trans_cube_ ## T, c), \ 9 compose_corners(compose_corners(_trans_cube_ ## T, c), \
8 _trans_cube_ ## T ## _inverse) 10 _trans_cube_ ## T ## _inverse)
9#define _trans_corners_mirrored(T, c) \ 11#define _trans_corners_mirrored(T, c) \
10 invertco_fast(compose_fast_corners( \ 12 invertco(compose_corners( \
11 compose_fast_corners(_trans_cube_ ## T, c), _trans_cube_ ## T ## _inverse)) 13 compose_corners(_trans_cube_ ## T, c), _trans_cube_ ## T ## _inverse))
12 14
13#define _trans_rotation(T, c) \ 15#define _trans_rotation(T, c) \
14 compose_fast(compose_fast(_trans_cube_ ## T, c), \ 16 compose(compose(_trans_cube_ ## T, c), \
15 _trans_cube_ ## T ## _inverse) 17 _trans_cube_ ## T ## _inverse)
16#define _trans_mirrored(T, c) \ 18#define _trans_mirrored(T, c) \
17 invertco_fast(compose_fast(compose_fast(_trans_cube_ ## T, c), \ 19 invertco(compose(compose(_trans_cube_ ## T, c), \
18 _trans_cube_ ## T ## _inverse)) 20 _trans_cube_ ## T ## _inverse))
19 21
20_static cube_fast_t 22static cube_t cube_trans_table[48] = {
21transform_edges(cube_fast_t c, uint8_t t) 23 [_trans_UFr] = _trans_cube_UFr,
24 [_trans_UFm] = _trans_cube_UFm,
25 [_trans_ULr] = _trans_cube_URr,
26 [_trans_ULm] = _trans_cube_ULm,
27 [_trans_UBr] = _trans_cube_UBr,
28 [_trans_UBm] = _trans_cube_UBm,
29 [_trans_URr] = _trans_cube_ULr,
30 [_trans_URm] = _trans_cube_URm,
31 [_trans_DFr] = _trans_cube_DFr,
32 [_trans_DFm] = _trans_cube_DFm,
33 [_trans_DLr] = _trans_cube_DLr,
34 [_trans_DLm] = _trans_cube_DRm,
35 [_trans_DBr] = _trans_cube_DBr,
36 [_trans_DBm] = _trans_cube_DBm,
37 [_trans_DRr] = _trans_cube_DRr,
38 [_trans_DRm] = _trans_cube_DLm,
39 [_trans_RUr] = _trans_cube_FRr,
40 [_trans_RUm] = _trans_cube_FLm,
41 [_trans_RFr] = _trans_cube_LFr,
42 [_trans_RFm] = _trans_cube_RFm,
43 [_trans_RDr] = _trans_cube_BLr,
44 [_trans_RDm] = _trans_cube_BRm,
45 [_trans_RBr] = _trans_cube_RBr,
46 [_trans_RBm] = _trans_cube_LBm,
47 [_trans_LUr] = _trans_cube_FLr,
48 [_trans_LUm] = _trans_cube_FRm,
49 [_trans_LFr] = _trans_cube_RFr,
50 [_trans_LFm] = _trans_cube_LFm,
51 [_trans_LDr] = _trans_cube_BRr,
52 [_trans_LDm] = _trans_cube_BLm,
53 [_trans_LBr] = _trans_cube_LBr,
54 [_trans_LBm] = _trans_cube_RBm,
55 [_trans_FUr] = _trans_cube_FUr,
56 [_trans_FUm] = _trans_cube_FUm,
57 [_trans_FRr] = _trans_cube_RUr,
58 [_trans_FRm] = _trans_cube_LUm,
59 [_trans_FDr] = _trans_cube_BUr,
60 [_trans_FDm] = _trans_cube_BUm,
61 [_trans_FLr] = _trans_cube_LUr,
62 [_trans_FLm] = _trans_cube_RUm,
63 [_trans_BUr] = _trans_cube_FDr,
64 [_trans_BUm] = _trans_cube_FDm,
65 [_trans_BRr] = _trans_cube_LDr,
66 [_trans_BRm] = _trans_cube_RDm,
67 [_trans_BDr] = _trans_cube_BDr,
68 [_trans_BDm] = _trans_cube_BDm,
69 [_trans_BLr] = _trans_cube_RDr,
70 [_trans_BLm] = _trans_cube_LDm,
71};
72
73static cube_t cube_trans_table_inverse[48] = {
74 [_trans_UFr] = _trans_cube_UFr_inverse,
75 [_trans_UFm] = _trans_cube_UFm_inverse,
76 [_trans_ULr] = _trans_cube_URr_inverse,
77 [_trans_ULm] = _trans_cube_ULm_inverse,
78 [_trans_UBr] = _trans_cube_UBr_inverse,
79 [_trans_UBm] = _trans_cube_UBm_inverse,
80 [_trans_URr] = _trans_cube_ULr_inverse,
81 [_trans_URm] = _trans_cube_URm_inverse,
82 [_trans_DFr] = _trans_cube_DFr_inverse,
83 [_trans_DFm] = _trans_cube_DFm_inverse,
84 [_trans_DLr] = _trans_cube_DLr_inverse,
85 [_trans_DLm] = _trans_cube_DRm_inverse,
86 [_trans_DBr] = _trans_cube_DBr_inverse,
87 [_trans_DBm] = _trans_cube_DBm_inverse,
88 [_trans_DRr] = _trans_cube_DRr_inverse,
89 [_trans_DRm] = _trans_cube_DLm_inverse,
90 [_trans_RUr] = _trans_cube_FRr_inverse,
91 [_trans_RUm] = _trans_cube_FLm_inverse,
92 [_trans_RFr] = _trans_cube_LFr_inverse,
93 [_trans_RFm] = _trans_cube_RFm_inverse,
94 [_trans_RDr] = _trans_cube_BLr_inverse,
95 [_trans_RDm] = _trans_cube_BRm_inverse,
96 [_trans_RBr] = _trans_cube_RBr_inverse,
97 [_trans_RBm] = _trans_cube_LBm_inverse,
98 [_trans_LUr] = _trans_cube_FLr_inverse,
99 [_trans_LUm] = _trans_cube_FRm_inverse,
100 [_trans_LFr] = _trans_cube_RFr_inverse,
101 [_trans_LFm] = _trans_cube_LFm_inverse,
102 [_trans_LDr] = _trans_cube_BRr_inverse,
103 [_trans_LDm] = _trans_cube_BLm_inverse,
104 [_trans_LBr] = _trans_cube_LBr_inverse,
105 [_trans_LBm] = _trans_cube_RBm_inverse,
106 [_trans_FUr] = _trans_cube_FUr_inverse,
107 [_trans_FUm] = _trans_cube_FUm_inverse,
108 [_trans_FRr] = _trans_cube_RUr_inverse,
109 [_trans_FRm] = _trans_cube_LUm_inverse,
110 [_trans_FDr] = _trans_cube_BUr_inverse,
111 [_trans_FDm] = _trans_cube_BUm_inverse,
112 [_trans_FLr] = _trans_cube_LUr_inverse,
113 [_trans_FLm] = _trans_cube_RUm_inverse,
114 [_trans_BUr] = _trans_cube_FDr_inverse,
115 [_trans_BUm] = _trans_cube_FDm_inverse,
116 [_trans_BRr] = _trans_cube_LDr_inverse,
117 [_trans_BRm] = _trans_cube_RDm_inverse,
118 [_trans_BDr] = _trans_cube_BDr_inverse,
119 [_trans_BDm] = _trans_cube_BDm_inverse,
120 [_trans_BLr] = _trans_cube_RDr_inverse,
121 [_trans_BLm] = _trans_cube_LDm_inverse,
122};
123
124_static cube_t
125transform_edges(cube_t c, uint8_t t)
22{ 126{
23 switch (t) { 127 cube_t ret, trans_cube, trans_inv;
24 case _trans_UFr: 128
25 return _trans_edges_rotation(UFr, c); 129 DBG_ASSERT(t < 48, zero,
26 case _trans_ULr: 130 "transform: invalid transformation %" PRIu8
27 return _trans_edges_rotation(ULr, c); 131 ", must be between 0 and 47\n", t);
28 case _trans_UBr: 132
29 return _trans_edges_rotation(UBr, c); 133 trans_cube = cube_trans_table[t];
30 case _trans_URr: 134 trans_inv = cube_trans_table_inverse[t];
31 return _trans_edges_rotation(URr, c); 135
32 case _trans_DFr: 136 ret = compose_edges(trans_cube, c);
33 return _trans_edges_rotation(DFr, c); 137 ret = compose_edges(ret, trans_inv);
34 case _trans_DLr: 138
35 return _trans_edges_rotation(DLr, c); 139 return ret;
36 case _trans_DBr:
37 return _trans_edges_rotation(DBr, c);
38 case _trans_DRr:
39 return _trans_edges_rotation(DRr, c);
40 case _trans_RUr:
41 return _trans_edges_rotation(RUr, c);
42 case _trans_RFr:
43 return _trans_edges_rotation(RFr, c);
44 case _trans_RDr:
45 return _trans_edges_rotation(RDr, c);
46 case _trans_RBr:
47 return _trans_edges_rotation(RBr, c);
48 case _trans_LUr:
49 return _trans_edges_rotation(LUr, c);
50 case _trans_LFr:
51 return _trans_edges_rotation(LFr, c);
52 case _trans_LDr:
53 return _trans_edges_rotation(LDr, c);
54 case _trans_LBr:
55 return _trans_edges_rotation(LBr, c);
56 case _trans_FUr:
57 return _trans_edges_rotation(FUr, c);
58 case _trans_FRr:
59 return _trans_edges_rotation(FRr, c);
60 case _trans_FDr:
61 return _trans_edges_rotation(FDr, c);
62 case _trans_FLr:
63 return _trans_edges_rotation(FLr, c);
64 case _trans_BUr:
65 return _trans_edges_rotation(BUr, c);
66 case _trans_BRr:
67 return _trans_edges_rotation(BRr, c);
68 case _trans_BDr:
69 return _trans_edges_rotation(BDr, c);
70 case _trans_BLr:
71 return _trans_edges_rotation(BLr, c);
72 case _trans_UFm:
73 return _trans_edges_mirrored(UFm, c);
74 case _trans_ULm:
75 return _trans_edges_mirrored(ULm, c);
76 case _trans_UBm:
77 return _trans_edges_mirrored(UBm, c);
78 case _trans_URm:
79 return _trans_edges_mirrored(URm, c);
80 case _trans_DFm:
81 return _trans_edges_mirrored(DFm, c);
82 case _trans_DLm:
83 return _trans_edges_mirrored(DLm, c);
84 case _trans_DBm:
85 return _trans_edges_mirrored(DBm, c);
86 case _trans_DRm:
87 return _trans_edges_mirrored(DRm, c);
88 case _trans_RUm:
89 return _trans_edges_mirrored(RUm, c);
90 case _trans_RFm:
91 return _trans_edges_mirrored(RFm, c);
92 case _trans_RDm:
93 return _trans_edges_mirrored(RDm, c);
94 case _trans_RBm:
95 return _trans_edges_mirrored(RBm, c);
96 case _trans_LUm:
97 return _trans_edges_mirrored(LUm, c);
98 case _trans_LFm:
99 return _trans_edges_mirrored(LFm, c);
100 case _trans_LDm:
101 return _trans_edges_mirrored(LDm, c);
102 case _trans_LBm:
103 return _trans_edges_mirrored(LBm, c);
104 case _trans_FUm:
105 return _trans_edges_mirrored(FUm, c);
106 case _trans_FRm:
107 return _trans_edges_mirrored(FRm, c);
108 case _trans_FDm:
109 return _trans_edges_mirrored(FDm, c);
110 case _trans_FLm:
111 return _trans_edges_mirrored(FLm, c);
112 case _trans_BUm:
113 return _trans_edges_mirrored(BUm, c);
114 case _trans_BRm:
115 return _trans_edges_mirrored(BRm, c);
116 case _trans_BDm:
117 return _trans_edges_mirrored(BDm, c);
118 case _trans_BLm:
119 return _trans_edges_mirrored(BLm, c);
120 default:
121 DBG_LOG("transform error, unknown transformation\n");
122 return zero_fast;
123 }
124} 140}
125 141
126_static cube_fast_t 142_static cube_t
127transform_corners(cube_fast_t c, uint8_t t) 143transform_corners(cube_t c, uint8_t t)
128{ 144{
129 switch (t) { 145 cube_t ret, trans_cube, trans_inv;
130 case _trans_UFr: 146
131 return _trans_corners_rotation(UFr, c); 147 DBG_ASSERT(t < 48, zero,
132 case _trans_ULr: 148 "transform: invalid transformation %" PRIu8
133 return _trans_corners_rotation(ULr, c); 149 ", must be between 0 and 47\n", t);
134 case _trans_UBr: 150
135 return _trans_corners_rotation(UBr, c); 151 trans_cube = cube_trans_table[t];
136 case _trans_URr: 152 trans_inv = cube_trans_table_inverse[t];
137 return _trans_corners_rotation(URr, c); 153
138 case _trans_DFr: 154 ret = compose_corners(trans_cube, c);
139 return _trans_corners_rotation(DFr, c); 155 ret = compose_corners(ret, trans_inv);
140 case _trans_DLr: 156
141 return _trans_corners_rotation(DLr, c); 157 return t < 24 ? ret : invertco(ret);
142 case _trans_DBr:
143 return _trans_corners_rotation(DBr, c);
144 case _trans_DRr:
145 return _trans_corners_rotation(DRr, c);
146 case _trans_RUr:
147 return _trans_corners_rotation(RUr, c);
148 case _trans_RFr:
149 return _trans_corners_rotation(RFr, c);
150 case _trans_RDr:
151 return _trans_corners_rotation(RDr, c);
152 case _trans_RBr:
153 return _trans_corners_rotation(RBr, c);
154 case _trans_LUr:
155 return _trans_corners_rotation(LUr, c);
156 case _trans_LFr:
157 return _trans_corners_rotation(LFr, c);
158 case _trans_LDr:
159 return _trans_corners_rotation(LDr, c);
160 case _trans_LBr:
161 return _trans_corners_rotation(LBr, c);
162 case _trans_FUr:
163 return _trans_corners_rotation(FUr, c);
164 case _trans_FRr:
165 return _trans_corners_rotation(FRr, c);
166 case _trans_FDr:
167 return _trans_corners_rotation(FDr, c);
168 case _trans_FLr:
169 return _trans_corners_rotation(FLr, c);
170 case _trans_BUr:
171 return _trans_corners_rotation(BUr, c);
172 case _trans_BRr:
173 return _trans_corners_rotation(BRr, c);
174 case _trans_BDr:
175 return _trans_corners_rotation(BDr, c);
176 case _trans_BLr:
177 return _trans_corners_rotation(BLr, c);
178 case _trans_UFm:
179 return _trans_corners_mirrored(UFm, c);
180 case _trans_ULm:
181 return _trans_corners_mirrored(ULm, c);
182 case _trans_UBm:
183 return _trans_corners_mirrored(UBm, c);
184 case _trans_URm:
185 return _trans_corners_mirrored(URm, c);
186 case _trans_DFm:
187 return _trans_corners_mirrored(DFm, c);
188 case _trans_DLm:
189 return _trans_corners_mirrored(DLm, c);
190 case _trans_DBm:
191 return _trans_corners_mirrored(DBm, c);
192 case _trans_DRm:
193 return _trans_corners_mirrored(DRm, c);
194 case _trans_RUm:
195 return _trans_corners_mirrored(RUm, c);
196 case _trans_RFm:
197 return _trans_corners_mirrored(RFm, c);
198 case _trans_RDm:
199 return _trans_corners_mirrored(RDm, c);
200 case _trans_RBm:
201 return _trans_corners_mirrored(RBm, c);
202 case _trans_LUm:
203 return _trans_corners_mirrored(LUm, c);
204 case _trans_LFm:
205 return _trans_corners_mirrored(LFm, c);
206 case _trans_LDm:
207 return _trans_corners_mirrored(LDm, c);
208 case _trans_LBm:
209 return _trans_corners_mirrored(LBm, c);
210 case _trans_FUm:
211 return _trans_corners_mirrored(FUm, c);
212 case _trans_FRm:
213 return _trans_corners_mirrored(FRm, c);
214 case _trans_FDm:
215 return _trans_corners_mirrored(FDm, c);
216 case _trans_FLm:
217 return _trans_corners_mirrored(FLm, c);
218 case _trans_BUm:
219 return _trans_corners_mirrored(BUm, c);
220 case _trans_BRm:
221 return _trans_corners_mirrored(BRm, c);
222 case _trans_BDm:
223 return _trans_corners_mirrored(BDm, c);
224 case _trans_BLm:
225 return _trans_corners_mirrored(BLm, c);
226 default:
227 DBG_LOG("transform error, unknown transformation\n");
228 return zero_fast;
229 }
230} 158}
231 159
232_static cube_fast_t 160_static cube_t
233transform(cube_fast_t c, uint8_t t) 161transform(cube_t c, uint8_t t)
234{ 162{
235 switch (t) { 163 cube_t ret, trans_cube, trans_inv;
236 case _trans_UFr: 164
237 return _trans_rotation(UFr, c); 165 DBG_ASSERT(t < 48, zero,
238 case _trans_ULr: 166 "transform: invalid transformation %" PRIu8
239 return _trans_rotation(ULr, c); 167 ", must be between 0 and 47\n", t);
240 case _trans_UBr: 168
241 return _trans_rotation(UBr, c); 169 trans_cube = cube_trans_table[t];
242 case _trans_URr: 170 trans_inv = cube_trans_table_inverse[t];
243 return _trans_rotation(URr, c); 171
244 case _trans_DFr: 172 ret = compose(trans_cube, c);
245 return _trans_rotation(DFr, c); 173 ret = compose(ret, trans_inv);
246 case _trans_DLr: 174
247 return _trans_rotation(DLr, c); 175 return t < 24 ? ret : invertco(ret);
248 case _trans_DBr:
249 return _trans_rotation(DBr, c);
250 case _trans_DRr:
251 return _trans_rotation(DRr, c);
252 case _trans_RUr:
253 return _trans_rotation(RUr, c);
254 case _trans_RFr:
255 return _trans_rotation(RFr, c);
256 case _trans_RDr:
257 return _trans_rotation(RDr, c);
258 case _trans_RBr:
259 return _trans_rotation(RBr, c);
260 case _trans_LUr:
261 return _trans_rotation(LUr, c);
262 case _trans_LFr:
263 return _trans_rotation(LFr, c);
264 case _trans_LDr:
265 return _trans_rotation(LDr, c);
266 case _trans_LBr:
267 return _trans_rotation(LBr, c);
268 case _trans_FUr:
269 return _trans_rotation(FUr, c);
270 case _trans_FRr:
271 return _trans_rotation(FRr, c);
272 case _trans_FDr:
273 return _trans_rotation(FDr, c);
274 case _trans_FLr:
275 return _trans_rotation(FLr, c);
276 case _trans_BUr:
277 return _trans_rotation(BUr, c);
278 case _trans_BRr:
279 return _trans_rotation(BRr, c);
280 case _trans_BDr:
281 return _trans_rotation(BDr, c);
282 case _trans_BLr:
283 return _trans_rotation(BLr, c);
284 case _trans_UFm:
285 return _trans_mirrored(UFm, c);
286 case _trans_ULm:
287 return _trans_mirrored(ULm, c);
288 case _trans_UBm:
289 return _trans_mirrored(UBm, c);
290 case _trans_URm:
291 return _trans_mirrored(URm, c);
292 case _trans_DFm:
293 return _trans_mirrored(DFm, c);
294 case _trans_DLm:
295 return _trans_mirrored(DLm, c);
296 case _trans_DBm:
297 return _trans_mirrored(DBm, c);
298 case _trans_DRm:
299 return _trans_mirrored(DRm, c);
300 case _trans_RUm:
301 return _trans_mirrored(RUm, c);
302 case _trans_RFm:
303 return _trans_mirrored(RFm, c);
304 case _trans_RDm:
305 return _trans_mirrored(RDm, c);
306 case _trans_RBm:
307 return _trans_mirrored(RBm, c);
308 case _trans_LUm:
309 return _trans_mirrored(LUm, c);
310 case _trans_LFm:
311 return _trans_mirrored(LFm, c);
312 case _trans_LDm:
313 return _trans_mirrored(LDm, c);
314 case _trans_LBm:
315 return _trans_mirrored(LBm, c);
316 case _trans_FUm:
317 return _trans_mirrored(FUm, c);
318 case _trans_FRm:
319 return _trans_mirrored(FRm, c);
320 case _trans_FDm:
321 return _trans_mirrored(FDm, c);
322 case _trans_FLm:
323 return _trans_mirrored(FLm, c);
324 case _trans_BUm:
325 return _trans_mirrored(BUm, c);
326 case _trans_BRm:
327 return _trans_mirrored(BRm, c);
328 case _trans_BDm:
329 return _trans_mirrored(BDm, c);
330 case _trans_BLm:
331 return _trans_mirrored(BLm, c);
332 default:
333 DBG_LOG("transform error, unknown transformation\n");
334 return zero_fast;
335 }
336} 176}

Generated with cgit - Back to sebastiano.tronto.net