From 55ab679a81a0f4155fb5ef3aad52e967ad25a76c Mon Sep 17 00:00:00 2001 From: "Jonathan G." Date: Sun, 19 May 2024 23:50:58 -0700 Subject: [PATCH 1/6] port: give Cloaking Device at respawn if cheat is active --- src/game/player.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/game/player.c b/src/game/player.c index ddb73c726..ae75a636c 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -1100,6 +1100,15 @@ void playerSpawn(void) } } else { #ifndef PLATFORM_N64 + if (cheatIsActive(CHEAT_CLOAKINGDEVICE)) { + invGiveSingleWeapon(WEAPON_CLOAKINGDEVICE); +#if VERSION >= VERSION_PAL_FINAL + bgunSetAmmoQuantity(AMMOTYPE_CLOAK, TICKS(7200)); +#else + bgunSetAmmoQuantity(AMMOTYPE_CLOAK, 7200); +#endif + } + if (cheatIsActive(CHEAT_PERFECTDARKNESS)) { invGiveSingleWeapon(WEAPON_NIGHTVISION); } From 07e6fdc1e0acc38b0b50a41a42bcb50226463585 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Fri, 31 May 2024 10:54:33 +0200 Subject: [PATCH 2/6] port: add mouse lock mode option --- port/include/input.h | 18 ++++++++++-- port/src/input.c | 64 +++++++++++++++++++++++++++++++++++------- port/src/optionsmenu.c | 27 ++++++++++++------ src/game/menu.c | 8 ++---- src/game/menustop.c | 4 +-- 5 files changed, 91 insertions(+), 30 deletions(-) diff --git a/port/include/input.h b/port/include/input.h index d09e1dbdf..b0a38298f 100644 --- a/port/include/input.h +++ b/port/include/input.h @@ -81,6 +81,12 @@ enum contkey { CK_TOTAL_COUNT }; +enum mouselockmode { + MLOCK_OFF = 0, + MLOCK_ON = 1, + MLOCK_AUTO = 2 +}; + // returns bitmask of connected controllers or -1 if failed s32 inputInit(void); @@ -201,8 +207,14 @@ void inputSetDefaultKeyBinds(s32 cidx, s32 n64mode); void inputClearLastKey(void); s32 inputGetLastKey(void); -// get/set Input.MouseDefaultLocked -s32 inputGetMouseDefaultLocked(void); -void inputSetMouseDefaultLocked(s32 defaultLocked); +// get/set Input.MouseLockMode +s32 inputGetMouseLockMode(void); +void inputSetMouseLockMode(s32 lockmode); + +// same as inputLockMouse but works only if mouse is enabled and lockmode == MLOCK_AUTO +s32 inputAutoLockMouse(s32 wantlock); + +// show/hide mouse cursor; if mouse lock is on the cursor is always hidden +void inputMouseShowCursor(s32 show); #endif diff --git a/port/src/input.c b/port/src/input.c index bf0ab413e..13f192b42 100644 --- a/port/src/input.c +++ b/port/src/input.c @@ -28,6 +28,9 @@ #define WHEEL_UP_MASK SDL_BUTTON(VK_MOUSE_WHEEL_UP - VK_MOUSE_BEGIN + 1) #define WHEEL_DN_MASK SDL_BUTTON(VK_MOUSE_WHEEL_DN - VK_MOUSE_BEGIN + 1) +#define CURSOR_HIDE_THRESHOLD 1 +#define CURSOR_HIDE_TIME 3000000 // us + static SDL_GameController *pads[INPUT_MAX_CONTROLLERS]; #define CONTROLLERCFG_DEFAULT { \ @@ -70,13 +73,16 @@ static s32 connectedMask = 0; static s32 numJoysticks = 0; static s32 mouseEnabled = 1; -static s32 mouseLocked = 0; -static s32 mouseDefaultLocked = 0; static s32 mouseX, mouseY; static s32 mouseDX, mouseDY; static u32 mouseButtons; static s32 mouseWheel = 0; +static s32 mouseLocked = 0; +static s32 mouseLockMode = MLOCK_AUTO; +static u64 mouseCursorTime = 0; +static s32 mouseShowCursor = 1; + static f32 mouseSensX = 1.5f; static f32 mouseSensY = 1.5f; @@ -672,7 +678,9 @@ s32 inputInit(void) inputSetDefaultKeyBinds(i, 0); } - inputLockMouse(mouseDefaultLocked); + if (mouseLockMode != MLOCK_AUTO) { + inputLockMouse(mouseLockMode); + } // update the axis maps // NOTE: by default sticks get swapped for 1.2: "right stick" here means left stick on your controller @@ -803,6 +811,20 @@ static inline void inputUpdateMouse(void) mouseX = mx; mouseY = my; + + // if MLOCK_AUTO is enabled, disable cursor if mouse is unlocked + // and we haven't moved it for a few seconds + if (mouseLockMode == MLOCK_AUTO && !mouseLocked) { + if (abs(mouseDX) > CURSOR_HIDE_THRESHOLD || abs(mouseDY) > CURSOR_HIDE_THRESHOLD) { + if (!mouseShowCursor) { + inputMouseShowCursor(1); + } + } else if (sysGetMicroseconds() > mouseCursorTime) { + if (mouseShowCursor) { + inputMouseShowCursor(0); + } + } + } } void inputUpdate(void) @@ -1171,20 +1193,42 @@ s32 inputMouseIsEnabled(void) void inputMouseEnable(s32 enabled) { mouseEnabled = !!enabled; - if (!mouseEnabled && mouseLocked) { + if (!mouseEnabled && mouseLockMode != MLOCK_ON && mouseLocked) { inputLockMouse(0); } } -s32 inputGetMouseDefaultLocked(void) +s32 inputAutoLockMouse(s32 wantlock) { - return mouseDefaultLocked; + if (mouseEnabled && mouseLockMode == MLOCK_AUTO) { + inputLockMouse(wantlock); + return 1; + } + return 0; } -void inputSetMouseDefaultLocked(s32 defaultLocked) +void inputMouseShowCursor(s32 show) { - mouseDefaultLocked = !!defaultLocked; - inputLockMouse(mouseDefaultLocked); + mouseShowCursor = !!show; + SDL_ShowCursor(mouseShowCursor); + if (show) { + mouseCursorTime = sysGetMicroseconds() + CURSOR_HIDE_TIME; + } +} + +s32 inputGetMouseLockMode(void) +{ + return mouseLockMode; +} + +void inputSetMouseLockMode(s32 lockmode) +{ + mouseLockMode = lockmode; + if (lockmode == MLOCK_ON) { + inputLockMouse(1); + } else { + inputLockMouse(0); + } } const char *inputGetContKeyName(u32 ck) @@ -1264,7 +1308,7 @@ s32 inputGetLastKey(void) PD_CONSTRUCTOR static void inputConfigInit(void) { configRegisterInt("Input.MouseEnabled", &mouseEnabled, 0, 1); - configRegisterInt("Input.MouseDefaultLocked", &mouseDefaultLocked, 0, 1); + configRegisterInt("Input.MouseLockMode", &mouseLockMode, MLOCK_OFF, MLOCK_AUTO); configRegisterFloat("Input.MouseSpeedX", &mouseSensX, -10.f, 10.f); configRegisterFloat("Input.MouseSpeedY", &mouseSensY, -10.f, 10.f); configRegisterInt("Input.FakeGamepads", &fakeControllers, 0, 4); diff --git a/port/src/optionsmenu.c b/port/src/optionsmenu.c index 92908711d..c3f2ae048 100644 --- a/port/src/optionsmenu.c +++ b/port/src/optionsmenu.c @@ -119,14 +119,25 @@ static MenuItemHandlerResult menuhandlerMouseAimLock(s32 operation, struct menui return 0; } -static MenuItemHandlerResult menuhandlerMouseDefaultLocked(s32 operation, struct menuitem *item, union handlerdata *data) +static MenuItemHandlerResult menuhandlerMouseLockMode(s32 operation, struct menuitem *item, union handlerdata *data) { + static const char *opts[] = { + "Always Off", + "Always On", + "Auto" + }; + switch (operation) { - case MENUOP_GET: - return inputGetMouseDefaultLocked(); - case MENUOP_SET: - inputSetMouseDefaultLocked(data->checkbox.value); + case MENUOP_GETOPTIONCOUNT: + data->dropdown.value = ARRAYCOUNT(opts); break; + case MENUOP_GETOPTIONTEXT: + return (intptr_t)opts[data->dropdown.value]; + case MENUOP_SET: + inputSetMouseLockMode(data->checkbox.value); + break; + case MENUOP_GETSELECTEDINDEX: + data->dropdown.value = inputGetMouseLockMode(); } return 0; @@ -274,12 +285,12 @@ struct menuitem g_ExtendedMouseMenuItems[] = { menuhandlerMouseAimLock, }, { - MENUITEMTYPE_CHECKBOX, + MENUITEMTYPE_DROPDOWN, 0, MENUITEMFLAG_LITERAL_TEXT, - (uintptr_t)"Grab Mouse Input by Default", + (uintptr_t)"Mouse Lock Mode", 0, - menuhandlerMouseDefaultLocked, + menuhandlerMouseLockMode, }, { MENUITEMTYPE_CHECKBOX, diff --git a/src/game/menu.c b/src/game/menu.c index db2a30001..26c839f0a 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -3473,9 +3473,7 @@ void menuClose(void) g_Menus[g_MpPlayerNum].openinhibit = 10; #ifndef PLATFORM_N64 - if (inputMouseIsEnabled()) { - inputLockMouse(true); - } + inputAutoLockMouse(true); #endif if (g_MenuData.root == MENUROOT_MPPAUSE) { @@ -3589,9 +3587,7 @@ void menuPushRootDialog(struct menudialogdef *dialogdef, s32 root) g_PlayersWithControl[g_Menus[g_MpPlayerNum].playernum] = false; #ifndef PLATFORM_N64 - if (inputMouseIsEnabled()) { - inputLockMouse(false); - } + inputAutoLockMouse(false); #endif func0f0f1494(); diff --git a/src/game/menustop.c b/src/game/menustop.c index d86344a46..35b39372b 100644 --- a/src/game/menustop.c +++ b/src/game/menustop.c @@ -33,9 +33,7 @@ void menuStop(void) { #ifndef PLATFORM_N64 - if (inputMouseIsEnabled()) { - inputLockMouse(true); - } + inputAutoLockMouse(true); #endif if (var80062944) { From b523b1e076158223ff5f07a843522a7898eabb91 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Fri, 31 May 2024 11:23:48 +0200 Subject: [PATCH 3/6] port: fix mouse controls in combat sim keyboard --- src/game/menuitem.c | 27 ++++++++++++++++++++++++++- src/include/game/menuitem.h | 4 ++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/game/menuitem.c b/src/game/menuitem.c index 27e1f0353..f06218f30 100644 --- a/src/game/menuitem.c +++ b/src/game/menuitem.c @@ -1372,7 +1372,7 @@ bool menuitemKeyboardTick(struct menuitem *item, struct menuinputs *inputs, u32 if (dialog && g_MenuUsingMouse && !inputs->leftright && !inputs->updown) { const s32 dleft = dialog->x + 4; const s32 dright = dleft + 12 * 10; - const s32 dtop = dialog->y + 13 + 12; + const s32 dtop = menuitemGetTop(item, dialog) + 12; const s32 dbottom = dtop + 11 * 5; const s32 mx = inputs->mousex; const s32 my = inputs->mousey; @@ -4514,3 +4514,28 @@ Gfx *menuitemOverlay(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2, struct menuitem *it return gdl; } + +#ifndef PLATFORM_N64 + +s32 menuitemGetTop(struct menuitem *item, struct menudialog *dialog) +{ + struct menu *menu = &g_Menus[g_MpPlayerNum]; + s32 dtop = dialog->y + LINEHEIGHT + 1; + + for (s32 i = 0; i < dialog->numcols; ++i) { + const s32 colindex = i + dialog->colstart; + + for (s32 j = 0; j < menu->cols[colindex].numrows; ++j) { + const s32 rowindex = j + menu->cols[colindex].rowstart; + struct menuitem *pitem = &dialog->definition->items[menu->rows[rowindex].itemindex]; + if (pitem == item) { + return dtop; + } + dtop += menu->rows[rowindex].height; + } + } + + return dtop; +} + +#endif diff --git a/src/include/game/menuitem.h b/src/include/game/menuitem.h index 79b868989..95a7f9970 100644 --- a/src/include/game/menuitem.h +++ b/src/include/game/menuitem.h @@ -83,4 +83,8 @@ bool menuitemTick(struct menuitem *item, struct menudialog *dialog, struct menui void menuitemInit(struct menuitem *item, union menuitemdata *data); Gfx *menuitemOverlay(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2, struct menuitem *item, struct menudialog *dialog, union menuitemdata *data); +#ifndef PLATFORM_N64 +s32 menuitemGetTop(struct menuitem *item, struct menudialog *dialog); +#endif + #endif From b6b7133e7631c2b6e7e4730a02f032ca8dbcfeb7 Mon Sep 17 00:00:00 2001 From: Jonaeru Date: Mon, 22 Jul 2024 22:44:00 +0900 Subject: [PATCH 4/6] port: add no radar on player mp option --- src/game/mplayer/scenarios/capturethecase.inc | 8 ++++++++ src/game/mplayer/scenarios/combat.inc | 8 ++++++++ src/game/mplayer/scenarios/hackthatmac.inc | 8 ++++++++ src/game/mplayer/scenarios/holdthebriefcase.inc | 8 ++++++++ src/game/mplayer/scenarios/kingofthehill.inc | 8 ++++++++ src/game/mplayer/scenarios/popacap.inc | 8 ++++++++ src/game/radar.c | 10 ++++++++++ src/include/constants.h | 1 + 8 files changed, 59 insertions(+) diff --git a/src/game/mplayer/scenarios/capturethecase.inc b/src/game/mplayer/scenarios/capturethecase.inc index fa6d4946c..5a843bdd6 100644 --- a/src/game/mplayer/scenarios/capturethecase.inc +++ b/src/game/mplayer/scenarios/capturethecase.inc @@ -85,6 +85,14 @@ struct menuitem g_CtcOptionsMenuItems[] = { MPOPTION_FRIENDLYFIRE, menuhandlerMpDisplayTeam, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"No Player on Radar", + MPOPTION_NOPLAYERONRADAR, + menuhandlerMpCheckboxOption, + }, #endif { MENUITEMTYPE_CHECKBOX, diff --git a/src/game/mplayer/scenarios/combat.inc b/src/game/mplayer/scenarios/combat.inc index 5052aea0c..2f398579e 100644 --- a/src/game/mplayer/scenarios/combat.inc +++ b/src/game/mplayer/scenarios/combat.inc @@ -80,6 +80,14 @@ struct menuitem g_MpCombatOptionsMenuItems[] = { MPOPTION_FRIENDLYFIRE, menuhandlerMpDisplayTeam, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"No Player on Radar", + MPOPTION_NOPLAYERONRADAR, + menuhandlerMpCheckboxOption, + }, #endif { MENUITEMTYPE_SEPARATOR, diff --git a/src/game/mplayer/scenarios/hackthatmac.inc b/src/game/mplayer/scenarios/hackthatmac.inc index 32a0a265a..1b5bb5310 100644 --- a/src/game/mplayer/scenarios/hackthatmac.inc +++ b/src/game/mplayer/scenarios/hackthatmac.inc @@ -83,6 +83,14 @@ struct menuitem g_HtmOptionsMenuItems[] = { MPOPTION_FRIENDLYFIRE, menuhandlerMpDisplayTeam, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"No Player on Radar", + MPOPTION_NOPLAYERONRADAR, + menuhandlerMpCheckboxOption, + }, #endif { MENUITEMTYPE_CHECKBOX, diff --git a/src/game/mplayer/scenarios/holdthebriefcase.inc b/src/game/mplayer/scenarios/holdthebriefcase.inc index d0e36e7d0..65d21e42b 100644 --- a/src/game/mplayer/scenarios/holdthebriefcase.inc +++ b/src/game/mplayer/scenarios/holdthebriefcase.inc @@ -83,6 +83,14 @@ struct menuitem g_HtbOptionsMenuItems[] = { MPOPTION_FRIENDLYFIRE, menuhandlerMpDisplayTeam, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"No Player on Radar", + MPOPTION_NOPLAYERONRADAR, + menuhandlerMpCheckboxOption, + }, #endif { MENUITEMTYPE_CHECKBOX, diff --git a/src/game/mplayer/scenarios/kingofthehill.inc b/src/game/mplayer/scenarios/kingofthehill.inc index 41810b9a6..53e72a358 100644 --- a/src/game/mplayer/scenarios/kingofthehill.inc +++ b/src/game/mplayer/scenarios/kingofthehill.inc @@ -104,6 +104,14 @@ struct menuitem g_KohOptionsMenuItems[] = { MPOPTION_FRIENDLYFIRE, menuhandlerMpDisplayTeam, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"No Player on Radar", + MPOPTION_NOPLAYERONRADAR, + menuhandlerMpCheckboxOption, + }, #endif { MENUITEMTYPE_CHECKBOX, diff --git a/src/game/mplayer/scenarios/popacap.inc b/src/game/mplayer/scenarios/popacap.inc index b667ad269..ca9d5060d 100644 --- a/src/game/mplayer/scenarios/popacap.inc +++ b/src/game/mplayer/scenarios/popacap.inc @@ -81,6 +81,14 @@ struct menuitem g_PacOptionsMenuItems[] = { MPOPTION_FRIENDLYFIRE, menuhandlerMpDisplayTeam, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LOCKABLEMINOR | MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"No Player on Radar", + MPOPTION_NOPLAYERONRADAR, + menuhandlerMpCheckboxOption, + }, #endif { MENUITEMTYPE_CHECKBOX, diff --git a/src/game/radar.c b/src/game/radar.c index a98ae6764..2a449e034 100644 --- a/src/game/radar.c +++ b/src/game/radar.c @@ -336,6 +336,9 @@ Gfx *radarRender(Gfx *gdl) gdl = func0f153134(gdl); // Draw dots for human players +#ifndef PLATFORM_N64 + if (!(g_MpSetup.options & MPOPTION_NOPLAYERONRADAR)) { +#endif for (i = 0; i < playercount; i++) { if (i != playernum) { if (g_Vars.players[i]->isdead == false @@ -356,6 +359,9 @@ Gfx *radarRender(Gfx *gdl) } } } +#ifndef PLATFORM_N64 + } +#endif // Draw dots for coop AI buddies if (!g_Vars.normmplayerisrunning && g_MissionConfig.iscoop) { @@ -377,7 +383,11 @@ Gfx *radarRender(Gfx *gdl) } // Draw dots for MP simulants +#ifdef PLATFORM_N64 if (g_Vars.normmplayerisrunning) { +#else + if (g_Vars.normmplayerisrunning && !(g_MpSetup.options & MPOPTION_NOPLAYERONRADAR)) { +#endif for (i = 0; i < g_BotCount; i++) { if (!chrIsDead(g_MpBotChrPtrs[i]) && (g_MpBotChrPtrs[i]->hidden & CHRHFLAG_CLOAKED) == 0 diff --git a/src/include/constants.h b/src/include/constants.h index 09152e169..093007f81 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2895,6 +2895,7 @@ #define MPOPTION_AUTORANDOMWEAPON_START 0x00800000 #define MPOPTION_AUTORANDOMWEAPON_END 0x01000000 #define MPOPTION_FRIENDLYFIRE 0x02000000 +#define MPOPTION_NOPLAYERONRADAR 0x04000000 #define MPPAUSEMODE_UNPAUSED 0 #define MPPAUSEMODE_PAUSED 1 From b9f6961931b4b676996f2e87bc8524a8bc487611 Mon Sep 17 00:00:00 2001 From: MaikelChan Date: Sun, 4 Aug 2024 05:28:10 +0200 Subject: [PATCH 5/6] Depth compare improvements based on GlideN64. --- port/fast3d/gfx_opengl.cpp | 53 ++++++++++++++++++++++----------- port/fast3d/gfx_pc.cpp | 25 +++++++--------- port/fast3d/gfx_rendering_api.h | 3 +- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/port/fast3d/gfx_opengl.cpp b/port/fast3d/gfx_opengl.cpp index f486628a5..0a0107755 100644 --- a/port/fast3d/gfx_opengl.cpp +++ b/port/fast3d/gfx_opengl.cpp @@ -699,12 +699,42 @@ static void gfx_opengl_set_sampler_parameters(int tile, bool linear_filter, uint glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gfx_cm_to_opengl(cmt)); } -static void gfx_opengl_set_depth_test_and_mask(bool depth_test, bool z_upd) { - if (depth_test || z_upd) { +static void gfx_opengl_set_depth_mode(bool depth_test, bool depth_update, bool depth_compare, bool depth_source_prim, uint16_t zmode) { + if (depth_test) { glEnable(GL_DEPTH_TEST); - glDepthMask(z_upd ? GL_TRUE : GL_FALSE); - glDepthFunc(depth_test ? GL_LEQUAL : GL_ALWAYS); - current_depth_mask = z_upd; + glDepthMask(depth_update ? GL_TRUE : GL_FALSE); + current_depth_mask = depth_update; + + if (depth_compare) { + switch (zmode) { + case ZMODE_INTER: + glDepthFunc(GL_LEQUAL); + glDisable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0, 0); + break; + + case ZMODE_OPA: + case ZMODE_XLU: + if (depth_source_prim) { + glDepthFunc(GL_LEQUAL); + } else { + glDepthFunc(GL_LESS); + } + glDisable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0, 0); + break; + + case ZMODE_DEC: + glDepthFunc(GL_LEQUAL); + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(-2, -2); + break; + } + } else { + glDepthFunc(GL_ALWAYS); + glDisable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0, 0); + } } else { glDisable(GL_DEPTH_TEST); } @@ -714,16 +744,6 @@ static void gfx_opengl_set_depth_range(float znear, float zfar) { glDepthRange(znear, zfar); } -static void gfx_opengl_set_zmode_decal(bool zmode_decal) { - if (zmode_decal) { - glPolygonOffset(-2, -2); - glEnable(GL_POLYGON_OFFSET_FILL); - } else { - glPolygonOffset(0, 0); - glDisable(GL_POLYGON_OFFSET_FILL); - } -} - static void gfx_opengl_set_viewport(int x, int y, int width, int height) { glViewport(x, y, width, height); } @@ -1156,9 +1176,8 @@ struct GfxRenderingAPI gfx_opengl_api = { gfx_opengl_select_texture, gfx_opengl_upload_texture, gfx_opengl_set_sampler_parameters, - gfx_opengl_set_depth_test_and_mask, + gfx_opengl_set_depth_mode, gfx_opengl_set_depth_range, - gfx_opengl_set_zmode_decal, gfx_opengl_set_viewport, gfx_opengl_set_scissor, gfx_opengl_set_use_alpha, diff --git a/port/fast3d/gfx_pc.cpp b/port/fast3d/gfx_pc.cpp index 7938fdd77..6e7f6257e 100644 --- a/port/fast3d/gfx_pc.cpp +++ b/port/fast3d/gfx_pc.cpp @@ -197,9 +197,8 @@ static struct RDP { } rdp; static struct RenderingState { - uint8_t depth_test_and_mask; // 1: depth test, 2: depth mask + uint8_t depth_mode; float depth_zfar; - bool decal_mode; bool alpha_blend; bool modulate; struct XYWidthHeight viewport, scissor; @@ -1240,25 +1239,23 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo } } - bool depth_test = (rsp.geometry_mode & G_ZBUFFER) == G_ZBUFFER; - bool depth_mask = (rdp.other_mode_l & Z_UPD) == Z_UPD; - uint8_t depth_test_and_mask = (depth_test ? 1 : 0) | (depth_mask ? 2 : 0); - if (depth_test_and_mask != rendering_state.depth_test_and_mask) { - gfx_flush(); - gfx_rapi->set_depth_test_and_mask(depth_test, depth_mask); - rendering_state.depth_test_and_mask = depth_test_and_mask; - } if (rsp.depth_zfar != rendering_state.depth_zfar) { gfx_flush(); gfx_rapi->set_depth_range(0.0f, rsp.depth_zfar); rendering_state.depth_zfar = rsp.depth_zfar; } - bool zmode_decal = (rdp.other_mode_l & ZMODE_DEC) == ZMODE_DEC; - if (zmode_decal != rendering_state.decal_mode) { + bool depth_test = (rsp.geometry_mode & G_ZBUFFER) == G_ZBUFFER; + bool depth_update = (rdp.other_mode_l & Z_UPD) == Z_UPD; + bool depth_compare = (rdp.other_mode_l & Z_CMP) == Z_CMP; + bool depth_source_prim = (rdp.other_mode_l & G_ZS_PRIM) == G_ZS_PRIM /* && gDP.primDepth.z == 1.0f */; + uint16_t zmode = rdp.other_mode_l & ZMODE_DEC; + uint8_t depth_mode = (depth_test ? 1 : 0) | (depth_update ? 2 : 0) | (depth_compare ? 4 : 0) | (depth_source_prim ? 8 : 0) | (zmode >> 6); + + if (depth_mode != rendering_state.depth_mode) { gfx_flush(); - gfx_rapi->set_zmode_decal(zmode_decal); - rendering_state.decal_mode = zmode_decal; + gfx_rapi->set_depth_mode(depth_test, depth_update, depth_compare, depth_source_prim, zmode); + rendering_state.depth_mode = depth_mode; } if (rdp.viewport_or_scissor_changed) { diff --git a/port/fast3d/gfx_rendering_api.h b/port/fast3d/gfx_rendering_api.h index b31aa4ba7..fcc287665 100644 --- a/port/fast3d/gfx_rendering_api.h +++ b/port/fast3d/gfx_rendering_api.h @@ -27,9 +27,8 @@ struct GfxRenderingAPI { void (*select_texture)(int tile, uint32_t texture_id); void (*upload_texture)(const uint8_t* rgba32_buf, uint32_t width, uint32_t height); void (*set_sampler_parameters)(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt); - void (*set_depth_test_and_mask)(bool depth_test, bool z_upd); + void (*set_depth_mode)(bool depth_test, bool depth_update, bool depth_compare, bool depth_source_prim, uint16_t zmode); void (*set_depth_range)(float znear, float zfar); - void (*set_zmode_decal)(bool zmode_decal); void (*set_viewport)(int x, int y, int width, int height); void (*set_scissor)(int x, int y, int width, int height); void (*set_use_alpha)(bool use_alpha, bool modulate); From 29d6392514b195e6e9ad88c5942d8afdd93480d2 Mon Sep 17 00:00:00 2001 From: MaikelChan Date: Sun, 4 Aug 2024 06:11:50 +0200 Subject: [PATCH 6/6] Forgot some extra checks. --- port/fast3d/gfx_pc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/port/fast3d/gfx_pc.cpp b/port/fast3d/gfx_pc.cpp index 6e7f6257e..07e916aeb 100644 --- a/port/fast3d/gfx_pc.cpp +++ b/port/fast3d/gfx_pc.cpp @@ -1245,7 +1245,8 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo rendering_state.depth_zfar = rsp.depth_zfar; } - bool depth_test = (rsp.geometry_mode & G_ZBUFFER) == G_ZBUFFER; + bool depth_test = ((rsp.geometry_mode & G_ZBUFFER) == G_ZBUFFER || (rdp.other_mode_l & G_ZS_PRIM) == G_ZS_PRIM) && + ((rdp.other_mode_h & G_CYC_1CYCLE) == G_CYC_1CYCLE || (rdp.other_mode_h & G_CYC_2CYCLE) == G_CYC_2CYCLE); bool depth_update = (rdp.other_mode_l & Z_UPD) == Z_UPD; bool depth_compare = (rdp.other_mode_l & Z_CMP) == Z_CMP; bool depth_source_prim = (rdp.other_mode_l & G_ZS_PRIM) == G_ZS_PRIM /* && gDP.primDepth.z == 1.0f */;