From 2b8d5d4f755475b0cb9ab5a48a6250fd0f33f4f9 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sat, 2 Dec 2023 13:48:24 +0100 Subject: [PATCH] port: fix crosshair aspect and make sights centered 4:3 --- src/game/sight.c | 86 ++++++++++++++++++++++++++++++++++++++++++++-- src/include/math.h | 3 ++ 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/game/sight.c b/src/game/sight.c index 485bc7a5b..86b15fb71 100644 --- a/src/game/sight.c +++ b/src/game/sight.c @@ -19,6 +19,27 @@ #include "lib/snd.h" #include "data.h" #include "types.h" +#ifndef PLATFORM_N64 +#include +#include "video.h" + +static inline f32 sightGetScaleX(void) +{ + return (videoGetAspect() / (4.f / 3.f)); +} + +static inline s32 sightGetAdjustedX(const f32 x) +{ + const f32 cx = (x - (f32)(SCREEN_WIDTH_LO / 2)) * sightGetScaleX(); + return roundf((f32)(SCREEN_WIDTH_LO / 2) + cx); +} + +#else + +#define sightGetScaleX() 1.f +#define sightGetAdjustedX(x) (x) + +#endif /** * Return true if the prop is considered friendly (blue sight). @@ -440,6 +461,11 @@ Gfx *sightDrawAimer(Gfx *gdl, s32 x, s32 y, s32 radius, s32 cornergap, u32 colou gdl = textSetPrimColour(gdl, 0x00ff0028); +#ifndef PLATFORM_N64 + x = sightGetAdjustedX(x); + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + // Draw the lines that span most of the viewport if (PLAYERCOUNT() == 1) { gDPHudRectangle(gdl++, viewleft + 48, y, x - radius + 2, y); @@ -472,6 +498,10 @@ Gfx *sightDrawAimer(Gfx *gdl, s32 x, s32 y, s32 radius, s32 cornergap, u32 colou gDPHudRectangle(gdl++, x - radius, y + radius, x - cornergap, y + radius); gDPHudRectangle(gdl++, x + cornergap, y + radius, x + radius, y + radius); +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + gdl = text0f153838(gdl); return gdl; @@ -506,6 +536,11 @@ Gfx *sightDrawDelayedAimer(Gfx *gdl, s32 x, s32 y, s32 radius, s32 cornergap, u3 static f32 xspeed = 0; static f32 yspeed = 0; +#ifndef PLATFORM_N64 + x = sightGetAdjustedX(x); + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + for (i = 0; i < g_Vars.lvupdate60; i++) { dist = x - xpos; @@ -613,6 +648,10 @@ Gfx *sightDrawDelayedAimer(Gfx *gdl, s32 x, s32 y, s32 radius, s32 cornergap, u3 gdl = text0f153838(gdl); +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + return gdl; } @@ -817,7 +856,7 @@ Gfx *sightDrawClassic(Gfx *gdl, bool sighton) struct textureconfig *tconfig = &g_TexGeCrosshairConfigs[0]; f32 spc4[2]; f32 spbc[2]; - s32 x = g_Vars.currentplayer->crosspos[0]; + s32 x = sightGetAdjustedX(g_Vars.currentplayer->crosspos[0]); s32 y = g_Vars.currentplayer->crosspos[1]; s32 x1; s32 x2; @@ -828,6 +867,10 @@ Gfx *sightDrawClassic(Gfx *gdl, bool sighton) return gdl; } +#ifndef PLATFORM_N64 + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + gDPSetColorDither(gdl++, G_CD_DISABLE); gDPSetTexturePersp(gdl++, G_TP_NONE); gDPSetAlphaCompare(gdl++, G_AC_NONE); @@ -868,6 +911,10 @@ Gfx *sightDrawClassic(Gfx *gdl, bool sighton) gDPSetTextureConvert(gdl++, G_TC_FILT); gDPSetTextureLUT(gdl++, G_TT_NONE); +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + return gdl; } @@ -992,6 +1039,11 @@ Gfx *sightDrawSkedar(Gfx *gdl, bool sighton) g_Vars.currentplayer->sighttimer240 = 0; } +#ifndef PLATFORM_N64 + x = sightGetAdjustedX(x); + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + gdl = func0f0d479c(gdl); gSPClearGeometryMode(gdl++, G_CULL_BOTH); @@ -1144,6 +1196,10 @@ Gfx *sightDrawSkedar(Gfx *gdl, bool sighton) gdl = func0f0d49c8(gdl); +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + return gdl; } @@ -1240,6 +1296,10 @@ Gfx *sightDrawZoom(Gfx *gdl, bool sighton) cornerheight = BOXBOTTOM - BOXTOP; } +#ifndef PLATFORM_N64 + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + // Top left gDPHudRectangle(gdl++, BOXLEFT + 1, BOXTOP, BOXLEFT + cornerwidth - 1, BOXTOP); gDPHudRectangle(gdl++, BOXLEFT, BOXTOP, BOXLEFT, BOXTOP + cornerheight - 1); @@ -1276,6 +1336,11 @@ Gfx *sightDrawZoom(Gfx *gdl, bool sighton) gDPHudRectangle(gdl++, BOXRIGHT - cornerwidth, BOXBOTTOM, BOXRIGHT, BOXBOTTOM); gDPHudRectangle(gdl++, BOXRIGHT, BOXBOTTOM - cornerheight, BOXRIGHT, BOXBOTTOM); + +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + gdl = text0f153838(gdl); gdl = text0f153780(gdl); } @@ -1309,6 +1374,11 @@ Gfx *sightDrawMaian(Gfx *gdl, bool sighton) colour = 0x0000ff60; } +#ifndef PLATFORM_N64 + x = sightGetAdjustedX(x); + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + vertices = gfxAllocateVertices(8); colours = gfxAllocateColours(2); gdl = func0f0d479c(gdl); @@ -1379,12 +1449,16 @@ Gfx *sightDrawMaian(Gfx *gdl, bool sighton) gdl = text0f153838(gdl); +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + return gdl; } Gfx *sightDrawTarget(Gfx *gdl) { - s32 x = (s32)g_Vars.currentplayer->crosspos[0] / g_ScaleX; + s32 x = sightGetAdjustedX((s32)g_Vars.currentplayer->crosspos[0] / g_ScaleX); s32 y = g_Vars.currentplayer->crosspos[1]; static u32 var80070f9c = 0x00ff00ff; @@ -1395,6 +1469,10 @@ Gfx *sightDrawTarget(Gfx *gdl) gdl = textSetPrimColour(gdl, 0x00ff0028); +#ifndef PLATFORM_N64 + gSPSetExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + gDPHudRectangle(gdl++, x + 2, y + 0, x + 6, y + 0); gDPHudRectangle(gdl++, x + 2, y + 0, x + 4, y + 0); gDPHudRectangle(gdl++, x - 6, y + 0, x - 2, y + 0); @@ -1404,6 +1482,10 @@ Gfx *sightDrawTarget(Gfx *gdl) gDPHudRectangle(gdl++, x + 0, y - 6, x + 0, y - 2); gDPHudRectangle(gdl++, x + 0, y - 4, x + 0, y - 2); +#ifndef PLATFORM_N64 + gSPClearExtraGeometryModeEXT(gdl++, G_ASPECT_CENTER_EXT); +#endif + gdl = text0f153838(gdl); return gdl; diff --git a/src/include/math.h b/src/include/math.h index eb49a0c08..e60b0f6a2 100644 --- a/src/include/math.h +++ b/src/include/math.h @@ -5,6 +5,9 @@ #include_next #undef M_PI #undef M_TAU +// HACK: for some reason the #include_next above doesn't really do anything, so +float fabsf(float x); +float roundf(float x); #endif // @bug?