From 31bb7c62ad48cd2503a802f11861a8324e662c7a Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sun, 17 Sep 2023 23:53:12 +0200 Subject: [PATCH] port: add scanline effects for NV and IR goggles and slayer --- src/game/bondview.c | 70 ++++++++++++++++++++++++++++++++++++++- src/game/lv.c | 3 -- src/game/player.c | 22 ------------ src/include/game/player.h | 3 -- 4 files changed, 69 insertions(+), 29 deletions(-) diff --git a/src/game/bondview.c b/src/game/bondview.c index 461ebc79a..80c4dbeb4 100644 --- a/src/game/bondview.c +++ b/src/game/bondview.c @@ -363,6 +363,7 @@ Gfx *bviewDrawSlayerRocketInterlace(Gfx *gdl, u32 colour, u32 alpha) gdl = bviewPrepareStaticRgba16(gdl, colour, alpha); +#ifdef PLATFORM_N64 for (y = viewtop; y < viewtop + viewheight; y++) { s32 offsety = y - offset; @@ -378,6 +379,26 @@ Gfx *bviewDrawSlayerRocketInterlace(Gfx *gdl, u32 colour, u32 alpha) angle += increment; } +#else + gDPSetCombineMode(gdl++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gSPSetExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); + + for (y = viewtop; y < viewtop + viewheight; y++) { + s32 offsety = y - offset; + + if (offsety % 8 == 0 || y == viewtop) { + if (offsety % 16 < 8) { + gDPSetPrimColor(gdl++, 0, 0, 0xff, 0xff, 0x00, 0xff); + } else { + gDPSetPrimColor(gdl++, 0, 0, 0xff, 0xff, 0xbf, 0xff); + } + } + + gDPFillRectangle(gdl++, viewleft, y, viewleft + viewwidth, y + 1); + } + + gSPClearExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); +#endif return gdl; } @@ -429,7 +450,6 @@ Gfx *bviewDrawFilmInterlace(Gfx *gdl, u32 colour, u32 alpha) } #else gDPSetCombineMode(gdl++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); - gDPSetRenderMode(gdl++, G_RM_CLD_SURF, G_RM_CLD_SURF2); gSPSetExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); for (y = viewtop; y < viewtop + viewheight; y++) { @@ -2026,6 +2046,7 @@ Gfx *bviewDrawNvLens(Gfx *gdl) var8007f878++; +#ifdef PLATFORM_N64 for (y = viewtop; y < viewbottom; y++) { u8 green; @@ -2040,6 +2061,27 @@ Gfx *bviewDrawNvLens(Gfx *gdl) gdl = bviewCopyPixels(gdl, fb, y, 5, y, 1, viewleft, viewwidth); } +#else + gDPSetCombineMode(gdl++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gSPSetExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); + + for (y = viewtop; y < viewbottom; y++) { + u8 green; + + if (((var8007f878 & 1) != (y & 1)) != 0) { + u8 tmp = random() % 12; + green = 0xff - tmp; + } else { + green = 0x94; + } + + gDPSetPrimColorViaWord(gdl++, 0, 0, (green << 16) + 0xff); + + gDPFillRectangle(gdl++, viewleft, y, viewleft + viewwidth, y + 1); + } + + gSPClearExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); +#endif return gdl; } @@ -2189,6 +2231,11 @@ Gfx *bviewDrawIrLens(Gfx *gdl) sqinnerradius = innerradius * innerradius; +#ifndef PLATFORM_N64 + gDPSetCombineMode(gdl++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gSPSetExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); +#endif + for (i = scantop; i < scanbottom; i++) { #if VERSION >= VERSION_NTSC_1_0 if (i & 1) { @@ -2210,7 +2257,11 @@ Gfx *bviewDrawIrLens(Gfx *gdl) red = 255; } +#ifdef PLATFORM_N64 gDPSetEnvColorViaWord(gdl++, (red << 24) + 0xff); +#else + gDPSetPrimColorViaWord(gdl++, 0, 0, (red << 24) + 0xff); +#endif a0 = viewcentrey - i; @@ -2222,6 +2273,7 @@ Gfx *bviewDrawIrLens(Gfx *gdl) s32 semicircleright = viewcentrex + semicirclewidth; s32 rightsidewidth = viewwidth - semicircleright; +#ifdef PLATFORM_N64 // Left and right of semicircle gdl = bviewCopyPixels(gdl, fb, i, 5, i, 1.0f, viewleft, viewcentrex); gdl = bviewCopyPixels(gdl, fb, i, 5, i, 1.0f, semicircleright, rightsidewidth); @@ -2232,6 +2284,18 @@ Gfx *bviewDrawIrLens(Gfx *gdl) } else { gdl = bviewCopyPixels(gdl, fb, i, 5, i, 1.0f, viewleft, viewwidth); } +#else + // Left and right of semicircle + gDPFillRectangle(gdl++, viewleft, i, viewcentrex, i + 1); + gDPFillRectangle(gdl++, semicircleright, i, semicircleright + rightsidewidth, i + 1); + + // The semicircle itself has a static colour + gDPSetPrimColorViaWord(gdl++, 0, 0, 0xee0000ff); + gDPFillRectangle(gdl++, viewcentrex, i, viewcentrex + semicirclewidth, i + 1); + } else { + gDPFillRectangle(gdl++, viewleft, i, viewleft + viewwidth, i + 1); + } +#endif #if VERSION >= VERSION_NTSC_1_0 if (g_IrScanlines[g_Vars.currentplayernum][i] > fadeincrement) { @@ -2244,6 +2308,10 @@ Gfx *bviewDrawIrLens(Gfx *gdl) #endif } +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_MODULATE_EXT); +#endif + #ifdef AVOID_UB if (g_Menus[mpindex].curdialog == NULL) { gdl = bviewDrawMotionBlur(gdl, 0xff000000, 0x40); diff --git a/src/game/lv.c b/src/game/lv.c index 97b74e1de..d028c6d98 100644 --- a/src/game/lv.c +++ b/src/game/lv.c @@ -1185,9 +1185,6 @@ Gfx *lvRender(Gfx *gdl) } gdl = viRenderViewportEdges(gdl); -#ifndef PLATFORM_N64 - gdl = playerSetVisionMode(gdl); -#endif gdl = skyRender(gdl); bgTick(); lightsTick(); diff --git a/src/game/player.c b/src/game/player.c index fcda0a55c..83f57b06e 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -4517,28 +4517,6 @@ Gfx *playerRenderShield(Gfx *gdl) return gdl; } -#ifndef PLATFORM_N64 -Gfx *playerSetVisionMode(Gfx *gdl) -{ - u32 grayscale = G_OFF; - - if (!g_InCutscene && g_Vars.currentplayer && !g_Vars.currentplayer->isdead && - (!g_Vars.currentplayer->eyespy || (g_Vars.currentplayer->eyespy && !g_Vars.currentplayer->eyespy->active))) { - if ((g_Vars.currentplayer->devicesactive & ~g_Vars.currentplayer->devicesinhibit) & DEVICE_NIGHTVISION) { - grayscale = G_ON; - gDPSetGrayscaleColorEXT(gdl++, 0x00, 0xFF, 0x00, 0xFF); - } else if ((g_Vars.currentplayer->devicesactive & ~g_Vars.currentplayer->devicesinhibit) & DEVICE_IRSCANNER) { - grayscale = G_ON; - gDPSetGrayscaleColorEXT(gdl++, 0xFF, 0x00, 0x00, 0xFF); - } - } - - gDPGrayscaleEXT(gdl++, grayscale); - - return gdl; -} -#endif - Gfx *playerRenderHud(Gfx *gdl) { if (g_Vars.currentplayer->cameramode == CAMERAMODE_THIRDPERSON) { diff --git a/src/include/game/player.h b/src/include/game/player.h index deab58571..81840b813 100644 --- a/src/include/game/player.h +++ b/src/include/game/player.h @@ -106,8 +106,5 @@ void playerSetCamPropertiesWithRoom(struct coord *pos, struct coord *up, struct void playerSetCamPropertiesWithoutRoom(struct coord *pos, struct coord *up, struct coord *look, s32 room); void playerSetCamProperties(struct coord *pos, struct coord *up, struct coord *look, s32 room); void playerClearMemCamRoom(void); -#ifndef PLATFORM_N64 -Gfx *playerSetVisionMode(Gfx *gdl); -#endif #endif