diff --git a/README.md b/README.md index 8380de2c4..87d26f2f9 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ - It has been patched with someone2639's shiftable segments patch - Wiseguy's instant input patch has been added to allow for less input lag on emulation (Does not affect console) This does mean that any framebuffer effects will have to be done on buffer 0 if targeting emulators +- Automatic console and emulator detection: Use the `gIsConsole` variable to wrap your code in an emulator check. +- Separate defines for emulator and console black border height. - Getting HVQM FMV support to work with the game is WIP. Requirements are the same as regular SM64, however a GCC MIPS cross compiler is also required. If you're on Debian-like Linux, you can use the ``gcc-mips-linux-gnu`` package. The toolchain that comes with my SDK is also supported. diff --git a/bin/segment2.c b/bin/segment2.c index 35f0a130e..20ffa240e 100644 --- a/bin/segment2.c +++ b/bin/segment2.c @@ -2097,14 +2097,8 @@ const Gfx dl_hud_img_begin[] = { gsDPSetTexturePersp(G_TP_NONE), gsDPSetAlphaCompare(G_AC_THRESHOLD), gsDPSetBlendColor(255, 255, 255, 255), -#if defined(VERSION_EU) || defined(VERSION_SH) gsDPSetRenderMode(G_RM_NOOP, G_RM_NOOP2), -#endif -#ifdef VERSION_EU gsDPSetTextureFilter(G_TF_POINT), -#elif defined(VERSION_JP) || defined(VERSION_US) - gsDPSetRenderMode(G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2), -#endif gsSPEndDisplayList(), }; @@ -2124,13 +2118,8 @@ const Gfx dl_hud_img_end[] = { gsDPSetTexturePersp(G_TP_PERSP), gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2), gsDPSetAlphaCompare(G_AC_NONE), -#ifdef VERSION_EU gsDPSetTextureFilter(G_TF_BILERP), -#endif gsDPSetCycleType(G_CYC_1CYCLE), -#if defined(VERSION_JP) || defined(VERSION_US) - gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF), -#endif gsSPEndDisplayList(), }; diff --git a/include/config.h b/include/config.h index eb884ac35..8551a8ae0 100644 --- a/include/config.h +++ b/include/config.h @@ -44,13 +44,15 @@ // Border Height Define for NTSC Versions #ifdef TARGET_N64 #ifndef VERSION_EU -#define BORDER_HEIGHT 8 +#define BORDER_HEIGHT_CONSOLE 8 +#define BORDER_HEIGHT_EMULATOR 0 #else -#define BORDER_HEIGHT 1 +#define BORDER_HEIGHT_CONSOLE 1 +#define BORDER_HEIGHT_EMULATOR 0 #endif #else -// What's the point of having a border? -#define BORDER_HEIGHT 0 +#define BORDER_HEIGHT_CONSOLE 0 +#define BORDER_HEIGHT_EMULATOR 0 #endif #endif // CONFIG_H diff --git a/src/game/area.c b/src/game/area.c index fc2b7b69d..0113030d4 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -366,28 +366,27 @@ 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); gMenuOptSelectIndex = render_menus_and_dialogs(); - if (gMenuOptSelectIndex != MENU_OPT_NONE) { + + if (gMenuOptSelectIndex != 0) { gSaveOptSelectIndex = gMenuOptSelectIndex; } 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); - } + } else + 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 30c642e14..f693158d1 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -44,6 +44,8 @@ struct GfxPool *gGfxPool; OSContStatus gControllerStatuses[4]; OSContPad gControllerPads[4]; u8 gControllerBits; +u8 gIsConsole; +u8 gBorderHeight; #ifdef EEP s8 gEepromProbe; #endif @@ -156,8 +158,8 @@ void init_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); } /** @@ -169,8 +171,8 @@ void select_frame_buffer(void) { gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalFrameBuffers[sRenderingFrameBuffer]); - 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); } /** @@ -185,8 +187,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++); @@ -232,13 +234,13 @@ void draw_screen_borders(void) { gDPSetFillColor(gDisplayListHead++, GPACK_RGBA5551(0, 0, 0, 0) << 16 | GPACK_RGBA5551(0, 0, 0, 0)); -#if BORDER_HEIGHT != 0 - gDPFillRectangle(gDisplayListHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), 0, - GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, BORDER_HEIGHT - 1); - gDPFillRectangle(gDisplayListHead++, - GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), SCREEN_HEIGHT - BORDER_HEIGHT, - GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - 1); -#endif + if (gBorderHeight) { + gDPFillRectangle(gDisplayListHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), 0, + GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, gBorderHeight - 1); + gDPFillRectangle(gDisplayListHead++, + GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), SCREEN_HEIGHT - gBorderHeight, + GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - 1); + } } /** @@ -359,6 +361,13 @@ void draw_reset_bars(void) { * Initial settings for the first rendered frame. */ void render_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); gGfxSPTask = &gGfxPool->spTask; diff --git a/src/game/game_init.h b/src/game/game_init.h index 181fc9198..4ee5e5774 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -41,6 +41,8 @@ extern Gfx *gDisplayListHead; extern u8 *gGfxPoolEnd; extern struct GfxPool *gGfxPool; extern u8 gControllerBits; +extern u8 gIsConsole; +extern u8 gBorderHeight; #ifdef EEP extern s8 gEepromProbe; #endif diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index 6bf16738c..824d8f5ef 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -1828,15 +1828,7 @@ void render_dialog_entries(void) { if (gLastDialogPageStrPos == -1 && gLastDialogResponse == 1) { render_dialog_triangle_choice(); } - #ifdef VERSION_EU - #undef BORDER_HEIGHT - #define BORDER_HEIGHT 8 - #endif - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 2, 2, SCREEN_WIDTH - BORDER_HEIGHT/2, SCREEN_HEIGHT - BORDER_HEIGHT/2); - #ifdef VERSION_EU - #undef BORDER_HEIGHT - #define BORDER_HEIGHT 1 - #endif + 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 58238e83f..9cdab49b0 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -521,8 +521,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++);