From cfece2f55d1689e54bead397aeb8eceead5f43dd Mon Sep 17 00:00:00 2001 From: Feels Duck Man Date: Fri, 1 Mar 2024 14:05:36 -0600 Subject: [PATCH 1/6] Added a speedometer that displays the player's speed in QU/s. Wasn't quite sure how to implement it without adding GetPlayerSpeed() to pmove.c. Unsure if there is a cleaner way to do this while keeping it inside cl_screen.c --- src/client/cl_main.c | 2 ++ src/client/cl_screen.c | 29 +++++++++++++++++++++++++++++ src/common/pmove.c | 6 ++++++ 3 files changed, 37 insertions(+) diff --git a/src/client/cl_main.c b/src/client/cl_main.c index 99d8126b..4fe1f3f7 100644 --- a/src/client/cl_main.c +++ b/src/client/cl_main.c @@ -43,6 +43,7 @@ cvar_t *cl_footsteps; cvar_t *cl_timeout; cvar_t *cl_predict; cvar_t *cl_showfps; +cvar_t *cl_showspeed; cvar_t *cl_gun; cvar_t *cl_add_particles; cvar_t *cl_add_lights; @@ -513,6 +514,7 @@ CL_InitLocal(void) cl_noskins = Cvar_Get("cl_noskins", "0", 0); cl_predict = Cvar_Get("cl_predict", "1", 0); cl_showfps = Cvar_Get("cl_showfps", "0", CVAR_ARCHIVE); + cl_showspeed = Cvar_Get("cl_showspeed", "0", CVAR_ARCHIVE); cl_upspeed = Cvar_Get("cl_upspeed", "200", 0); cl_forwardspeed = Cvar_Get("cl_forwardspeed", "200", 0); diff --git a/src/client/cl_screen.c b/src/client/cl_screen.c index 81cc9efe..45f97fec 100644 --- a/src/client/cl_screen.c +++ b/src/client/cl_screen.c @@ -66,6 +66,8 @@ int crosshair_width, crosshair_height; extern cvar_t *cl_showfps; extern cvar_t *crosshair_scale; +extern cvar_t *cl_showspeed; +extern float GetPlayerSpeed(); void SCR_TimeRefresh_f(void); void SCR_Loading_f(void); @@ -1447,6 +1449,32 @@ SCR_DrawLayout(void) // ---- +void +SCR_DrawSpeed(void) { + if (cl_showspeed->value < 1) + return; + float speed, speedxy; // speed, horizontal ground speed + GetPlayerSpeed(&speed, &speedxy); + + // Assuming viddef.width is the width of the screen + float scale = SCR_GetConsoleScale(); + char str[64]; + snprintf(str, sizeof(str), "Speed: %7.2f (%7.2f) QU/s", speed, speedxy); + + int yPos = 0; + // If showfps is on, position the speedometer underneath it + if (cl_showfps->value == 1 || cl_showfps->value == 2) + yPos = scale * 10; + if (cl_showfps->value > 2) + yPos = scale * 20; + + DrawStringScaled(viddef.width - scale * (strlen(str) * 8 + 2), yPos, str, scale); + //Unsure if these are necessary + SCR_AddDirtyPoint(viddef.width - scale * (strlen(str) * 8 + 2), yPos); + SCR_AddDirtyPoint(viddef.width, yPos); +} + + void SCR_Framecounter(void) { long long newtime; @@ -1684,6 +1712,7 @@ SCR_UpdateScreen(void) } SCR_Framecounter(); + SCR_DrawSpeed(); R_EndFrame(); } diff --git a/src/common/pmove.c b/src/common/pmove.c index 55bd330d..3447a1c1 100644 --- a/src/common/pmove.c +++ b/src/common/pmove.c @@ -341,6 +341,12 @@ PM_Friction(void) vel[2] = vel[2] * newspeed; } +//Used for speedoomter display. +void GetPlayerSpeed(float* speed, float* speedxy) { + *speedxy = sqrt(pml.velocity[0] * pml.velocity[0] + pml.velocity[1] * pml.velocity[1]); + *speed = VectorLength(pml.velocity); +} + /* * Handles user intended acceleration */ From 9cff22b55c73daa92ee2b91caaeb3af2c4300be5 Mon Sep 17 00:00:00 2001 From: Feels Duck Man Date: Sat, 2 Mar 2024 13:54:43 -0600 Subject: [PATCH 2/6] Removed 'Speed' label for speedometer when being displayed --- src/client/cl_screen.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/client/cl_screen.c b/src/client/cl_screen.c index 45f97fec..91839482 100644 --- a/src/client/cl_screen.c +++ b/src/client/cl_screen.c @@ -1456,10 +1456,9 @@ SCR_DrawSpeed(void) { float speed, speedxy; // speed, horizontal ground speed GetPlayerSpeed(&speed, &speedxy); - // Assuming viddef.width is the width of the screen float scale = SCR_GetConsoleScale(); char str[64]; - snprintf(str, sizeof(str), "Speed: %7.2f (%7.2f) QU/s", speed, speedxy); + snprintf(str, sizeof(str), "%6.2f (%6.2f) QU/s", speed, speedxy); int yPos = 0; // If showfps is on, position the speedometer underneath it @@ -1469,7 +1468,6 @@ SCR_DrawSpeed(void) { yPos = scale * 20; DrawStringScaled(viddef.width - scale * (strlen(str) * 8 + 2), yPos, str, scale); - //Unsure if these are necessary SCR_AddDirtyPoint(viddef.width - scale * (strlen(str) * 8 + 2), yPos); SCR_AddDirtyPoint(viddef.width, yPos); } From cf5b3687f2c9312d992e7278cde39bf5500c74eb Mon Sep 17 00:00:00 2001 From: Feels Duck Man Date: Sun, 10 Mar 2024 10:02:39 -0500 Subject: [PATCH 3/6] Added an option to draw speed under the crosshair with cl_showspeed 2, fixed drawing the speedometer when the game wasn't playing. --- src/client/cl_screen.c | 61 ++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/src/client/cl_screen.c b/src/client/cl_screen.c index 91839482..3bd9438f 100644 --- a/src/client/cl_screen.c +++ b/src/client/cl_screen.c @@ -1450,29 +1450,56 @@ SCR_DrawLayout(void) // ---- void -SCR_DrawSpeed(void) { - if (cl_showspeed->value < 1) +SCR_DrawSpeed(void) +{ + if (cl_showspeed->value < 1) //Disabled, do nothing return; - float speed, speedxy; // speed, horizontal ground speed - GetPlayerSpeed(&speed, &speedxy); + char spd_str[32]; + float speed, speedxy; float scale = SCR_GetConsoleScale(); - char str[64]; - snprintf(str, sizeof(str), "%6.2f (%6.2f) QU/s", speed, speedxy); + int str_len, xPos, yPos = 0; + + GetPlayerSpeed(&speed, &speedxy); + snprintf(spd_str, sizeof(spd_str), "%6.2f (%6.2f) QU/s", speed, speedxy); + str_len = scale * (strlen(spd_str) * 8 + 2); + + if (cl_showspeed->value == 1) //Draw speed and xy speed at top right + { + xPos = viddef.width - str_len; - int yPos = 0; - // If showfps is on, position the speedometer underneath it - if (cl_showfps->value == 1 || cl_showfps->value == 2) - yPos = scale * 10; - if (cl_showfps->value > 2) - yPos = scale * 20; + if (cl_showfps->value == 1 || cl_showfps->value == 2) // If showfps is enabled, draw it underneath + { + yPos = scale * 10; + } + else if (cl_showfps->value > 2) + { + yPos = scale * 20; + } - DrawStringScaled(viddef.width - scale * (strlen(str) * 8 + 2), yPos, str, scale); - SCR_AddDirtyPoint(viddef.width - scale * (strlen(str) * 8 + 2), yPos); - SCR_AddDirtyPoint(viddef.width, yPos); + DrawStringScaled(xPos, yPos, spd_str, scale); + SCR_AddDirtyPoint(xPos, yPos); + SCR_AddDirtyPoint(viddef.width, yPos); + } + + else if (cl_showspeed->value > 1) //Draw only xy speed under the crosshair + { + if (scale != 1) // Check if low resolution + { + scale -= 1; + } + + snprintf(spd_str, sizeof(spd_str), "%6.2f", speedxy); + str_len = scale * (strlen(spd_str) * 8 + 2); + yPos = scr_vrect.y + (scr_vrect.height / 2) + (scale * 10); + xPos = scr_vrect.x + (scr_vrect.width / 2) - (str_len / 2); + + DrawStringScaled(xPos, yPos, spd_str, scale); + SCR_AddDirtyPoint(xPos, yPos); + SCR_AddDirtyPoint(xPos + str_len, yPos); + } } - void SCR_Framecounter(void) { long long newtime; @@ -1674,6 +1701,7 @@ SCR_UpdateScreen(void) V_RenderView(separation[i]); SCR_DrawStats(); + SCR_DrawSpeed(); if (cl.frame.playerstate.stats[STAT_LAYOUTS] & 1) { @@ -1710,7 +1738,6 @@ SCR_UpdateScreen(void) } SCR_Framecounter(); - SCR_DrawSpeed(); R_EndFrame(); } From 72de1d45f8d6ca0f86379be65e59892402d9c71f Mon Sep 17 00:00:00 2001 From: apartfromtime <42292382+apartfromtime@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:11:47 +1100 Subject: [PATCH 4/6] Texture filtering options for OpenGL and Software video modes Add renderer specific menu options. --- src/client/menu/videomenu.c | 96 +++++++++++++++++++++++++++---------- 1 file changed, 72 insertions(+), 24 deletions(-) diff --git a/src/client/menu/videomenu.c b/src/client/menu/videomenu.c index ca76eddb..bbb3f652 100644 --- a/src/client/menu/videomenu.c +++ b/src/client/menu/videomenu.c @@ -182,17 +182,33 @@ ResetDefaults(void *unused) static void ApplyFilter(void* unused) { - if (s_filter_list.curvalue == 0) + if (Q_stricmp(vid_renderer->string, "gl3") == 0 || Q_stricmp(vid_renderer->string, "gles3") == 0 || + Q_stricmp(vid_renderer->string, "gl1") == 0) { - Cvar_Set("gl_texturemode", "GL_NEAREST"); + if (s_filter_list.curvalue == 0) + { + Cvar_Set("gl_texturemode", "GL_NEAREST"); + } + else if (s_filter_list.curvalue == 1) + { + Cvar_Set("gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST"); + } + else if (s_filter_list.curvalue == 2) + { + Cvar_Set("gl_texturemode", "GL_LINEAR_MIPMAP_LINEAR"); + } } - else if (s_filter_list.curvalue == 1) + + if (Q_stricmp(vid_renderer->string, "soft") == 0) { - Cvar_Set("gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST"); - } - else if (s_filter_list.curvalue == 2) - { - Cvar_Set("gl_texturemode", "GL_LINEAR_MIPMAP_LINEAR"); + if (s_filter_list.curvalue == 0) + { + Cvar_Set("sw_texture_filtering", "0"); + } + else if (s_filter_list.curvalue == 1) + { + Cvar_Set("sw_texture_filtering", "1"); + } } } @@ -397,6 +413,12 @@ VID_MenuInit(void) 0 }; + static const char *onoff_names[] = { + "off", + "on", + 0 + }; + static const char *yesno_names[] = { "no", "yes", @@ -692,29 +714,51 @@ VID_MenuInit(void) pow(2, s_msaa_list.curvalue) <= gl_msaa_samples->value); s_msaa_list.curvalue--; } - + s_filter_list.generic.type = MTYPE_SPINCONTROL; s_filter_list.generic.name = "texture filter"; - s_filter_list.generic.x = 0; - s_filter_list.generic.y = (y += 10); - s_filter_list.itemnames = filter_names; s_filter_list.curvalue = 0; s_filter_list.generic.callback = ApplyFilter; - const char* filter = Cvar_VariableString("gl_texturemode"); - int mode = 3; + const char* filter = NULL; + int mode = 0; + + if (Q_stricmp(vid_renderer->string, "gl3") == 0 || Q_stricmp(vid_renderer->string, "gles3") == 0 || + Q_stricmp(vid_renderer->string, "gl1") == 0) + { + s_filter_list.generic.x = 0; + s_filter_list.generic.y = (y += 10); + s_filter_list.itemnames = filter_names; + + filter = Cvar_VariableString("gl_texturemode"); + mode = 3; - if (Q_stricmp(filter, "GL_NEAREST") == 0) + if (Q_stricmp(filter, "GL_NEAREST") == 0) + { + mode = 0; + } + else if (Q_stricmp(filter, "GL_LINEAR_MIPMAP_NEAREST") == 0) + { + mode = 1; + } + else if (Q_stricmp(filter, "GL_LINEAR_MIPMAP_LINEAR") == 0) + { + mode = 2; + } + } + else if (Q_stricmp(vid_renderer->string, "soft") == 0) { + s_filter_list.generic.x = 0; + s_filter_list.generic.y = (y += 10); + s_filter_list.itemnames = onoff_names; + + filter = Cvar_VariableString("sw_texture_filtering"); mode = 0; - } - else if (Q_stricmp(filter, "GL_LINEAR_MIPMAP_NEAREST") == 0) - { - mode = 1; - } - else if (Q_stricmp(filter, "GL_LINEAR_MIPMAP_LINEAR") == 0) - { - mode = 2; + + if (Q_stricmp(filter, "1") == 0) + { + mode = 1; + } } s_filter_list.curvalue = mode; @@ -765,7 +809,11 @@ VID_MenuInit(void) Menu_AddItem(&s_opengl_menu, (void *)&s_vsync_list); Menu_AddItem(&s_opengl_menu, (void *)&s_af_list); Menu_AddItem(&s_opengl_menu, (void *)&s_msaa_list); - Menu_AddItem(&s_opengl_menu, (void *)&s_filter_list); + if (Q_stricmp(vid_renderer->string, "gl3") == 0 || Q_stricmp(vid_renderer->string, "gles3") == 0 || + Q_stricmp(vid_renderer->string, "gl1") == 0 || Q_stricmp(vid_renderer->string, "soft") == 0) + { + Menu_AddItem(&s_opengl_menu, (void *)&s_filter_list); + } Menu_AddItem(&s_opengl_menu, (void *)&s_defaults_action); Menu_AddItem(&s_opengl_menu, (void *)&s_apply_action); From 26194c76cfe7aa596bcddb9fa2d88519e125595b Mon Sep 17 00:00:00 2001 From: apartfromtime <42292382+apartfromtime@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:19:35 +1100 Subject: [PATCH 5/6] Fix software dithering Rounding view angles to degrees fixes undefined software texture filter behaviour. --- src/client/refresh/soft/sw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index 641e1cc9..47b738ce 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -1332,7 +1332,7 @@ RE_RenderFrame (refdef_t *fd) // compare current position with old if (vid_buffer_width <= 640 || !VectorCompareRound(fd->vieworg, lastvieworg) || - !VectorCompare(fd->viewangles, lastviewangles)) + !VectorCompareRound(fd->viewangles, lastviewangles)) { fastmoving = true; } From 086084b5076620b86b981848af4f39cea2227bd8 Mon Sep 17 00:00:00 2001 From: Feels Duck Man Date: Mon, 18 Mar 2024 21:13:27 -0500 Subject: [PATCH 6/6] Added documentation for 'cl_showspeed' in 040_cvarlist.md --- doc/040_cvarlist.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/040_cvarlist.md b/doc/040_cvarlist.md index 30fc1eee..64427688 100644 --- a/doc/040_cvarlist.md +++ b/doc/040_cvarlist.md @@ -142,7 +142,12 @@ Set `0` by default. * **cl_showfps**: Shows the framecounter. Set to `2` for more and to `3` for even more informations. - + +* **cl_showspeed**: Shows the players speed. Set to `1` to display both + overall speed and (horizontal speed) in Quake Units (QU) respectfully at + the top right corner of the screen. Set to `2` to show only the horizontal + speed under the crosshair. + * **cl_model_preview_start**: start frame value in multiplayer model preview. `-1` - don't show animation. Defaults to `84` for show salute animation.