diff --git a/include/config.h b/include/config.h index 6a226f67..19c618f5 100644 --- a/include/config.h +++ b/include/config.h @@ -35,14 +35,10 @@ // Border Height Define for NTSC Versions #ifdef TARGET_N64 -#ifndef VERSION_EU -#define BORDER_HEIGHT 0 -#else -#define BORDER_HEIGHT 0 -#endif -#else -// What's the point of having a border? -#define BORDER_HEIGHT 0 +// Size of the black border at the top and bottom of the screen. You can set it to different values for console and emulator. +// There is generally no reason to have a value other than 0 for emulator. As for console, it provides a (small) performance boost. +#define BORDER_HEIGHT_CONSOLE 0 +#define BORDER_HEIGHT_EMULATOR 0 #endif diff --git a/src/game/area.c b/src/game/area.c index 3298ef98..465789df 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -366,16 +366,16 @@ void render_game(void) { gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_8032CF00)); - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, - SCREEN_HEIGHT - BORDER_HEIGHT); + gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, gBorderHeight, SCREEN_WIDTH, + SCREEN_HEIGHT - gBorderHeight); render_hud(); gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); render_text_labels(); do_cutscene_handler(); print_displaying_credits_entry(); - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, - SCREEN_HEIGHT - BORDER_HEIGHT); + gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, gBorderHeight, SCREEN_WIDTH, + SCREEN_HEIGHT - gBorderHeight); gPauseScreenMode = render_menus_and_dialogs(); if (gPauseScreenMode != 0) { @@ -385,8 +385,8 @@ void render_game(void) { if (D_8032CE78 != NULL) { make_viewport_clip_rect(D_8032CE78); } else - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, - SCREEN_HEIGHT - BORDER_HEIGHT); + gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, gBorderHeight, SCREEN_WIDTH, + SCREEN_HEIGHT - gBorderHeight); if (gWarpTransition.isActive) { if (gWarpTransDelay == 0) { diff --git a/src/game/game_init.c b/src/game/game_init.c index c72b60cf..ca1b42cb 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -66,6 +66,7 @@ u8 gIsConsole; #ifdef WIDE u8 gWidescreen; #endif +u8 gBorderHeight; u16 sCurrFBNum = 0; u16 frameBufferIndex = 0; @@ -144,8 +145,8 @@ void clear_z_buffer(void) { gDPSetFillColor(gDisplayListHead++, GPACK_ZDZ(G_MAXFBZ, 0) << 16 | GPACK_ZDZ(G_MAXFBZ, 0)); - gDPFillRectangle(gDisplayListHead++, 0, BORDER_HEIGHT, SCREEN_WIDTH - 1, - SCREEN_HEIGHT - 1 - BORDER_HEIGHT); + gDPFillRectangle(gDisplayListHead++, 0, gBorderHeight, SCREEN_WIDTH - 1, + SCREEN_HEIGHT - 1 - gBorderHeight); } /** Sets up the final framebuffer image. */ @@ -155,8 +156,8 @@ void display_frame_buffer(void) { gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalFrameBuffers[frameBufferIndex]); - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, BORDER_HEIGHT, SCREEN_WIDTH, - SCREEN_HEIGHT - BORDER_HEIGHT); + gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, gBorderHeight, SCREEN_WIDTH, + SCREEN_HEIGHT - gBorderHeight); } /** Clears the framebuffer, allowing it to be overwritten. */ @@ -168,8 +169,8 @@ void clear_frame_buffer(s32 color) { gDPSetFillColor(gDisplayListHead++, color); gDPFillRectangle(gDisplayListHead++, - GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), BORDER_HEIGHT, - GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - BORDER_HEIGHT - 1); + GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), gBorderHeight, + GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - gBorderHeight - 1); gDPPipeSync(gDisplayListHead++); @@ -211,11 +212,11 @@ void draw_screen_borders(void) { gDPSetFillColor(gDisplayListHead++, GPACK_RGBA5551(0, 0, 0, 0) << 16 | GPACK_RGBA5551(0, 0, 0, 0)); -#if BORDER_HEIGHT != 0 +#if gBorderHeight != 0 gDPFillRectangle(gDisplayListHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), 0, - GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, BORDER_HEIGHT - 1); + GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, gBorderHeight - 1); gDPFillRectangle(gDisplayListHead++, - GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), SCREEN_HEIGHT - BORDER_HEIGHT, + GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), SCREEN_HEIGHT - gBorderHeight, GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - 1); #endif } @@ -328,8 +329,10 @@ void draw_reset_bars(void) { void rendering_init(void) { if (IO_READ(DPC_PIPEBUSY_REG) == 0) { gIsConsole = 0; + gBorderHeight = BORDER_HEIGHT_EMULATOR; } else { gIsConsole = 1; + gBorderHeight = BORDER_HEIGHT_CONSOLE; } gGfxPool = &gGfxPools[0]; set_segment_base_addr(1, gGfxPool->buffer); diff --git a/src/game/game_init.h b/src/game/game_init.h index ab658eaf..167fd9c5 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -45,6 +45,7 @@ extern u8 gIsConsole; #ifdef WIDE extern u8 gWidescreen; #endif +extern u8 gBorderHeight; #ifdef EEP extern s8 gEepromProbe; #endif diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index 2966e6a8..e5048d1f 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -1122,7 +1122,7 @@ void render_dialog_entries(void) { if (gLastDialogPageStrPos == -1 && gLastDialogResponse == 1) { render_dialog_triangle_choice(); } - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 2, 2, SCREEN_WIDTH - BORDER_HEIGHT/2, SCREEN_HEIGHT - BORDER_HEIGHT/2); + gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 2, 2, SCREEN_WIDTH - gBorderHeight/2, SCREEN_HEIGHT - gBorderHeight/2); if (gLastDialogPageStrPos != -1 && gDialogBoxState == DIALOG_STATE_VERTICAL) { render_dialog_string_color(dialog->linesPerBox); } diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 6c64325b..ab0b73f6 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -591,8 +591,8 @@ static void geo_process_background(struct GraphNodeBackground *node) { gDPPipeSync(gfx++); gDPSetCycleType(gfx++, G_CYC_FILL); gDPSetFillColor(gfx++, node->background); - gDPFillRectangle(gfx++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), BORDER_HEIGHT, - GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - BORDER_HEIGHT - 1); + gDPFillRectangle(gfx++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), gBorderHeight, + GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - gBorderHeight - 1); gDPPipeSync(gfx++); gDPSetCycleType(gfx++, G_CYC_1CYCLE); gSPEndDisplayList(gfx++);