This commit is contained in:
CrashOveride95
2021-07-13 11:43:59 -04:00
8 changed files with 44 additions and 49 deletions

View File

@@ -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.

View File

@@ -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(),
};

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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++);