# HG changeset patch # User Michael Pavone # Date 1569089860 25200 # Node ID 183b86ba0212da759d19e1cb085ea90f97cae329 # Parent 4178ce857e879bd9aec1340e4a8fe6a2ffbb86bf Optimized sprite rendering diff -r 4178ce857e87 -r 183b86ba0212 vdp.c --- a/vdp.c Sat Sep 21 11:01:07 2019 -0700 +++ b/vdp.c Sat Sep 21 11:17:40 2019 -0700 @@ -302,24 +302,50 @@ if (!(context->flags & FLAG_MASKED)) { x -= 128; //printf("Draw Slot %d of %d, Rendering sprite cell from %X to x: %d\n", context->cur_slot, context->sprite_draws, d->address, x); - + uint8_t collide = 0; + if (x >= 8 && x < 312) { + //sprite is fully visible + for (; address != ((context->serial_address+4) & 0xFFFF); address++) { + uint8_t pixel = context->vdpmem[address] >> 4; + if (!(context->linebuf[x] & 0xF)) { + context->linebuf[x] = pixel | d->pal_priority; + } else { + collide |= pixel; + } + x += dir; + pixel = context->vdpmem[address] & 0xF; + if (!(context->linebuf[x] & 0xF)) { + context->linebuf[x] = pixel | d->pal_priority; + } else { + collide |= pixel; + } + x += dir; + } + } else if (x > -8 && x < 327) { + //sprite is partially visible for (; address != ((context->serial_address+4) & 0xFFFF); address++) { if (x >= 0 && x < 320) { + uint8_t pixel = context->vdpmem[address] >> 4; if (!(context->linebuf[x] & 0xF)) { - context->linebuf[x] = (context->vdpmem[address] >> 4) | d->pal_priority; - } else if (context->vdpmem[address] >> 4) { - context->flags2 |= FLAG2_SPRITE_COLLIDE; + context->linebuf[x] = pixel | d->pal_priority; + } else { + collide |= pixel; } } x += dir; if (x >= 0 && x < 320) { + uint8_t pixel = context->vdpmem[address] & 0xF; if (!(context->linebuf[x] & 0xF)) { - context->linebuf[x] = (context->vdpmem[address] & 0xF) | d->pal_priority; - } else if (context->vdpmem[address] & 0xF) { - context->flags2 |= FLAG2_SPRITE_COLLIDE; + context->linebuf[x] = pixel | d->pal_priority; + } else { + collide |= pixel; } } x += dir; + } + } + if (collide) { + context->flags2 |= FLAG2_SPRITE_COLLIDE; } } } else if (context->flags & FLAG_CAN_MASK) {