Skip to content

Commit b2624bf

Browse files
committed
226 shift table implemented in pc port
1 parent 425082c commit b2624bf

File tree

1 file changed

+168
-132
lines changed

1 file changed

+168
-132
lines changed

rebuild_PS1/TEST_226.c

Lines changed: 168 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,48 @@ struct RenderList
2424
// one for each player
2525
};
2626

27-
enum RotateFlipType
27+
// From CTR 226 overlay
28+
const int shiftTable226[24] =
2829
{
29-
RFT_None = 0,
30-
RFT_Rotate90 = 1,
31-
RFT_Rotate180 = 2,
32-
RFT_Rotate270 = 3,
33-
RFT_FlipRotate270 = 4,
34-
RFT_FlipRotate180 = 5,
35-
RFT_FlipRotate90 = 6,
36-
RFT_Flip = 7,
37-
RFT_NoMatch = -1
30+
0x18100800, 0x80900818, 0x81018, 0x98881000,
31+
0x98081000, 0x881018, 0x80100818, 0x18900800,
32+
0x10081898, 0x88881810, 0x18180810, 0x90980888,
33+
0x90180888, 0x18980810, 0x88081810, 0x10881898,
34+
0x8181090, 0x98981008, 0x10101808, 0x88901898,
35+
0x88101898, 0x10901808, 0x98181008, 0x8981090
36+
};
37+
38+
int comboNum = 0;
39+
40+
int combinations[] =
41+
{
42+
0x0004080a, // 0 1 2 3 (sideways)
43+
0x00040a08, // 0 1 3 2
44+
0x0008040a, // 0 2 1 3
45+
0x00040a08, // 0 2 3 1
46+
0x000a0408, // 0 3 1 2
47+
0x000a0804, // 0 3 2 1
48+
49+
0x0400080a, // 0 1 2 3
50+
0x04000a08, // 0 1 3 2
51+
0x0408000a, // 0 2 1 3
52+
0x04000a08, // 0 2 3 1
53+
0x040a0008, // 0 3 1 2
54+
0x040a0800, // 0 3 2 1
55+
56+
0x0804000a, // 0 1 2 3
57+
0x08040a00, // 0 1 3 2
58+
0x0800040a, // 0 2 1 3
59+
0x08040a00, // 0 2 3 1
60+
0x080a0400, // 0 3 1 2
61+
0x080a0004, // 0 3 2 1
62+
63+
0x0a040800, // 0 1 2 3
64+
0x0a040008, // 0 1 3 2
65+
0x0a080400, // 0 2 1 3
66+
0x0a040008, // 0 2 3 1
67+
0x0a000408, // 0 3 1 2
68+
0x0a000804, // 0 3 2 1
3869
};
3970

4071
void TEST_226(
@@ -219,17 +250,116 @@ void TEST_226(
219250
continue;
220251
}
221252

253+
int idHigh_ShapeOfZ[16] =
254+
{
255+
0,4,5,6,
256+
4,1,6,7,
257+
5,6,2,8,
258+
6,7,8,3
259+
};
260+
261+
int idLow_ShapeOfZ[4] =
262+
{
263+
0,1,2,3
264+
};
265+
266+
#define L1Z(x) idLow_ShapeOfZ[x]
267+
#define H1Z(x) idHigh_ShapeOfZ[0+x]
268+
#define H2Z(x) idHigh_ShapeOfZ[4+x]
269+
#define H3Z(x) idHigh_ShapeOfZ[8+x]
270+
#define H4Z(x) idHigh_ShapeOfZ[12+x]
271+
222272
int idHigh[16] =
223273
{
224-
5,0,6,4,
225-
6,4,7,1,
226-
2,5,8,6,
227-
8,6,3,7
274+
// 0
275+
//H1Z(0), H1Z(1), H1Z(2), H1Z(3),
276+
//H2Z(0), H2Z(1), H2Z(2), H2Z(3),
277+
//H3Z(0), H3Z(1), H3Z(2), H3Z(3),
278+
//H4Z(0), H4Z(1), H4Z(2), H4Z(3),
279+
280+
// 1
281+
//H1Z(0), H1Z(1), H1Z(3), H1Z(2),
282+
//H2Z(0), H2Z(1), H2Z(3), H2Z(2),
283+
//H3Z(0), H3Z(1), H3Z(3), H3Z(2),
284+
//H4Z(0), H4Z(1), H4Z(3), H4Z(2),
285+
286+
// 2
287+
//H1Z(0), H1Z(2), H1Z(1), H1Z(3),
288+
//H2Z(0), H2Z(2), H2Z(1), H2Z(3),
289+
//H3Z(0), H3Z(2), H3Z(1), H3Z(3),
290+
//H4Z(0), H4Z(2), H4Z(1), H4Z(3),
291+
292+
// 3
293+
//H1Z(0), H1Z(2), H1Z(3), H1Z(1),
294+
//H2Z(0), H2Z(2), H2Z(3), H2Z(1),
295+
//H3Z(0), H3Z(2), H3Z(3), H3Z(1),
296+
//H4Z(0), H4Z(2), H4Z(3), H4Z(1),
297+
298+
// 4
299+
//H1Z(1), H1Z(0), H1Z(2), H1Z(3),
300+
//H1Z(1), H1Z(0), H1Z(2), H1Z(3),
301+
//H1Z(1), H1Z(0), H1Z(2), H1Z(3),
302+
//H1Z(1), H1Z(0), H1Z(2), H1Z(3),
303+
//
304+
//H1Z(1), H1Z(0), H1Z(3), H1Z(2),
305+
//H2Z(1), H2Z(0), H2Z(3), H2Z(2),
306+
//H3Z(1), H3Z(0), H3Z(3), H3Z(2),
307+
//H4Z(1), H4Z(0), H4Z(3), H4Z(2),
308+
//
309+
//H1Z(1), H1Z(2), H1Z(0), H1Z(3),
310+
//H2Z(1), H2Z(2), H2Z(0), H2Z(3),
311+
//H3Z(1), H3Z(2), H3Z(0), H3Z(3),
312+
//H4Z(1), H4Z(2), H4Z(0), H4Z(3),
313+
//
314+
//H1Z(1), H1Z(2), H1Z(3), H1Z(0),
315+
//H2Z(1), H2Z(2), H2Z(3), H2Z(0),
316+
//H3Z(1), H3Z(2), H3Z(3), H3Z(0),
317+
//H4Z(1), H4Z(2), H4Z(3), H4Z(0),
318+
//
319+
//H1Z(2), H1Z(1), H1Z(0), H1Z(3),
320+
//H2Z(2), H2Z(1), H2Z(0), H2Z(3),
321+
//H3Z(2), H3Z(1), H3Z(0), H3Z(3),
322+
//H4Z(2), H4Z(1), H4Z(0), H4Z(3),
323+
//
324+
//H1Z(2), H1Z(1), H1Z(3), H1Z(0),
325+
//H2Z(2), H2Z(1), H2Z(3), H2Z(0),
326+
//H3Z(2), H3Z(1), H3Z(3), H3Z(0),
327+
//H4Z(2), H4Z(1), H4Z(3), H4Z(0),
328+
//
329+
//H1Z(2), H1Z(0), H1Z(1), H1Z(3),
330+
//H2Z(2), H2Z(0), H2Z(1), H2Z(3),
331+
//H3Z(2), H3Z(0), H3Z(1), H3Z(3),
332+
//H4Z(2), H4Z(0), H4Z(1), H4Z(3),
333+
//
334+
//H1Z(2), H1Z(0), H1Z(3), H1Z(1),
335+
//H2Z(2), H2Z(0), H2Z(3), H2Z(1),
336+
//H3Z(2), H3Z(0), H3Z(3), H3Z(1),
337+
//H4Z(2), H4Z(0), H4Z(3), H4Z(1),
338+
//
339+
H1Z(3), H1Z(1), H1Z(2), H1Z(0),
340+
H2Z(3), H2Z(1), H2Z(2), H2Z(0),
341+
H3Z(3), H3Z(1), H3Z(2), H3Z(0),
342+
H4Z(3), H4Z(1), H4Z(2), H4Z(0),
343+
//
344+
//H1Z(3), H1Z(1), H1Z(0), H1Z(2),
345+
//H2Z(3), H2Z(1), H2Z(0), H2Z(2),
346+
//H3Z(3), H3Z(1), H3Z(0), H3Z(2),
347+
//H4Z(3), H4Z(1), H4Z(0), H4Z(2),
348+
//
349+
//H1Z(3), H1Z(2), H1Z(1), H1Z(0),
350+
//H2Z(3), H2Z(2), H2Z(1), H2Z(0),
351+
//H3Z(3), H3Z(2), H3Z(1), H3Z(0),
352+
//H4Z(3), H4Z(2), H4Z(1), H4Z(0),
353+
//
354+
//H1Z(3), H1Z(2), H1Z(0), H1Z(1),
355+
//H2Z(3), H2Z(2), H2Z(0), H2Z(1),
356+
//H3Z(3), H3Z(2), H3Z(0), H3Z(1),
357+
//H4Z(3), H4Z(2), H4Z(0), H4Z(1)
228358
};
229359

230360
int idLow[4] =
231361
{
232-
2,0,3,1
362+
L1Z(3), L1Z(1), L1Z(2), L1Z(0)
233363
};
234364

235365
// low LOD
@@ -301,137 +431,43 @@ void TEST_226(
301431
}
302432
}
303433

304-
305434
unsigned int draw_order_high = block->draw_order_high;
306435
unsigned int draw_order_low = block->draw_order_low;
307436

308-
unsigned int rotAndOrder = (draw_order_low >> (8 + k * 5)) & 0x1F;
309-
unsigned int justRot = rotAndOrder & 7;
310-
unsigned int justOrder = (rotAndOrder >> 3) & 3;
311-
312-
if (tl != 0)
437+
if (tl != 1)
313438
{
314-
// 2031
315-
if (justRot == RFT_None)
316-
{
317-
setUV4(p,
318-
tl->u2, tl->v2,
319-
tl->u0, tl->v0,
320-
tl->u3, tl->v3,
321-
tl->u1, tl->v1);
322-
}
439+
unsigned int bits5 = (draw_order_low >> (8 + k * 5)) & 0x1F;
440+
char* tlByteAddr = (char*)tl;
323441

324-
// 3210
325-
else if (justRot == RFT_Rotate90)
326-
{
327-
setUV4(p,
328-
tl->u3, tl->v3,
329-
tl->u2, tl->v2,
330-
tl->u1, tl->v1,
331-
tl->u0, tl->v0);
332-
}
442+
// u0, u1, u2, u3 {3,2,1,0}
443+
// int tlOffsets_RegularOrder = 0x0a080400;
333444

334-
// 1302
335-
else if (justRot == RFT_Rotate180)
336-
{
337-
setUV4(p,
338-
tl->u1, tl->v1,
339-
tl->u3, tl->v3,
340-
tl->u0, tl->v0,
341-
tl->u2, tl->v2);
342-
}
445+
comboNum = sdata->gGT->timer >> 6;
446+
if (comboNum > 24)
447+
comboNum = 0;
343448

344-
// 0123
345-
else if (justRot == RFT_Rotate270)
346-
{
347-
setUV4(p,
348-
tl->u0, tl->v0,
349-
tl->u1, tl->v1,
350-
tl->u2, tl->v2,
351-
tl->u3, tl->v3);
352-
}
449+
// This will do "FOR NOW"
450+
comboNum = 10;
353451

354-
// 1032
355-
else if (justRot == RFT_FlipRotate270)
356-
{
357-
setUV4(p,
358-
tl->u1, tl->v1,
359-
tl->u0, tl->v0,
360-
tl->u3, tl->v3,
361-
tl->u2, tl->v2);
362-
}
452+
// match idLow: 2, 0, 3, 1 {1,3,0,2}
453+
int tlOffsets = combinations[comboNum];
363454

364-
// 3102
365-
else if (justRot == RFT_FlipRotate180)
366-
{
367-
setUV4(p,
368-
tl->u0, tl->v0,
369-
tl->u2, tl->v2,
370-
tl->u1, tl->v1,
371-
tl->u3, tl->v3);
372-
}
373-
374-
// 2301
375-
else if (justRot == RFT_FlipRotate90)
376-
{
377-
setUV4(p,
378-
tl->u2, tl->v2,
379-
tl->u3, tl->v3,
380-
tl->u0, tl->v0,
381-
tl->u1, tl->v1);
382-
}
383-
384-
// 3120
385-
else if (justRot == RFT_Flip)
386-
{
387-
setUV4(p,
388-
tl->u3, tl->v3,
389-
tl->u1, tl->v1,
390-
tl->u2, tl->v2,
391-
tl->u0, tl->v0);
392-
}
455+
int tlU0 = (tlOffsets >> ((shiftTable226[bits5] >> 0x0) & 0xFF)) & 0xFF;
456+
int tlU1 = (tlOffsets >> ((shiftTable226[bits5] >> 0x8) & 0xFF)) & 0xFF;
457+
int tlU2 = (tlOffsets >> ((shiftTable226[bits5] >> 0x10) & 0xFF)) & 0xFF;
458+
int tlU3 = (tlOffsets >> ((shiftTable226[bits5] >> 0x18) & 0xFF)) & 0xFF;
393459

394-
else
395-
continue;
460+
setUV4(p,
461+
*(unsigned char*)&tlByteAddr[tlU0 + 0], *(unsigned char*)&tlByteAddr[tlU0 + 1],
462+
*(unsigned char*)&tlByteAddr[tlU1 + 0], *(unsigned char*)&tlByteAddr[tlU1 + 1],
463+
*(unsigned char*)&tlByteAddr[tlU2 + 0], *(unsigned char*)&tlByteAddr[tlU2 + 1],
464+
*(unsigned char*)&tlByteAddr[tlU3 + 0], *(unsigned char*)&tlByteAddr[tlU3 + 1],
465+
);
396466

397467
p->clut = tl->clut;
398468
p->tpage = tl->tpage;
399469
}
400470

401-
int u[4];
402-
int v[4];
403-
404-
u[0] = p->u0;
405-
v[0] = p->v0;
406-
407-
u[1] = p->u1;
408-
v[1] = p->v1;
409-
410-
u[2] = p->u2;
411-
v[2] = p->v2;
412-
413-
u[3] = p->u3;
414-
v[3] = p->v3;
415-
416-
#define SETME(x0, x1, x2, x3) p->u0 = u[x0-1], p->v0 = v[x0-1]; p->u1 = u[x1-1], p->v1 = v[x1-1]; p->u2 = u[x2-1], p->v2 = v[x2-1]; p->u3 = u[x3-1], p->v3 = v[x3-1];
417-
418-
419-
if (justOrder == 1)
420-
{
421-
// for a good example, see AdvHub Warppads
422-
423-
/*SETME(1, 3, 2, 4);*/
424-
SETME(3, 1, 4, 2);
425-
}
426-
427-
else if (justOrder == 2)
428-
{
429-
// for a good example, see N Gin Labs
430-
431-
/*SETME(3, 4, 2, 1);*/
432-
SETME(4, 3, 1, 2);
433-
}
434-
435471
// automatic pass, if no frontface or backface culling
436472
int boolPassCull = (draw_order_low & 0x80000000) != 0;
437473

@@ -441,7 +477,7 @@ void TEST_226(
441477
int opZ;
442478
gte_nclip();
443479
gte_stopz(&opZ);
444-
boolPassCull = (opZ < 0);
480+
boolPassCull = (opZ >= 0);
445481
}
446482

447483
if (boolPassCull)

0 commit comments

Comments
 (0)