ref: 634086734f11bb2f220bf1d8353c810fe473c3a9
parent: 7471a86e3d40f217ff61fad94de5fcd023204ab1
author: Snesrev <snesrev@protonmail.com>
date: Wed Sep 28 12:06:47 EDT 2022
Add config option to disable the per-scanline sprite limits - Visible when beamos shoots horizontally
--- a/config.c
+++ b/config.c
@@ -224,6 +224,9 @@
} else if (StringEqualsNoCase(key, "WindowScale")) {
g_config.window_scale = (uint8)strtol(value, (char**)NULL, 10);
return true;
+ } else if (StringEqualsNoCase(key, "NoSpriteLimits")) {
+ g_config.no_sprite_limits = (bool)strtol(value, (char **)NULL, 10);
+ return true;
}
} else if (section == 2) {
if (StringEqualsNoCase(key, "EnableAudio")) {
--- a/config.h
+++ b/config.h
@@ -46,6 +46,7 @@
bool autosave;
uint8 extended_aspect_ratio;
bool extend_y, extended_aspect_ratio_nospr;
+ bool no_sprite_limits;
bool display_perf_title;
bool enable_msu;
bool item_switch_lr;
--- a/main.c
+++ b/main.c
@@ -203,7 +203,8 @@
g_ppu_render_flags = g_config.new_renderer * kPpuRenderFlags_NewRenderer |
g_config.enhanced_mode7 * kPpuRenderFlags_4x4Mode7 |
- g_config.extend_y * kPpuRenderFlags_Height240;
+ g_config.extend_y * kPpuRenderFlags_Height240 |
+ g_config.no_sprite_limits * kPpuRenderFlags_NoSpriteLimits;
msu_enabled = g_config.enable_msu;
if (g_config.fullscreen == 1)
--- a/snes/ppu.c
+++ b/snes/ppu.c
@@ -1305,9 +1305,13 @@
// then iterate those in-range sprites in reverse for tile-fetching
// TODO: rectangular sprites, wierdness with sprites at -256
int index = ppu->objPriority ? (ppu->oamAdr & 0xfe) : 0, index_end = index;
- int spritesFound = 0, tilesFound = 0;
+ int spritesLeft = 32 + 1, tilesLeft = 34 + 1;
uint8 spriteSizes[2] = { kSpriteSizes[ppu->objSize][0], kSpriteSizes[ppu->objSize][1] };
int extra_left_right = ppu->extraLeftRight;
+ if (ppu->renderFlags & kPpuRenderFlags_NoSpriteLimits)
+ spritesLeft = tilesLeft = 1024;
+ int tilesLeftOrg = tilesLeft;
+
do {
int yy = ppu->oam[index] >> 8;
if (yy == 0xf0)
@@ -1325,7 +1329,7 @@
if (x <= -(spriteSize + extra_left_right))
continue;
// break if we found 32 sprites already
- if (++spritesFound > 32) {
+ if (--spritesLeft == 0) {
ppu->rangeOver = true;
break;
}
@@ -1341,7 +1345,7 @@
for (int col = 0; col < spriteSize; col += 8) {
if (col + x > -8 - extra_left_right && col + x < 256 + extra_left_right) {
// break if we found 34 8*1 slivers already
- if (++tilesFound > 34) {
+ if (--tilesLeft == 0) {
ppu->timeOver = true;
return true;
}
@@ -1366,7 +1370,7 @@
}
}
} while ((index = (index + 2) & 0xff) != index_end);
- return (tilesFound != 0);
+ return (tilesLeft != tilesLeftOrg);
}
static uint16_t ppu_getVramRemap(Ppu* ppu) {
--- a/snes/ppu.h
+++ b/snes/ppu.h
@@ -52,6 +52,8 @@
kPpuRenderFlags_4x4Mode7 = 2,
// Use 240 height instead of 224
kPpuRenderFlags_Height240 = 4,
+ // Disable sprite render limits
+ kPpuRenderFlags_NoSpriteLimits = 8,
};
--- a/zelda3.ini
+++ b/zelda3.ini
@@ -19,6 +19,8 @@
EnhancedMode7 = 1
IgnoreAspectRatio = 0
+# Enable this option to remove the sprite limits per scan line
+NoSpriteLimits = 1
[Sound]
EnableAudio = 1