From bbc54accdd0db2f7135964024a3423009b5f571f Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Thu, 22 Apr 2021 11:39:29 +0300 Subject: [PATCH] correct tunnel curving --- src/gamescr.c | 96 +++++++++++++++++++++++++++++++++++--------------------- tools/tungen.c | 2 +- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/src/gamescr.c b/src/gamescr.c index aef4966..7da593a 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -85,59 +85,83 @@ void gamescr(void) __attribute__((noinline, target("arm"), section(".iwram"))) static void draw_tunnel(void) { - int i, j, tx, ty, angle, depth, zoffs, uoffs, flip; - int tunsweep; + int i, j, tx, ty, angle, depth, zoffs, uoffs, flip, tunturn; + static int tunsweep; uint16_t pptop, ppbot; uint16_t *top, *bot; uint32_t tun, *tunptr; - tunsweep = (SIN(nframes) >> 2) + 64; - if(tunsweep > 127) tunsweep = 127; + //tunsweep = SIN(nframes) >> 4; - flip = tunsweep >= 64; + if((bnstate & BN_RT) && tunsweep > -31) tunsweep--; + if((bnstate & BN_LT) && tunsweep < 31) tunsweep++; - tunsweep = (tunsweep & 0x3f); - if(tunsweep >= 32) tunsweep = 63 - tunsweep; + flip = tunsweep < 0; + tunturn = abs(tunsweep) & 0x1f; zoffs = nframes; - uoffs = tunrot >> 1; + uoffs = flip ? -nframes : nframes; top = vram[backbuf]; bot = vram[backbuf] + 159 * 240 / 2; - tunptr = tunmap + tunsweep * 9600; - if(flip) tunptr += 240/2; - for(i=0; i<80; i++) { - for(j=0; j<240/2; j++) { - if(flip) { + tunptr = tunmap + tunturn * 9600; + + if(flip) { + tunptr += 240/2; + for(i=0; i<80; i++) { + for(j=0; j<240/2; j++) { tun = *--tunptr; tun = (tun >> 16) | (tun << 16); - } else { - tun = *tunptr++; - } - angle = tun & 0xff; - depth = (tun >> 8) & 0xff; - tx = ((angle >> 1) - uoffs) & 0x1f; - ty = ((depth >> 1) + zoffs) & 0x1f; - pptop = tex[(ty << 5) + tx]; - tx = ~((angle >> 1) + uoffs) & 0x1f; - ppbot = tex[(ty << 5) + tx]; - - angle = (tun >> 16) & 0xff; - depth = (tun >> 24) & 0xff; - tx = ((angle >> 1) - uoffs) & 0x1f; - ty = ((depth >> 1) + zoffs) & 0x1f; - pptop |= (uint16_t)tex[(ty << 5) + tx] << 8; - tx = ~((angle >> 1) + uoffs) & 0x1f; - ppbot |= (uint16_t)tex[(ty << 5) + tx] << 8; - - *top++ = pptop; - *bot++ = ppbot; + angle = tun & 0xff; + depth = (tun >> 8) & 0xff; + tx = ~((angle >> 1) - uoffs) & 0x1f; + ty = ((depth >> 1) + zoffs) & 0x1f; + pptop = tex[(ty << 5) + tx]; + tx = ((angle >> 1) + uoffs) & 0x1f; + ppbot = tex[(ty << 5) + tx]; + + angle = (tun >> 16) & 0xff; + depth = (tun >> 24) & 0xff; + tx = ~((angle >> 1) - uoffs) & 0x1f; + ty = ((depth >> 1) + zoffs) & 0x1f; + pptop |= (uint16_t)tex[(ty << 5) + tx] << 8; + tx = ((angle >> 1) + uoffs) & 0x1f; + ppbot |= (uint16_t)tex[(ty << 5) + tx] << 8; + + *top++ = pptop; + *bot++ = ppbot; + } + bot -= 240; + tunptr += 240; } - bot -= 240; + } else { + for(i=0; i<80; i++) { + for(j=0; j<240/2; j++) { + tun = *tunptr++; - if(flip) tunptr += 240; + angle = tun & 0xff; + depth = (tun >> 8) & 0xff; + tx = ((angle >> 1) - uoffs) & 0x1f; + ty = ((depth >> 1) + zoffs) & 0x1f; + pptop = tex[(ty << 5) + tx]; + tx = ~((angle >> 1) + uoffs) & 0x1f; + ppbot = tex[(ty << 5) + tx]; + + angle = (tun >> 16) & 0xff; + depth = (tun >> 24) & 0xff; + tx = ((angle >> 1) - uoffs) & 0x1f; + ty = ((depth >> 1) + zoffs) & 0x1f; + pptop |= (uint16_t)tex[(ty << 5) + tx] << 8; + tx = ~((angle >> 1) + uoffs) & 0x1f; + ppbot |= (uint16_t)tex[(ty << 5) + tx] << 8; + + *top++ = pptop; + *bot++ = ppbot; + } + bot -= 240; + } } } diff --git a/tools/tungen.c b/tools/tungen.c index 49b3f16..f480758 100644 --- a/tools/tungen.c +++ b/tools/tungen.c @@ -102,7 +102,7 @@ invalopt: fprintf(stderr, "invalid argument: %s\n", argv[i]); if(fabs(r - prev_r) < 0.05) continue; for(j=0; j