From ff74cf463fa44906add9344891096cada0970205 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Wed, 21 Apr 2021 17:01:37 +0300 Subject: [PATCH] software tunnel rotation / lower framerate --- Makefile | 2 +- src/gamescr.c | 99 ++++++++++++++++++++++++++++++-------------------------- tools/tungen.c | 4 +-- 3 files changed, 56 insertions(+), 49 deletions(-) diff --git a/Makefile b/Makefile index 26ffc65..9da7f4d 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ data/lut.s: tools/lutgen tools/lutgen >$@ data/tun.map: tools/tungen - tools/tungen -s 160x160 >$@ + tools/tungen -s 256x256 >$@ data/snd.bin: $(audata) tools/mmutil/mmutil tools/mmutil/mmutil -o$@ -hdata/snd.h $(audata) diff --git a/src/gamescr.c b/src/gamescr.c index 8d5f344..9e9d6e1 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -24,13 +24,13 @@ static uint16_t oam[4 * MAX_SPR]; static short x = 120, y = 80; static unsigned char rot; -static int32_t bgmat[4]; -static int32_t bgx, bgy; static int32_t tunrot; +static int32_t tunmat[4], tunx, tuny; void gamescr(void) { int i; + int32_t scale; uint16_t *cdst; unsigned char *csrc; @@ -61,6 +61,14 @@ void gamescr(void) tex = iwram_sbrk(32 * 32); memcpy(tex, tuncross_pixels, 32 * 32); + scale = 0x100;//230; + REG_BG2PA = scale; + REG_BG2PB = 0; + REG_BG2PC = 0; + REG_BG2PD = scale; + REG_BG2X = (120 << 8) - scale * 120; + REG_BG2Y = (80 << 8) - scale * 80; + /*select_input(BN_DPAD);*/ mask(INTR_VBLANK); @@ -78,15 +86,6 @@ void gamescr(void) vblperf_end(); wait_vblank(); present(backbuf); - - tunrot = nframes; - bgmat[0] = (COS(tunrot) * 140) >> 8; - bgmat[1] = (-SIN(tunrot) * 140) >> 8; - bgmat[2] = (SIN(tunrot) * 140) >> 8; - bgmat[3] = (COS(tunrot) * 140) >> 8; - bgx = (120 << 8) - bgmat[0] * 120 + bgmat[1] * -80; - bgy = (80 << 8) - bgmat[2] * 120 + bgmat[3] * -80; - vblperf_begin(); } } @@ -95,50 +94,65 @@ __attribute__((noinline, target("arm"), section(".iwram"))) static void draw_tunnel(void) { int i, j, tx, ty, angle, depth, zoffs, uoffs; - uint16_t pptop, ppbot; - uint16_t *top, *bot; - uint32_t tun, *tunptr; + uint16_t pptop; + uint16_t *top; + uint16_t tun; + int32_t startx, starty; + uint16_t *tmap = (uint16_t*)tunmap; zoffs = nframes; - uoffs = tunrot >> 1; - - top = vram[backbuf] + 20; - bot = vram[backbuf] + 159 * 240 / 2 + 20; - tunptr = tunmap; - for(i=0; i<80; i++) { - for(j=0; j<160/2; j++) { -#ifdef VBLBAR - if(j == 160/4) { - tunptr++; - top++; - bot++; - continue; - } -#endif - tun = *tunptr++; + /* + if(bnstate & KEY_LT) tunrot++; + if(bnstate & KEY_RT) tunrot--; + */ + tunrot = nframes; + + tunmat[0] = COS(tunrot); + tunmat[1] = -SIN(tunrot); + tunmat[2] = SIN(tunrot); + tunmat[3] = COS(tunrot); + tunx = (128 << 8) - tunmat[0] * 120 + tunmat[1] * -80; + tuny = (128 << 8) - tunmat[2] * 120 + tunmat[3] * -80; + + uoffs = tunrot; + + top = vram[backbuf]; + for(i=0; i<160; i++) { + startx = tunx; + starty = tuny; + for(j=0; j<240/2; j++) { + tx = (tunx >> 8) & 0xff; + ty = (tuny >> 8) & 0xff; + tun = tmap[(ty << 8) + tx]; + + tunx += tunmat[0]; + tuny += tunmat[2]; 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 = (tunx >> 8) & 0xff; + ty = (tuny >> 8) & 0xff; + tun = tmap[(ty << 8) + tx]; + + tunx += tunmat[0]; + tuny += tunmat[2]; + + angle = tun & 0xff; + depth = (tun >> 8) & 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; } - top += 40; - bot -= 240 - 40; + + tunx = startx + tunmat[1]; + tuny = starty + tunmat[3]; } } @@ -149,13 +163,6 @@ static void vblank(void) int16_t mat[4]; static short gate_speed; - REG_BG2PA = bgmat[0]; - REG_BG2PB = bgmat[1]; - REG_BG2PC = bgmat[2]; - REG_BG2PD = bgmat[3]; - REG_BG2X = bgx; - REG_BG2Y = bgy; - bnstate = ~REG_KEYINPUT; if(bnstate & BN_DPAD) { if(gate_speed < 5) { diff --git a/tools/tungen.c b/tools/tungen.c index ec21217..62e0d63 100644 --- a/tools/tungen.c +++ b/tools/tungen.c @@ -52,8 +52,8 @@ invalopt: fprintf(stderr, "invalid argument: %s\n", argv[i]); prev_r = 0.0f; for(i=0; i